OpenSSL摘要:在命令行和c ++中有不同的结果

时间:2014-10-27 15:31:05

标签: c++ command-line openssl digest

当我使用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

1 个答案:

答案 0 :(得分:0)

你处理读错了。使用此代码更改,哈希是正确的:

            int readlen;

            while ( (readlen = BIO_read(bio, buf, bufLength)) > 0)
            {
                EVP_DigestUpdate(ctx, buf, readlen);
            }

通常,您应该进行更多错误处理,以使代码更加健壮。

干杯,

/ErikAlapää