c++ - Crypto++ "Tee"式过滤器

标签 c++ crypto++

我正在根据某些条件处理数据流。

数据从输入管道读取、处理并推送到 Crypto++ CBC_Mode<AES>FileSink 结尾的过滤器.

现在,我想“窥探”加密和文件存储之间流动的数据,计算校验和。出于性能原因,我想在流式传输时执行此操作,重新打开输出文件并在之后计算哈希和,这对我的需求来说是不合理的。

据我所知,要实现此功能,缺少的是某种形式的“tee”过滤器。将数据链分成两条新链,一条用于存储到文件,一条用于哈希计算。

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

最佳答案

From what I can see, what's missing for this to work, is some form of "tee" filter. ... Are there such functionality in 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==

关于c++ - Crypto++ "Tee"式过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10732926/

相关文章:

java - 在 Java 中使用 RSA 公钥加密数据并在 Crypto++ 中解密

c++ - 尝试使用 Crypto++ RSA 方案加密文件时崩溃

c++ - 带填充的 AES pkcs7 C++ 代码

C++ - 可变参数函数的多个参数包

c++ - 使用宏创建样板代码

c++ - C2440 'initialising' : Cannot convert int to unsigned char* in Microsoft VS 2010 utility file

c++ - 无法通过套接字验证消息 RSA 签名方案

c++ - 将 32 0/1 值打包到单个 32 位变量的位中的最快方法是什么?

c++ - 如何使用智能指针对象执行成员函数指针?

c++ - 如何将值分配给非类类型?