1

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

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,但总的来说,我可能需要使用任何算法和任何填充。

4

2 回答 2

1

我将它分成块并将每个块传递给下面的方法

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

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

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

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

通过阻止和删除填充,您正在做StreamTransformationFilter(和朋友)的工作。

于 2013-10-02T06:42:59.843 回答
0

碰巧的是,我在这个问题的示例中偶尔发现了我需要的东西。感谢您的帮助,Gabriel L.,但我不想让我的方法根本不使用填充。抱歉解释不清楚,我想从解密数据中提取纯数据,其中包括填充符号。此代码中的粗体行显示了如何找出纯数据字节数。

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);
    int t = meter.GetTotalBytes(); //plain data bytes count
    dec.Resynchronize(&IV.front());
}
于 2013-10-02T08:41:52.977 回答