当我使用openssl-command-line计算文件的sha256-digest时,它与使用openssl-library在c ++中生成的摘要完全不同。
命令行:
openssl dgst -binary -sha256 MyFile.txt
C ++:
BIO* bio = BIO_new_file("MyFile.txt", "rb");
if (bio != NULL)
{
OpenSSL_add_all_digests();
const EVP_MD* md = EVP_sha256();
if (md != NULL)
{
EVP_MD_CTX* ctx = EVP_MD_CTX_create();
if (EVP_DigestInit_ex(ctx, md, NULL))
{
const int bufLength = 4096;
unsigned char buf[bufLength];
unsigned int len;
while (BIO_read(bio, buf, bufLength))
EVP_DigestUpdate(ctx, buf, bufLength);
unsigned char digest[EVP_MAX_MD_SIZE];
int ok = EVP_DigestFinal_ex(ctx, digest, &len); // ok == 1; digest in variable "digest" is totally different from the one calculated on command-line
}
EVP_MD_CTX_cleanup(ctx);
BIO_free_all(bio);
}
}
为什么通过c ++计算的摘要与在命令行上计算的摘要完全不同? (MyFile.txt中没有换行符或空格)
亲切的问候, 的Matthias答案 0 :(得分:0)
你处理读错了。使用此代码更改,哈希是正确的:
int readlen;
while ( (readlen = BIO_read(bio, buf, bufLength)) > 0)
{
EVP_DigestUpdate(ctx, buf, readlen);
}
通常,您应该进行更多错误处理,以使代码更加健壮。
干杯,
/ErikAlapää