【问题标题】:Inplace AES CBC/ECB mode encrypting/decrypting using Crypto++使用 Crypto++ 就地 AES CBC/ECB 模式加密/解密
【发布时间】:2013-04-06 17:49:59
【问题描述】:

在使用 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;
}

【问题讨论】:

    标签: c++ aes crypto++


    【解决方案1】:

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

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

    最后,旧的 Crypto++ FAQ 将其简要讨论为“在线处理”。见How do I use a block cipher in Crypto++ 4.x?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2012-12-28
      • 2014-02-06
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多