如果我用 8 个空字节初始化一个 IV。它使 block 大小等于 8(我认为),我可以使用 CBC 而不是 ECB 来编写这段代码吗?该代码是否等同于使用 CBC 模式?如果我使用 CBC,我们可以删除循环吗? key 长 16 个字节。我没有加密数据,我收到了。
BF_KEY key = {{0}};
BF_set_key(&key, 16, key_data);
const int block_size = 8;
unsigned char previous[block_size] = {0}, decrypted[block_size] = {0};
for (auto it = replay_data.begin(); it != replay_data.end(); it += block_size) {
BF_ecb_encrypt(reinterpret_cast<unsigned char*>(&(*it)), decrypted, &key, BF_DECRYPT);
std::transform(previous, previous + block_size, decrypted, decrypted, std::bit_xor<unsigned char>());
std::copy_n(decrypted, block_size, previous);
std::copy_n(decrypted, block_size, reinterpret_cast<unsigned char*>(&(*it)));
}
最佳答案
具有固定 IV 的 CBC 不等同于 ECB。
ECB 单独处理每个 block :
另一方面,CBC 有效地使用每个密文 block 作为下一个 block 的 IV:
假设我正确地阅读了代码,您的循环似乎正在与前一个 block 的明文而不是其密文执行异或运算,因为您正在从解密
到previous
after 执行解密和 XOR 步骤。我不认为这对应于任何众所周知的密码模式,所以我在这里有点不知所措。
关于c++ - 它是否等同于使用 null iv 执行 CBC 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36851896/