Crypto ++“Tee”式过滤器

我正在处理基于某些条件的数据流。

Data is read from an input pipe, processed, and pushed down a Crypto++ CBC_Mode filter ending in a FileSink.

现在,我想对加密和文件存储之间的数据进行“窥探”,计算校验和。出于性能方面的原因,我想在流式传输,重新打开输出文件和计算散列总和之后做到这一点,这对于我的需要并不合理。

从我所看到的,缺少这个工作的是某种形式的“tee”过滤器。将数据链分成两个新链,一个用于存储到文件,另一个用于散列计算。

Crypto ++中有这样的功能吗?我是否可以自己实现这样的过滤器,如果有的话,是否有一些关于自定义Crypto ++过滤器需要的指南或示例?有没有其他方法可以即时计算校验和?

0
额外
意见: 1
谢谢你的提示。但是,AFAICT,它不支持生成签名,并且将数据流向前传送,是吗?
额外 作者 Rawler,
这听起来与 filter.cpp 中实现的 SignerFilter 非常相似。
额外 作者 Christopher Creutzig,
当你将构造函数的最后一个参数设置为 true 时,我相信它会这样。如果在其标志中给出 PUT_MESSAGE ,我认为 SignatureVerificationFilter 的相同方式将在 NextPutMultiple 之类的函数中将消息转发给某个进一步的过滤器,除了更新它的散列。但是我没有编写任何代码来测试它。
额外 作者 Christopher Creutzig,

1 答案

从我所看到的情况来看,缺少这项工作的是某种形式的“tee”过滤器。   ...   Crypto ++中有这样的功能吗?

是的,它叫做 ChannelSwitch 。以下内容来自 ChannelSwitch上的Crypto ++ wiki页面,并遵循魏岱使用该类的内容他的测试文件。

MD5 hashMD5;
HashFilter filterMD5(hashMD5);

SHA1 hashSHA1;
HashFilter filterSHA1(hashSHA1);

std::auto_ptr 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==
0
额外