我使用以下代码解密文件:
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(),则会得到以下异常: BufferedTransformation:此对象不允许输入
发布于 2016-03-02 01:49:46
如果我调用MessageEnd(),就会得到以下异常:MessageEnd
对,是这样。FileSource是一个源,消息必须存在。不能调用源上的Put或Put2向消息中添加其他数据。
我想你有两种选择来控制信号。
First
在Source上打电话给Source。
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 at 过滤器::冲水的注释。
第二
保存指向过滤器的指针并在其上调用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字节.
在我看来,如果在Flush上调用Source对您不起作用,那么这就是您应该解决的问题。
也要记住..。AuthenticatedEncryptionFilter的输出是2元组{ciphertext,mac},,因此您可以获得16字节的密文扩展。稍后,当您使用AuthenticatedDecryptionFilter,时,在验证它之后,mac就会被删除。因此,恢复的文本应该与纯文本大小相同,这两个文本都应该比密码文本少16字节。
我不太清楚的是,事情是否如预期的那样工作,但你没有意识到这就是它应该如何工作的方式。或者你真的在某个地方丢失了16字节的恢复文本。
https://stackoverflow.com/questions/35734114
复制相似问题