首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Crypto++异常调用messageEnd

Crypto++异常调用messageEnd
EN

Stack Overflow用户
提问于 2016-03-01 21:42:27
回答 1查看 436关注 0票数 1

我使用以下代码解密文件:

代码语言:javascript
复制
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:此对象不允许输入

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-02 01:49:46

如果我调用MessageEnd(),就会得到以下异常:MessageEnd

对,是这样。FileSource是一个源,消息必须存在。不能调用源上的PutPut2向消息中添加其他数据。

我想你有两种选择来控制信号。

First

Source上打电话给Source

代码语言:javascript
复制
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

代码语言:javascript
复制
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字节的恢复文本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35734114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档