给定“字符串文件名”,如何使用C ++ Crypto ++库获取Adler32校验和。我对使用他们的Source and 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:Sample适用于所有Crypto ++(除了我想要的Adler32之外)
答案 0 :(得分:1)
如果您遵循此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
之后应包含所需的哈希值。
答案 1 :(得分:0)
..使用他们的Source and Sink系统有点困惑。
行。这个特殊的设计灵感来自Unix管道系统。如果您了解Unix管道以及doata如何流经它,那么您就能理解Crypto++ Pipeline。
例如,以下Unix命令:
cat somefile.bin | hexdump
将成为以下Crypto ++程序:
FileSource fs("somefile.bin", true /*pumpAll*/, new HexEncoder(new FileSink(cout)));
我有代码的骨架做MD5,但我需要代码......对于Adler32 ......
正如伊斯梅尔向你展示的那样简单:
Adler32 adler32;
string digest;
FileSource fs(filename.c_str(), true /*pumpAll*/,
new HashFilter(adler32,
new HexEncoder(
new StringSink(digest))));
但是这里的见解是:在Crypto ++中,数据从Sources流向Sinks。在它们之间,会遇到转换数据的Filters。
以上,您有两个过滤器:HashFilter和HexEncoder。所有过滤器都继承自BufferedTransformation
,因此它们都可以以一致的方式链接在一起。
Adler32
本身不是过滤器。但它继承自HashTransformation
,这就是HashFilter使用的内容。所以你可以交换任何基于HashFilter的对象,事情就可以了。
您可以在HashFilter找到基于HashTransformation Class Reference的对象列表。它们包括所有哈希值(如MD5,SHA和Whirlpool),Adler32和CRC32。