【问题标题】:Can we use specific padding patterns for AES to detect errors?我们可以为 AES 使用特定的填充模式来检测错误吗?
【发布时间】:2016-04-12 22:26:58
【问题描述】:

这些天我一直在阅读和做关于 AES 的实验。比如说 128 位 AES,在加密过程中,如果明文小于 128 位,则将添加全 0 的填充。解密后,这些 0 可以被删除。

我正在考虑使用填充进行错误检测:如果明文始终为 16 位,则解密后的文本应为(某些数据的 16 位 + 0 的 112 位)的形式。我们称这种形式为“法律明文”。总共可以有 2^16 个合法明文。

如果攻击者不知道密钥和 IV,通过修改密码,解密后的明文可以是任何形式。他/她有 (2^16)/(2^128) = 2^(-112) 的概率使其成为合法的明文,这是一个非常小的机会。

这听起来合理吗?

(当然,攻击者仍然可以通过修改第 i 个密码来进行位翻转,以在第 (i+1) 个明文中获得想要的结果)

【问题讨论】:

  • 这看起来像是密钥检查值 (KCV) 的变体。 Here is some reasoning 为什么这不值得努力。请改用经过身份验证的加密。

标签: encryption cryptography aes error-correction error-detection


【解决方案1】:

有精心设计的authenticated encryption modes,GCM, 来检测错误(或篡改)。

您没有在方案中明确说明模式,但听起来您正在提议 CBC。如果是这样,它完全没有提供任何保护:攻击者可以翻转密文的前 16 位中的任何一个,并且仍然拥有有效的纯文本。

【讨论】:

  • 你的意思是通过翻转当前密码的前 16 位,我们将使下一个纯文本块有效吗?从当前密码解密的纯文本应该仍然无效,对吧?
  • @adieux 对,我明白你的意思。您会检测到当前块的更改并停止。尽管如此,我还是不相信安全性,而且 GCM 的效率要高得多,那么这个方案的动机是什么?
  • 谢谢。我提出这个问题的原因是我们的频道非常慢,每 3 秒发送一条消息。所以我认为只要使用这种简单的方法来每次检查就足够了。您在这里看到任何潜在的问题吗?
  • @adieux 慢通道是指你的传输速度很低吗?如果是这种情况,那么为此使用 7/8 的带宽似乎很浪费。但是,如果您只是说您的流量非常低,那么这方面当然无关紧要。剩下的主要问题是,作为一个非标准方案,我对它的安全性不是很有信心。第二个问题是您必须编写更多自定义代码来支持该方案,而实现缺陷是发现漏洞的地方。实现像 GCM 这样的标准模式的库将有更好的审查和维护。
【解决方案2】:
  1. 使用 0 (0x00) 填充将不适用于可能以 0x00 字节结尾的二进制数据。一般使用PKCS#7 née PKCS#5 填充。

  2. 将填充与加密身份验证相结合是违反 CBC 模式加密的安全违规行为,请参阅padding oracle,一般来说是个坏主意。将加密身份验证和填充分开。

  3. IV 不被视为机密,最佳做法是在加密数据前附加一个随机值。使用非随机 IV 是一种设计缺陷。

许多密码学家已经考虑了填充和加密身份验证并得出了更好的方法,最好遵循这些方法。

一般来说,除非您是加密领域专家,否则最好不要尝试提出非标准方法。

"Schneier's Law": 任何人,从最无知的业余爱好者到最优秀的密码学家,都可以创建自己无法破解的算法。

【讨论】:

  • 我得到了 1. 和 3. 你能详细说明 2. 吗?修改密码以使解密的明文合法地进行身份验证检查应该非常困难。 (我知道它可以通过位翻转来处理下一个明文)
猜你喜欢
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多