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

问题描述:

当我使用openssl命令行计算文件的sha256摘要时,它与使用openssl库生成的摘要完全不同。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++ calcuated完全不同的,比在命令行中计算出的一个? (MyFile.txt的没有换行符或空格),则它

亲切的问候, 马蒂亚斯

您处理读错了。有了这个codechange,哈希是正确的:

  int readlen; 

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

在一般情况下,你应该有更多的错误处理,使您的代码更健壮。

干杯,

/埃里克Alapää你的答案

+0

感谢,但这并没有工作=> readlen“总是” 1(当文件被读取到年底时除外) – Matthias 2014-10-28 10:32:12

+0

我也尝试用QT(QFile.readAll)读取文件,那里的散列值也不同于命令行 – Matthias 2014-10-28 10:39:25

+0

上计算的值。是的。你是否逐字复制了while子句?括号非常重要。当我读取我的测试文件时,它读取2次4096字节,然后是最后读取1655字节。十六进制哈希正好与命令行ssl哈希匹配。 – 2014-10-28 16:26:11