c++ AES如何逐块加密数据
C++ AES How to encrypt data block by block
AES的最大块大小为128,密钥大小为128,196 &256 .
我已经实现aes算法如下:
int main()
{
unsigned char key[KEY_128] = "very strong key";
unsigned char plaintext[16] = "this is a test";
unsigned char ciphertext[16];
unsigned char decptext[16];
aes_ctx_t *ctx;
virtualAES::Initialize();
ctx = virtualAES::AllocateCTX(key, sizeof(key));
virtualAES::Encrypt(ctx, plaintext, ciphertext);
cout << "encrypted: " << ciphertext << endl;
virtualAES::Encrypt(ctx, ciphertext, decptext);
cout << "decrypted: " << decptext << endl;
return 0;
}
但是我想加密大于128位的数据,例如512位长的字符串。我需要某种循环,将字符串分割成128位块,然后加密&再次加入他们,但我很难做到这一点。有人能举个例子吗?
我更熟悉c#,它通过System.Security.Cryptography命名空间公开了几种加密模式。然而,我知道密码块链是如何工作的。我将向您解释它,但请记住,它真的很容易搞砸加密,所以这只是信息,我希望您能找到一个库,做你需要做的事情。
使用密码块链(CBC),您可以这样做。把你的数据分成块大小。128位等于16字节,就是这样。如果最后一个块的字节数少于16个字节,则必须填充。我所知道的最常见的方法是PKCS7填充,这意味着例如,如果您在最后一个块的末尾需要3个字节的填充,您将添加0x03, 0x03, 0x03使其成为一个完整的块。
现在你已经准备好加密了。您应该有一个初始化向量(IV)作为开始。按位异或IV与您的第一个纯文本块。然后用通常加密单个数据块的方式加密结果(ECB模式)。结果是您的第一个密文块。但它也等价于你想加密的下一个区块的IV。按位与第二个块进行异或并加密。取这个加密的块,记录它,并将其与第三个块进行异或。等等。
这个过程使得完全相同的文本在一个文档中出现5次,每次出现时看起来都完全不同。所以它增加了更多的安全性。尽管如此,静脉注射完全不需要保密。密码和盐可以,iv不能。
相关文章:
- 加密在 Windows、C++ 和 Java 中传输中的数据
- 在 EAX 模式下加密数据时"program has stopped working"
- 我们是否可以使用 SEAL / PySEAL 库对加密数据执行除法操作Microsoft?
- 如何将加密数据从C 传输到Java
- 在一个应用中使用 AES 加密数据,并在另一个 C++ WinCrypt 中解密
- 使用Windows AES加密提供商在C 中解密C#加密数据
- 使用 libconfig 存储加密数据
- 如何在C++中加密数据并在PHP中解密
- 在libgcrypt的Crypto++中解密加密数据的步骤
- 使用 Boost::asio::async_send_to 发送加密数据时出错
- 使用 Win32/MFC 加密数据
- 将加密数据存储在控制台应用程序中
- 如何在C++中加密数据文件
- 在Java中使用RSA公钥加密数据,在Crypto++中解密
- Python的M2Crypto.EVP.Cipher无法使用C++加密数据
- 如何使用AES(openssl)加密数据
- OpenSSL:尝试使用通过握手获得的密钥材料来本地加密数据
- c++ AES如何逐块加密数据
- 生成大小不是16的倍数的加密数据
- 加密数据中的Null字符