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

标签 c++ c cryptography aes

我正在开发一个涉及 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/

相关文章:

java - 创建和验证签名数据时出错

c++ - 可变模板函数重载失败

c - 缩进 C 代码,Unix

c - 为什么输出是1?

javascript - Javascript random 从哪里获取它的熵?

java - java中从文件中获取私钥

c++ - 以不同方式替换每个项目,regex c++

使用类、getline 和 stringstream 进行解析的 C++ 练习

c++ - 使用 qt 的多客户端/服务器 tcp 应用程序

c++ - 使用 n[c -'0' ] 的真正用途是什么?