1

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

4

2 回答 2

1

如果您遵循此http://www.cryptopp.com/wiki/HashFilter,则必须将 hashMD5 更改为 hashAdler32,将 file_md5_digest 更改为 file_adler32_digest

Adler32 hashAdler32;

FileSource( filename.c_str(), 
            true, 
            new HashFilter( hashAdler32, 
            new HexEncoder( new StringSink( file_adler32_digest ) ) ) );

在这之后file_adler32_digest应该包含所需的哈希。

于 2009-05-06T06:16:41.553 回答
0

.. 对使用他们的 Source 和 Sink 系统有点困惑。

好的。这种特殊的设计灵感来自 Unix 管道系统。如果您了解 Unix 管道以及 doata 如何在其中流动,那么您就会了解Crypto++ 管道

例如,以下 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。在这两者之间,它会遇到转换数据的过滤器。

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

Adler32本身不是过滤器。但它继承自HashTransformation,这就是HashFilter使用的。因此,您可以交换任何基于HashFilter的对象,并且一切正常。

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

于 2015-04-15T20:50:01.510 回答