2014-10-27 124 views
0

當我使用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的沒有換行符或空格),則它

親切的問候, 馬蒂亞斯

回答

0

您處理讀錯了。有了這個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

相關問題