如何在 Crypto++ 中更改接收器?
Sink 只是一个没有附加转换的过滤器。要更改接收器,您只需更改前置对象或父对象的附加过滤器。棘手的部分是访问过滤器链中两到三个深度的过滤器。
使用类似以下的内容。过滤器有两种附加过滤器的方法:Attach 和Detach。他们都在对象上附加了一个新的过滤器;但是Attach 会返回旧过滤器,而Detach 则免费。
另一个奇怪的是Redirector。您可以使用它来打破链中的所有权。 StreamTransformationFilter filter 需要它。基于堆栈的分配将作为局部变量释放,因此您也不希望它作为链的一部分释放。
FileSource file("/path/to/file", false, new StringSink(temp));
file.Pump(14);
if (temp != "File Signature")
return false;
CTR_Mode<AES>::Decryption decryptor;
StreamTransformationFilter filter(decryptor);
// Detach StringSink(temp), Attach StreamTransformationFilter(decryptor)
file.Detach(new Redirector(filter));
// Set Key and IV
decryptor.SetKeyWithIV(meta_key, 32, meta_iv);
// Detach nothing, Attach StringSink(metainfo)
filter.Detach(new StringSink(metainfo));
// FileSource → decryptor → metainfo
file.Pump(256);
// Set Key and IV
decryptor.SetKeyWithIV(key, 32, iv);
// Detach StringSink(metainfo), Attach StringSink(decoded)
filter.Detach(new StringSink(decoded));
while(!file.SourceExhausted())
{
// FileSource → decryptor → decoded
file.Pump(512);
std::cout << decoded;
}
这是不使用Redirector 的另一种方法。它隐藏了一个指向StreamTransformationFilter的指针:
FileSource file("/path/to/file", false, new StringSink(temp));
file.Pump(14);
if (temp != "File Signature")
return false;
CTR_Mode<AES>::Decryption decryptor;
StreamTransformationFilter* filter = NULL;
// Detach StringSink(temp), Attach StreamTransformationFilter(decryptor)
file.Detach(filter = new StreamTransformationFilter(decryptor));
// Set Key and IV
decryptor.SetKeyWithIV(meta_key, 32, meta_iv);
// Detach nothing, Attach StringSink(metainfo)
filter->Detach(new StringSink(metainfo));
// FileSource → decryptor → metainfo
file.Pump(256);
// Set Key and IV
decryptor.SetKeyWithIV(key, 32, iv);
// Detach StringSink(metainfo), Attach StringSink(decoded)
filter->Detach(new StringSink(decoded));
while(!file.SourceExhausted())
{
// FileSource → decryptor → decoded
file.Pump(512);
std::cout << decoded;
}
您可能对 Crypto++ wiki 上的 Pipelining 感兴趣。 BufferedTransformation 也很有趣,它是用于流水线的基类。