【问题标题】:How to change sink in Crypto++如何在 Crypto++ 中更改接收器
【发布时间】:2017-02-15 02:54:58
【问题描述】:

我正在使用 Crypto++ 解密文件,所以我使用 FileSource 作为我的源,但我希望能够更改接收器,所以我可以实现以下目标:

std::string temp;
FileSource file("/path/to/file", false, new StringSink(temp));
file.Pump(14);
if (temp != "File Signature")
    return false;
//change file's sink to new CTR_Mode<AES>::Decryption(meta_key, 32, meta_iv, new StringSink(metainfo))
file.Pump(256);
/* use metainfo */
//change file's sink to new CTR_Mode<AES>::Decryption(key, 32, iv, new StringSink(decoded))
while(!file.SourceExhausted())
{
    file.Pump(512);
    std::cout << decoded;
}

我怎样才能做到这一点?

【问题讨论】:

    标签: c++ crypto++


    【解决方案1】:

    如何在 Crypto++ 中更改接收器?

    Sink 只是一个没有附加转换的过滤器。要更改接收器,您只需更改前置对象或父对象的附加过滤器。棘手的部分是访问过滤器链中两到三个深度的过滤器。

    使用类似以下的内容。过滤器有两种附加过滤器的方法:AttachDetach。他们都在对象上附加了一个新的过滤器;但是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 也很有趣,它是用于流水线的基类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-29
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多