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

OpenSSL digest: different results on command-line and in c++

本文关键字:结果 c++ 摘要 命令行 OpenSSL      更新时间:2023-10-16

当我用openssl命令行计算文件的sha256摘要时,它与用openssl库在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中没有换行符或空格)

您处理读取错误。有了这个代码更改,散列是正确的:

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

一般来说,您应该有更多的错误处理,以使代码更加健壮。