gpt4 book ai didi

c++ - 如何在使用 CryptoPP 解密流后执行 unpadding

转载 作者:太空宇宙 更新时间:2023-11-04 11:48:41 26 4
gpt4 key购买 nike

我有要解密的流。我将它分成 block 并将每个 block 传递给下面的方法。我需要解密的数据是按 16 字节的 block 加密的,如果最后一个 block 小于 16,那么其余所有字节都用填充填充。然后在解密的那一刻,我得到了我的最后一个 block 结果作为包含这些额外填充字节的值。考虑到可以使用不同的填充,如何确定原始数据的长度并仅返回它或确定填充字节并删除它们?

void SymmetricAlgorithm::Decrypt(byte* buffer, size_t dataBytesSize) {    
MeterFilter meter(new ArraySink(buffer, dataBytesSize));
CBC_Mode<CryptoPP::Rijndael>::Decryption dec(&Key.front(), Key.size(), &IV.front());
StreamTransformationFilter* filter = new StreamTransformationFilter(dec, new Redirector(meter), PKCS_PADDING);
ArraySource(buffer, dataBytesSize, true, filter);
dec.Resynchronize(&IV.front());
}

现在我正在尝试使用 PKCS_PADDING 和 Rijndael,但通常我可能需要使用任何算法和任何填充。

最佳答案

I divide it into blocks and pass each block to the method below

在这种情况下,您可以考虑直接调用 ProcessBlock:

CBC_Mode<Rijndael>::Decryption dec(...);

// Assume 'b' is a 16-byte block
dec.ProcessBlock(b);

该 block 已就地处理,因此具有破坏性。您还将负责处理最后一个 block ,包括删除填充。

通过阻止和删除填充,您正在执行 StreamTransformationFilter(和 friend )的工作。

关于c++ - 如何在使用 CryptoPP 解密流后执行 unpadding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19113633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com