2016-04-10 15 views
1

我開始使用crypto ++ lib,也許我有一些誤解。這個sha 256函數有什麼問題?

我不明白爲什麼下面的代碼會產生不好的SHA 256

# include <string> 
# include <iostream> 
# include "cryptopp/cryptlib.h" 
# include <cryptopp/sha.h> 
# include <cryptopp/hex.h> 

using namespace std; 

string sha256_hex(const string & str) 
{ 
    byte digest[CryptoPP::SHA256::DIGESTSIZE]; 
    CryptoPP::SHA256().CalculateDigest(digest, (byte*) &str[0], str.size()); 

    string ret; 
    CryptoPP::HexEncoder encoder; 
    encoder.Attach(new CryptoPP::StringSink(ret)); 
    encoder.Put(digest, sizeof(digest)); 
    encoder.MessageEnd(); 

    return ret; 
} 

int main(int argc, char *argv[]) 
{ 
    auto sha256 = sha256_hex(argv[1]); 
    cout << "str  = " << argv[1] << endl 
     << "sha 256 = " << sha256_hex(sha256) << endl; 

    return 0; 
} 

以下命令

./test-sha256 hello 

產生以下輸出

str  = hello 
sha 256 = DD9F20FF4F1DD817C567DE6C16915DC0A731A4DF51088F55CEF4CD2F89CF9620 

然而,根據本在線計算器enter link description here,正確的sha 256爲"hello" w應該是2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

所以我的問題是我做錯了什麼?

我還有一個問題:StringSink對象使用的內存應該何時釋放?

在此先感謝

回答

5

難道你不計算散列的哈希嗎?您撥打sha256_hex兩次,一次以argv[1]作爲參數,一次以sha256本身爲參數。

+0

omg!我意識到我的錯誤;抱歉。感謝你和其他人 – lrleon

1

最可能的是,我看到的問題是在這裏:

CryptoPP::SHA256().CalculateDigest(digest, (byte*) &str[0], str.size()); 

您更好的通str.c_str()。使用調試器來查看究竟傳遞了什麼 - 是否轉換爲hello

+0

@lrleon是的,使用調試器和添加打印語句,這是開發代碼的一部分。 SO不是你的調試器,它是你完成基本調試後的最後一招。 – zaph

+0

'&str [0]'和'str.c_str()'返回的值有什麼不同?當然,這不是C++標準保證的,但是你有沒有遇到過一個實現,那些表達式在語義上是不相同的?我不知道,爲什麼這個'答案'被提高了...... – IInspectable

+0

'&str [0]'是正確的,因爲它提供了一個非const指針。 'str.c_str()'提供了一個連續指針,並且寫入它是未定義的行爲。 – jww

2

至於問題的第二部分:

在加密++ Pipelining system,過濾器和接收器通過它們所連接的對象所擁有。它們被該對象的析構函數自動刪除。

而在ReadMe.txt從「重要使用注意事項」:

如果用於構造需要一個指針到對象B(除原語類型,如int和焦炭),則A擁有B和將刪除B在A的破壞。如果A的構造函數引用了對象B,則調用者保留B的所有權,並且不應該銷燬它,直到A不再需要它爲止。