我正在从事一个涉及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 ...对不起,我感谢你们调查
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] 删除。
我来说两句