首先,没有“没有 IV”的 CTR 或 CBC 这样的东西。您可能只是使用全零作为 IV。总有一个 IV。(CTR 称其 IV 为 nonce。)
CTR 绝不能重用 nonce+Key 对。它可以完全破坏加密。这是避免点击率的主要原因,除非您知道自己在做什么。它很难正确使用并且具有可怕的故障模式。( WEP现在被认为完全损坏的事实与这个问题密切相关。)我并不是说正确使用时 CTR 不好。我是说小错误是灾难性的。
CBC永远不应该重复使用 IV+Key,但它并没有那么具有破坏性。这是CBC对于非专家来说是一个非常好的选择的主要原因。即使使用不当,也相对安全。然而,重用 IV+Key 对会带来两个主要问题:
- 如果两条消息具有相同的前缀,则将前 16 个字节以及进一步的块公开给解密。
- 相同地加密相同的消息(以及相同的前缀)。这间接泄露了有关消息的大量信息。
标准结构非常适合非专家,因为这些工具在许多平台上都很容易获得并且相对容易正确使用,如下所示:
Random IV + CBC-ciphertext + HMAC
IV不是秘密。将其与消息一起发送是标准且正确的。IV 只能被攻击者无法预测。只要攻击者无法预测(或控制)IV,即使是偶尔的重用也会泄露很少的信息。显然,如果它总是为零,那么预测它是微不足道的。
CBC(以及 CTR)不提供消息的任何身份验证。它可能在运输过程中被修改。如果攻击者知道明文消息,在某些情况下他们可以修改加密消息以便以已知方式解密。例如,如果我知道(或可以猜到)消息为“致 Bob:$100”,则可以在不知道密码为“致 Eve:$100”的情况下修改该消息。身份验证可以防止这种情况。验证 CBC 的方法是使用 HMAC(先加密,然后散列)。
有关此格式在实践中的示例,请参阅RNCryptor格式,包括RNCryptor-js。
Maarten 提到了 GCM,我同意它是一种出色的密码学,但我不同意非专家应该使用它。作为一种反模式,它具有与 CTR 相同的危险。如果使用不当,它会完全崩溃(与 CBC 相比,它的安全性损失要平滑得多)。然而,这是一个高度自以为是的话题,GCM 粉丝并没有错。我只是不同意“非专家的标准最佳实践”应该是什么。
为了“我想要最好的安全性”,那么你绝对需要让安全专家参与进来。选择正确的阻止模式是保护系统最简单的部分,还有许多其他同样重要的陷阱。