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

时间:2013-04-14 16:15:10

标签: c++ aes crypto++

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

#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;
}

1 个答案:

答案 0 :(得分:0)

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

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

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