在 CodeIgniter 2.x 加密方法中,IV 存储在哪里?

In CodeIgniter 2.x Encryption Method, where is the IV stored?

我注意到我们应该在 Encrypting in CBC mode 时存储 IV (Initialization Vector)(例如将 IV 作为纯文本存储在数据库中的加密字符串旁边)

但是 CodeIgniter 的加密 Class 没有 return 任何 IV,它也没有存储在数据库或其他任何地方,它只需要一个 32 个字符的 $key 和 $string 并提供加密文本:

$msg = 'My message to encrypt';
$key = 'super-secret-key';

$encrypted_string = $this->encrypt->encode($msg, $key);

我的问题是

使用 CodeIgniter 的加密时 IV 会发生什么变化?

我问是因为如果它依赖于服务器或脚本或隐藏在某个地方,我们不能在没有 IV 的情况下在其他任何地方使用加密消息。

我查看了 code 并且至少对于版本 2.1.0,IV 只是简单地添加到密文之前。由于IV不应该是秘密的,而只是随机的(以确保语义安全),它可以明文发送。

CodeIgniter 还在 IV + 密文上实现了不寻常的 _add_cipher_noise() 函数,这完全改变了两者。这是一种简单的附加加密方法,可以隐藏IV,防止对密文第一块的中间人攻击。

通常的解决方法是验证IV+密文。 CodeIgniter 3 好像提供了一个function 给通过HKDF 导出的密文添加认证标签。