它是否等同于使用 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
在 执行解密和异或步骤之后。我不认为这对应于任何众所周知的密码模式,所以我在这里有点不知所措。
如果我用 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
在 执行解密和异或步骤之后。我不认为这对应于任何众所周知的密码模式,所以我在这里有点不知所措。