首页 > 解决方案 > 使用错误密钥的 AES 解密。如何隐藏密钥错误的事实?

问题描述

我正在使用CryptoJS。当我用错误的密钥使用 AES.decrypt 时,我注意到它通常有一个负数“sigBytes”,这告诉我我使用了错误的密钥。为什么这可能?它与无效填充有关吗?我尝试了不同的AES模式,同样的问题。AES甚至有可能不承认失败吗?

是否有标准的加密算法可以解密为随机字节而没有成功或失败的指示?

标签: javascriptencryptionaescryptojs

解决方案


是的,基于流的密码通常不会报告失败。基本上,如果您知道密文大小与明文大小相同,则无法报告失败。这是因为通用密码通常接受任何消息,这意味着对于特定位长度的每个明文只有一个密文,反之亦然,与使用的密钥无关。这种 1:1 映射称为伪随机排列或 PRP。由于每个密文都返回有效的明文消息,因此不会返回错误。

因此,所有流密码(例如 ChaCha)和块密码流模式都将具有此属性。流模式是不需要填充的模式,因此与明文大小相比,密文大小不应扩大。当然,如果您主动指出需要填充,则可能会破坏此特定属性。目前最常见的计数器模式可能是 CTR 模式,也因为它用于几乎所有的认证模式。CFB/OFB 通常仅用于遗留用途。

请注意,对手可能仍会根据明文中的信息获取信息。通常即使知道很少的明文也可以找到密钥(例如,JPEG 标头很容易成为足够的知识)。对错误明文的其他操作也可能很容易表明失败(将接收方变成所谓的明文预言机)。


推荐阅读