2016-03-01 60 views
1

我用下面的代码来解密文件:加密++异常调用messageEnd

FileSource fe(fileUrl.c_str(), false, 
        new AuthenticatedDecryptionFilter(decryptor, new FileSink(
          std::string(fileUrl).c_str()), CryptoPP::AuthenticatedDecryptionFilter::THROW_EXCEPTION | CryptoPP::AuthenticatedDecryptionFilter::MAC_AT_END)); 

     size_t BLOCK_SIZE = 16384; 
    while (remaining && !fe.SourceExhausted()) { 
     const unsigned int req = STDMIN(remaining, BLOCK_SIZE); 
     fe.Pump(req); 
     fe.Flush(false); 

     remaining -= req; 
    } 
    fe.MessageEnd(); 

如果我尝试这样做没有fe.MessageEnd(),我的解密文件是16个字节短。所以我想我需要调用MessageEnd()来解决这个问题。 但如果我叫MessageEnd()我得到Follwing异常:BufferedTransformation:此对象不允许输入

回答

1

如果我叫MessageEnd()我得到Follwing例外:BufferedTransformation: this object doesn't allow input ...

正确。 FileSource是来源,并且该消息必须存在。您不能在来源上致电PutPut2以将其他数据添加到消息中。


我想你有两个选择来对信号进行更多的控制。

Source首先

呼叫Flush

const int opts = AuthenticatedDecryptionFilter::THROW_EXCEPTION | 
    AuthenticatedDecryptionFilter::MAC_AT_END; 

FileSource fe(fileUrl.c_str(), false, 
    new AuthenticatedDecryptionFilter(decryptor, new FileSink(
     std::string(fileUrl).c_str()), opts)); 

fe.Flush(true); 

另请参见Flush的评论在Filter::Flush的说明书中无。

藏匿的指针过滤器和调用它MessageEnd

const int opts = AuthenticatedDecryptionFilter::THROW_EXCEPTION | 
    AuthenticatedDecryptionFilter::MAC_AT_END; 
AuthenticatedDecryptionFilter* adf = NULL; 

FileSource fe(fileUrl.c_str(), false, 
    adf = new AuthenticatedDecryptionFilter(decryptor, new FileSink(
     std::string(fileUrl).c_str()), opts)); 
adf.MessageEnd(); 

这是一种不寻常的,所以我不知道你会遇到什么副作用。

不要删除指针。 FileSource将在结束大括号超出范围时将其删除。


...我的解密文件是16个字节的短...

在我看来,这是如果在Source呼吁Flush不为你工作,你应该追求的问题。

还要记住...的AuthenticatedEncryptionFilter输出为2元组{ciphertext,mac},所以你得到的16个字节,因为MAC的密文扩张。稍后,当您使用AuthenticatedDecryptionFilter时,mac验证后将被删除。所以恢复的文本应该与纯文本大小相同,两者都应该比密文小16个字节。

我不清楚的事情是,事情按预期工作,但你不知道它应该如何工作。或者你真的在某处丢失了16字节的恢复文本。

+0

我在末尾丢失了16个字节的明文。稍后我会研究你的选择。 – Ben

+0

感谢您的回答,您使用fe.Flush(true)的第一个选项似乎工作正常。 – Ben