3

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

#include <cstdio>
#include <cassert>
#include "cryptopp\rsa.h"
#include "cryptopp\rijndael.h"
#include "cryptopp\modes.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("%s\n", static_cast<char*>(buffer));
    delete buffer;
}
4

1 回答 1

0

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

您还必须小心重叠,但如何陷入困境取决于密码。例如,AESinCBC_Mode对 16 字节块进行操作(感兴趣的函数是ProcessBlockProcessXorBlock和朋友)。只要指针之间的差异为 17 个字节(或更多),就可以使用重叠缓冲区。在 RSA 情况下,您可能需要不同的MaxPreImage大小,这取决于模数的大小。

最后,旧的 Crypto++ FAQ 将其简要讨论为“在线处理”。请参阅如何在 Crypto++ 4.x 中使用分组密码?

于 2013-10-03T06:16:08.250 回答