我正在根据某些条件处理数据流。
从输入管道读取数据,处理并按下以CBC_Mode<AES>
结尾的Crypto ++ FileSink
过滤器。
现在,我想“窥探”加密和文件存储之间的数据,计算校验和。出于性能原因,我想在流式传输,重新打开输出文件和计算哈希值之后这样做是不合理的。
从我所看到的,为此工作缺少的是某种形式的“T恤”过滤器。将数据链分成两个新链的东西,一个用于存储到文件,一个链用于哈希计算。
Crypto ++中是否有这样的功能?我可以自己实现这样的过滤器,如果是这样,是否有一些关于自定义Crypto ++过滤器需要什么的指南或示例?还有其他方法可以动态计算校验和吗?
答案 0 :(得分:3)
从我所看到的,为此工作缺少的是某种形式的“T恤”过滤器。 ... Crypto ++中是否有这样的功能?
是的,它被称为ChannelSwitch
。以下是来自Crypto++ wiki page on ChannelSwitch,它跟随Wei Dai在他的测试文件中使用该类。
MD5 hashMD5;
HashFilter filterMD5(hashMD5);
SHA1 hashSHA1;
HashFilter filterSHA1(hashSHA1);
std::auto_ptr<ChannelSwitch> channel( new ChannelSwitch );
channel->AddDefaultRoute(filterMD5);
channel->AddDefaultRoute(filterSHA1);
StringSource ss( "abcdefghijklmnopqrstuvwxyz", true, channel.release());
string digest;
HexEncoder encoder( new StringSink( digest ), true /* uppercase */ );
filterMD5.TransferTo( encoder );
cout << filterMD5.AlgorithmName() << ": " << digest << endl;
digest.erase();
filterSHA1.TransferTo( encoder );
cout << filterSHA1.AlgorithmName() << ": " << digest << endl;
digest.erase();
以下是上述示例的输出:
$ ./cryptopp-test.exe
MD5: C3FCD3D76192E4007DFB496CCA67E13B
SHA-1: 32D10C7B8CF96570CA04CE37F2A19D84240D3A89
这是另一个使用不同接收器的示例,可能更容易理解:
byte data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
string e1, e2, e3;
HexEncoder r1(new StringSink(e1));
Base32Encoder r2(new StringSink(e2));
Base64Encoder r3(new StringSink(e3));
ChannelSwitch chsw;
chsw.AddDefaultRoute(r1);
chsw.AddDefaultRoute(r2);
chsw.AddDefaultRoute(r3);
chsw.Put(data, sizeof(data));
chsw.MessageEnd();
cout << e1 << endl;
cout << e2 << endl;
cout << e3 << endl;
以下是示例的输出:
$ ./cryptopp-test.exe
0102030405060708090A
AEBAGBAFA2DSSCIK
AQIDBAUGBwgJCg==