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

时间:2015-08-03 08:52:10

标签: c++ encryption cryptography aes

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位块,然后加密&amp;再加入他们,但我很难做到这一点。有人可以提供一个例子吗?

1 个答案:

答案 0 :(得分:0)

我更熟悉C#,它有几种通过System.Security.Cryptography命名空间公开的加密模式。但是我知道Cipher Block Chaining是如何工作的。我会向你解释一下,但请记住,加密加密非常容易,所以这只是信息性的,我希望你能找到一个可以完成你需要的库。

使用密码块链接(CBC)这就是你所做的。获取数据并将其分解为块大小。 128位是16字节,所以你去。如果最后一个块中的字节少于16个字节,则必须填充。我所知道的最常见的方法是PKCS7填充,这意味着,例如,如果在最后一个块的末尾需要3个字节的填充,则需要添加0x03,0x03,0x03以使其成为一个完整的块。

所以现在你准备加密了。你应该有一个初始化向量(IV)开始。用你的第一个纯文本块进行IV的按位异或。然后以通常加密单个数据块(ECB模式)的方式加密结果。结果是您的第一个密文块。但它也等同于您要加密的下一个块的IV。按位对第二个块进行异或并加密。获取该加密块,记录它,并使用它与第三个块进行XOR。等等。

这个过程使得出现完全相同的文本,比如文档中的5次,每次出现时都会看起来完全不同。因此它增加了更多安全性。尽管如此,IV根本不需要保密。没有密码和盐,IV没有。