使用Crypto++加密/解密AES CBC/ECB模式
Inplace AES CBC/ECB mode encrypting/decrypting using Crypto++
使用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中使用分组密码?
相关文章:
- 如何通过命令行工具在 COIN-OR Cbc 中设置超时?
- AES ECB已知文本攻击
- aes cbc反向加密
- QT:AES-256-CBC 根据 PHP 代码在C++中加密/解密
- 牡丹AES CBC PKCS7加密解密
- AES 256-cbc 加密C++使用 OpenSSL
- 使用 AES-256 CBC 加密文本文件
- AES CBC 128 bit encryption -OpenSSL
- 使用公钥 X509 V3 (PKCS7) 使用 AES 128 模式 cbc 加密文件
- 硬币或CBC求解器性能:命令行实用程序与编译的C 程序
- AES-128 CBC 模式下加密流末尾的加密 ++ 额外块
- OPENSSL Blowfish CBC加密与PHP不同,C++
- 在窗口中将 AES CBC 与 NCrypt 一起使用
- 如何通过AES-256-CBC使用密码代替密钥和IV加密文件
- 如何使用加密API进行AES CBC加密
- 可视化解密 AES-196-ECB 文件 在C++,尝试加密文件,但在解密时无法恢复文件
- AES CBC 加密/解密仅解密前 16 个字节
- 是否有可能从AES-CBC的cphertext中找出原始数据的长度
- 在mbed微控制器(c++)上加密AES128-CBC,并在nodejs中解密AES128-CBC
- 使用Crypto++加密/解密AES CBC/ECB模式