gpt4 book ai didi

c++ - AES256 OFB 模式在 C/C++ 中获取 key 流

转载 作者:行者123 更新时间:2023-12-01 14:48:32 37 4
gpt4 key购买 nike

我正在做一个涉及 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 的工作原理如下:

首先,您生成一个块大小字节的 IV。

然后,您使用 AES key 加密此 IV。

此加密操作的结果用于通过 XOR 对第一个明文块进行加密。由于 XOR 是一种对称运算,因此相同的过程适用于将第一个密文块解密为明文。

此操作的结果进一步使用相同的 AES key 再次加密,用于加密下一个明文块(或解密下一个密文块)。重复此过程,直到整个数据被加密(解密)。

所以是的,在你的代码中

aes_encrypt(szIV, szKeystream1, ctx); // generate the first keystream
aes_encrypt(szKeystream1, szKeystream2, ctx); // to generate the second keystream

您生成两个适合 AES-ofb 的块。仍然缺少的是带有用于加密的明文块(或用于解密的密文块)的 XOR 操作。您可以为更大的数据块迭代该过程。
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/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com