给定文件名,如何使用Crypto ++获取Adler32

时间:2009-05-06 01:15:45

标签: c++ hash md5 crypto++ adler32

给定“字符串文件名”,如何使用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之外)

2 个答案:

答案 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

以上,您有两个过滤器:HashFilterHexEncoder。所有过滤器都继承自BufferedTransformation,因此它们都可以以一致的方式链接在一起。

Adler32本身不是过滤器。但它继承自HashTransformation,这就是HashFilter使用的内容。所以你可以交换任何基于HashFilter的对象,事情就可以了。

您可以在HashFilter找到基于HashTransformation Class Reference的对象列表。它们包括所有哈希值(如MD5,SHA和Whirlpool),Adler32和CRC32。