【问题标题】:OpenSSL digest: different results on command-line and in c++OpenSSL 摘要:命令行和 C++ 中的不同结果
【发布时间】:2014-10-28 16:07:48
【问题描述】:

当我使用 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 中没有换行符或空格)

亲切的问候, 马蒂亚斯

【问题讨论】:

    标签: c++ command-line openssl digest


    【解决方案1】:

    你处理错误。通过此代码更改,哈希是正确的:

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

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

    干杯,

    /埃里克·阿拉帕

    【讨论】:

    • 感谢您的回答,但这不起作用 =>readlen “始终”为 1(除非文件被读到最后)
    • 我也试过用 QT (QFile.readAll) 读取文件,这里的哈希值也与命令行计算的不同
    • 是的,它有效。您是否逐字复制了while子句?括号很重要。当我读取我的测试文件时,它读取了 2 次 4096 字节,最后一次读取了 1655 字节。并且十六进制哈希与命令行 ssl 哈希完全匹配。
    • 谢谢,将二进制哈希转换为十六进制时,它们是相同的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多