2016-04-10 17 views
1

私はcrypto ++ libを使い始めていますが、多分誤解があります。このsha 256関数で何が問題になっていますか?

私は、次のコードは、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; 
} 

悪いSHAを生成する理由は、次のコマンド

./test-sha256 hello 

は、しかしこれに応じて、以下の出力

str  = hello 
sha 256 = DD9F20FF4F1DD817C567DE6C16915DC0A731A4DF51088F55CEF4CD2F89CF9620 

を生成気付いていませんオンライン計算機enter link description here"hello"の正しいsha126 odordは2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824です。

私の質問は何ですか?

さらに質問があります:StringSinkオブジェクトが使用するメモリをいつ、どのように解放する必要がありますか?事前

答えて

5

ここでハッシュのハッシュを計算していませんか? sha256_hexを2回、argv[1]を引数として1回、sha256を引数として1回呼び出します。質問の後半部分については

+0

mg!私は間違いを認識します。ごめんなさい。あなたと他の人のおかげで – lrleon

1

おかげでおそらく、私はこの問題は、ここで参照してください。

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

方が良いstr.c_str()を渡します。デバッガを使用して、正確に何が渡されているかを確認します。helloに変換されますか?

+0

@lleleはい、デバッガを使用してください。また、開発コードの一部であるprintステートメントを追加してください。あなたはデバッガではありません、それは基本的なデバッグを行った後の最後の手段です。 – zaph

+0

'&str [0]'と 'str.c_str() 'から返される値はどう違うのですか?確かに、これはC++標準では保証されていませんが、それらの表現が意味的に同一ではない実装を見つけたことがありますか?私は考えていない、なぜこの '答え'がupvoted .... – IInspectable

+0

'&str [0]'は非constポインタを提供するので正しい。 'str.c_str()'はcontポインタを提供し、それへの書き込みは未定義の動作です。 – jww

2

:暗号で

++ Pipelining systemは、フィルターやシンクはそれらが結合されているオブジェクトによって所有されています。それらは、そのオブジェクトのデストラクタによって自動的に削除されます。

そしてReadMe.txtで「重要な使用上の注意」から:

Aのコンストラクタは(intやcharとしてプリミティブ型を除く)、オブジェクトBへのポインタを取る場合は、AがBを所有し、削除しますAの破壊時のB。 AのコンストラクターがオブジェクトBへの参照を取得した場合、呼び出し元はBの所有権を保持し、Aがそれを必要としなくなるまでそれを破棄してはなりません。

関連する問題