c++ - 它是否等同于使用 null iv 执行 CBC 模式?

标签 c++ encryption blowfish

如果我用 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 :

enter image description here

另一方面,CBC 有效地使用每个密文 block 作为下一个 block 的 IV:

enter image description here

假设我正确地阅读了代码,您的循环似乎正在与前一个 block 的明文而不是其密文执行异或运算,因为您正在从解密previous after 执行解密和 XOR 步骤。我不认为这对应于任何众所周知的密码模式,所以我在这里有点不知所措。

关于c++ - 它是否等同于使用 null iv 执行 CBC 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36851896/

相关文章:

c++ - 如何将此 curl 命令转换为 libcurl

c++ - g++ 提示 constexpr 函数不是常量表达式

c++ - GCC 匿名未初始化

delphi - 使用 Delphi 组件加密文件并使用其他实用程序解密

java - perl Digest::MD5 md5($data) 和 java MessageDigest.getInstance ("MD5").digest($data) 的输出不同

algorithm - 给定一个排列的字典序号,是否有可能在 O(1) 中得到其中的任何项目

c++ - char字面差异?

mysql - blowFIsh 数据存储在 mysql 数据库中

c - Blowfish 图像算法

java - 如何最小化加密 token ?