ファイル名を指定して、Crypto ++を使用してAdler32を取得するにはどうすればよいですか
質問
" string filename"を指定すると、C ++ Crypto ++ライブラリを使用してAdler32チェックサムを取得できます。 SourceおよびSinkシステムの使用について少し混乱しています。
以下にMD5を実行するコードのスケルトンがありますが、Adler32の使用法に関する例やチュートリアルは見つかりません。
string filename = "/tmp/data.txt"
string file_adler32_digest;
string file_md5_digest;
MD5 hashMD5;
FileSource fs( filename.c_str(),
true,
new HashFilter( hashMD5,
new HexEncoder( new StringSink( file_md5_digest ) ) ) );
/* Confusion begins here */
//how do I do the adler32 ?
/* Confusion ends here */
cout << file_adler32_digest << endl
<< file_md5_digest << endl;
こちらの良いサンプルとサンプルコード http://www.cryptopp.com/wiki/Category :すべてのCrypto ++のサンプル(必要なAdler32のものを除く)
解決
この http://www.cryptopp.com/wiki/HashFilter に従う場合、hashAdler32のhashMD5、file_adler32_digestのfile_md5_digestを変更する必要があります
Adler32 hashAdler32;
FileSource( filename.c_str(),
true,
new HashFilter( hashAdler32,
new HexEncoder( new StringSink( file_adler32_digest ) ) ) );
この後、 file_adler32_digest
に目的のハッシュを含める必要があります。
他のヒント
.. SourceおよびSinkシステムの使用について少し混乱しています。
OK。その特定の設計は、Unixパイプシステムに触発されています。 Unixパイプとdoataがどのように流れるかを理解していれば、 Crypto ++ Pipeline を理解できます。
たとえば、次のUnixコマンド:
cat somefile.bin | hexdump
次のCrypto ++プログラムになります。
FileSource fs("somefile.bin", true /*pumpAll*/, new HexEncoder(new FileSink(cout)));
MD5を実行するコードのスケルトンはありますが、Adler32には...コードが必要です...
Ismaelが示したように、それは次のように簡単です:
Adler32 adler32;
string digest;
FileSource fs(filename.c_str(), true /*pumpAll*/,
new HashFilter(adler32,
new HexEncoder(
new StringSink(digest))));
しかし、ここに洞察があります:Crypto ++では、データはソースからシンク。その間に、データを変換するフィルターに遭遇します。
上記には、2つのフィルターがあります: HashFilter と HexEncoder 。すべてのフィルターは BufferedTransformation
を継承するため、すべてをチェーン化できます。一貫した方法で一緒に。
Adler32
自体はフィルターではありません。しかし、 HashTransformation
を継承し、それが HashFilter が使用します。そのため、任意の HashFilter ベースのオブジェクトにスワップでき、物事は機能します。
HashFilter ベースのオブジェクトのリストは、 HashTransformationクラスリファレンス。それらにはすべてのハッシュ(MD5、SHA、ワールプールなど)、Adler32、CRC32が含まれます。