AES256 OFB模式在C / C ++中获得密钥流

Lex L

我正在从事一个涉及AES256 OFB模式的项目。另外,我正在使用Brian Gladman的AES库中的库我的问题是:如何生成密钥流?我的理解是,我有一个初始向量。我们将对IV进行加密以获得密钥流,然后再次对密钥流进行加密以生成后续的密钥流,依此类推。我有以下代码,但似乎无法获得正确的密钥流。

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

编辑:原来我的钥匙有错字... 0xA8应该是0xAB ...对不起,我感谢你们调查

Ctx

OFB的工作方式如下:

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

然后,您使用AES密钥对此IV进行加密。

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

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

是的,在您的代码中

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);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章