没有 IV 的 AES CTR - 多条消息的相同密钥 - 安全吗?

AES CTR without IV - same key for multiple messages - safe?

我想用js制作一个加密明文的网页,发给朋友,朋友用同样的网页解密

我们将共享同一个密钥并将其用于多条消息。

我知道在使用 AES CBC 时,每条消息都需要随机 iv,但我想使用 AES CTR。

我将使用 256 密钥,而不是密码。

我有两个问题:

  1. 我可以使用 CTR 多次使用相同的密码而没有 iv 吗?
  2. 如果我将使用 CBC,以明文形式发送 iv 和加密消息是否安全?

我正在使用 aes-js 和基本的常用操作模式:

https://github.com/ricmoo/aes-js#ctr---counter-recommended

https://github.com/ricmoo/aes-js#cbc---cipher-block-chaining-recommended

我想要最好的安全保障。

  1. Can I use the same password multiple times with CTR and no IV?

不,在那种情况下,点击率将充当许多时间垫,您将失去大部分安全性。

  1. If I will use CBC is it safe to send IV in plaintext along with encrypted message?

使用 CBC 也不安全,因为您可能会成为 padding oracle 攻击的受害者。


使用带有 12 字节随机 IV 的 GCM,或者 - 更好 - 使用带有预共享密钥 (PSK) 的 TLS。

首先,"no IV." 没有 CTR 或 CBC 这样的东西,您可能只是使用全零作为 IV。总有一个 IV。 (点击率将其 IV 称为随机数。)

CTR 必须永远、永远 重复使用 nonce+Key 对。它可以完全破坏加密。这是避免点击率的主要原因,除非您知道自己在做什么。它很难正确使用并且具有可怕的故障模式。 (WEP 现在被认为完全损坏的事实与这个问题密切相关。)我并不是说正确使用 CTR 是不好的;我是说小错误是灾难性的。

CBC 应该 永远不要重复使用 IV+Key,但这不会造成破坏。这是 CBC 对于非专家来说是一个非常好的选择的主要原因。即使使用不当,它也是相对安全的。然而,重用 IV+Key 对会引入两个主要问题:

  • 公开前 16 个字节进行解密,如果两条消息具有相同的前缀,则公开更多的块。
  • 以相同的方式加密相同的消息(以及相同的前缀)。这间接泄露了有关消息的大量信息。

标准结构非常适合非专家,因为这些工具在许多平台上都很容易获得并且相对容易正确使用,如下所示:

Random IV + CBC-ciphertext + HMAC

IV 不是秘密。随消息一起发送是标准和正确的。 IV 只能是攻击者无法预测的。只要攻击者无法预测(或控制)IV,即使是偶尔的重用也会泄漏很少的信息。显然,如果它始终为零,则预测它是微不足道的。

CBC(以及 CTR)不提供任何消息验证。它可能在运输过程中被修改。如果攻击者知道明文消息,在某些情况下他们可以修改加密消息以便以已知方式解密。例如,如果我知道(或可以猜到)消息为 "To Bob: 0",则可以在不知道密码为 "To Eve: 0" 的情况下修改该消息。身份验证可以防止这种情况。验证 CBC 的方法是使用 HMAC(先加密,然后散列)。

有关此格式在实践中的示例,请参阅 RNCryptor format, including RNCryptor-js

Maarten 提到了 GCM,我同意它是密码学的优秀作品,但我不同意非专家应该使用它。作为一种反模式,它具有与 CTR 相同的危险。如果使用不当,它就会完全崩溃(与 CBC 相比,后者的安全性损失要小得多)。然而,这是一个自以为是的话题,GCM 的粉丝并没有错。我只是不同意 "standard best practice for non-experts" 应该是什么。

到"I want best possible security,"那么你绝对需要让安全专家参与进来。选择正确的块模式是保护系统最简单的部分,还有许多其他同样重要的陷阱。