给定“字符串文件名”,如何使用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 :所有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 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 ++中,数据从来源流向 Sinks 。在这两者之间,它将遇到转换数据的过滤器

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

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

您可以在基于HashFilter 的对象列表/www.cryptopp.com/docs/ref/class_hash_transformation.html“rel =”nofollow“> HashTransformation类参考。它们包括所有哈希值(如MD5,SHA和Whirlpool),Adler32和CRC32。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top