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

Is it the equivalent of doing CBC mode with a null iv?

如果我用 8 个空字节初始化一个 IV。它使块大小等于 8(我认为),我可以使用 CBC 而不是 ECB 来编写这段代码吗?该代码是否等同于使用 CBC 模式?如果我使用 CBC,我们可以删除循环吗?密钥长 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 单独处理每个块:

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

假设我正确地阅读了代码,你的循环似乎正在与前一个块的 plaintext 而不是它的 ciphertext[=29 执行 XOR 操作=],因为您正在从 decrypted 复制到 previous 执行解密和异或步骤之后。我不认为这对应于任何众所周知的密码模式,所以我在这里有点不知所措。