我正在开发一个涉及 AES256 OFB 模式的项目。另外,我正在使用 Brian Gladman 中的 AES 库中的库。 。我的问题是:如何生成 key 流?我的理解是我有一个初始 vector 。我们将加密 IV 以获得 key 流,然后再次加密 key 流以生成后续 key 流,依此类推。我有以下代码,但我似乎无法获得正确的 key 流。
unsigned char szKey[32] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x45, 0x67, 0x89, 0xA8, 0xCD, 0xEF, 0x01, 0x23, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45 };
unsigned char szIV[16] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x6f, 0xe2, 0x80, 0x2a, 0xa4, 0x03, 0x82, 0x8b };
unsigned char szKeystream1[16];
unsigned char szKeystream2[16];
aes_init();
aes_encrypt_ctx ctx[1];
aes_encrypt_key(szKey, 32, ctx);
aes_encrypt(szIV, szKeystream1, ctx); // generate the first keystream
aes_encrypt(szKeystream1, szKeystream2, ctx); // to generate the second keystream
编辑:原来我的 key 中有一个拼写错误... 0xA8 应该是 0xAB... 抱歉,我感谢你们调查它
最佳答案
OFB 的工作原理如下:
首先,生成一个 block 大小字节的 IV。
然后,您使用 AES key 加密该 IV。
此加密操作的结果用于通过异或来加密第一个明文 block 。由于 XOR 是对称运算,因此相同的过程适用于将第一个密文 block 解密为明文。
此操作的结果会使用相同的 AES key 再次加密,以加密下一个明文 block (或解密下一个密文 block )。这个过程不断迭代,直到整个数据被加密(解密)。
所以是的,在你的代码中
aes_encrypt(szIV, szKeystream1, ctx); // generate the first keystream
aes_encrypt(szKeystream1, szKeystream2, ctx); // to generate the second keystream
您生成了两个适合 AES-ofb 的 block 。仍然缺少的是带有用于加密的明文 block (或用于解密的密文 block )的异或运算。您可以针对更大的数据 block 迭代该过程。
char data[DATALEN];
aes_encrypt(szIV, szKeystream1, ctx); // generate the first xor block
for (int i = 0; i < DATALEN; i += AES_BLOCK_LENGTH) {
for (int j = 0; j < AES_BLOCK_LENGTH; j++) {
data[i+j] ^= szKeystream1[j];
}
aes_encrypt(szKeystream1, szKeystream2, ctx); // generate next block
memcpy(szKeystream1, szKeystream2, sizeof(szKeystream1);
}
关于c++ - AES256 OFB 模式在 C/C++ 中获取 key 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60626854/