如何散列比16kB更大的文本文件?

时间:2015-04-15 19:52:55

标签: c++ hash cryptography crypto++

我正在使用Crypto ++库进行散列。如何散列大于16kB(字符串大小)的文件?我想要至少像1Mb这样的哈希文件。

我得到的错误是文本大于16kB时的错误:

error C2026: string too big, trailing characters truncated

以下是我正在使用的代码:

std::string hash;
CryptoPP::SHA512 sha;

CryptoPP::StringSource ss(source, true,
                          new CryptoPP::HashFilter(sha,
                              new CryptoPP::HexEncoder(
                                  new CryptoPP::StringSink(hash))));

cout << "SHA-512 hash: " << hash << endl;

1 个答案:

答案 0 :(得分:1)

  

当我使用Crypto ++库进行哈希时,如何散列大于16kB(字符串大小)的文件?我想要至少像1Mb这样的哈希文件。

你应该做两件事之一。首先,使用FileSource而不是StringSource。类似的东西:

string s1, s2, s3, s4;
SHA1 sha1; SHA224 sha224; SHA256 sha256; SHA512 sha512;

HashFilter f1(sha1, new HexEncoder(new StringSink(s1)));
HashFilter f2(sha224, new HexEncoder(new StringSink(s2)));
HashFilter f3(sha256, new HexEncoder(new StringSink(s3)));
HashFilter f4(sha512, new HexEncoder(new StringSink(s4)));

ChannelSwitch cs;
cs.AddDefaultRoute(f1);
cs.AddDefaultRoute(f2);
cs.AddDefaultRoute(f3);
cs.AddDefaultRoute(f4);

FileSource fs("filename.xxx", true /*pumpAll*/, new Redirector(cs));

cout << Message: " << message << endl;
cout << "SHA-1: " << s1 << endl;
cout << "SHA-224: " << s2 << endl;
cout << "SHA-256: " << s3 << endl;
cout << "SHA-512: " << s4 << endl;

一般来说,你可以交换任何Crypto++ Source,但事情就会奏效。

其次,您可以将文件视图映射到流程中,然后在循环中重复调用Put。完成文件中所有数据的使用后,请调用MessageEnd,然后取消映射文件。您在上面的Put上致电MessageEndChannelSwitch,因为感兴趣的是BufferedTransformation

在Windows上,使用MapViewOfFile映射文件的视图。在Linux上,您使用mmap(2)

映射文件视图时,您将有效地拥有磁盘支持的内存中字节数组。在这种情况下,您可以使用ArraySource代替StringSourceFileSource