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

AES256 OFB mode getting keystream in C/C++

我正在做一个涉及 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是一个对称运算,同样的过程也适用于将第一个密文块解密为明文。

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

所以是的,在您的代码中

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

你生成了两个适合 AES-ofb 的块。仍然缺少的是与用于加密的明文块(或用于解密的密文块)的异或运算。您可以针对更大的数据块重复该过程。

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