使用Crypto++加密/解密AES CBC/ECB模式

Inplace AES CBC/ECB mode encrypting/decrypting using Crypto++

本文关键字:CBC ECB 模式 AES 解密 Crypto++ 加密 使用      更新时间:2023-10-16

使用Crypto++在CBC和ECB模式下执行AES加密/解密(假设缓冲区大小足以容纳加密数据)时,是否明确允许对明文/密文使用相同的缓冲区,如以下代码:

#include <cstdio>
#include <cassert>
#include "cryptopprsa.h"
#include "cryptopprijndael.h"
#include "cryptoppmodes.h"
int main()
{
    using namespace CryptoPP;
    byte key[32], iv[Rijndael::BLOCKSIZE];
    char testdata[] = "Crypto++ Test"; // any data can be here
    size_t buffer_size = (sizeof(testdata) + Rijndael::BLOCKSIZE) & ~(Rijndael::BLOCKSIZE - 1);
    byte* buffer = new byte[buffer_size];
    memcpy(buffer, testdata, sizeof(testdata));
    // encrypt data inplace
    CBC_Mode<Rijndael>::Encryption enc(key, sizeof(key), iv);
    MeterFilter meter(new ArraySink(buffer, buffer_size));
    ArraySource(buffer, sizeof(testdata), true, new StreamTransformationFilter(enc, new Redirector(meter), BlockPaddingSchemeDef::PKCS_PADDING));
    assert(meter.GetTotalBytes() == buffer_size);
    // decrypt data inplace
    CBC_Mode<Rijndael>::Decryption dec(key, sizeof(key), iv);
    MeterFilter meter2(new ArraySink(buffer, buffer_size));
    ArraySource(buffer, buffer_size, true, new StreamTransformationFilter(dec, new Redirector(meter2), BlockPaddingSchemeDef::PKCS_PADDING));
    assert(meter2.GetTotalBytes() == sizeof(testdata));
    printf("%sn", static_cast<char*>(buffer));
    delete buffer;
}

一般来说,crypto++缓冲区可以是相同的,也可以是不同的。对于纯文本或密文数据的就地或原位处理,我想不出一种不允许它们相同的情况。唯一需要注意的是,缓冲区必须足够大,才能进行密文扩展。

你也必须小心重叠,但你如何陷入麻烦取决于密码。例如,CBC_Mode中的AES操作在16字节块上(感兴趣的函数是ProcessBlock, ProcessXorBlock和友元)。只要指针之间的差异为17字节(或更多),就可以使用重叠缓冲区。在RSA的情况下,您可能需要MaxPreImage大小的差异,这是基于模数的大小。

最后,旧的crypto++ FAQ将其简要地讨论为"内联处理"。参见如何在Crypto++ 4.x中使用分组密码?