c++ AES如何逐块加密数据

C++ AES How to encrypt data block by block

本文关键字:加密 数据 何逐块 AES c++      更新时间:2023-10-16

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不能。