我正在使用CryptoJS。当我使用带有错误密钥的AES.decrypt时,我注意到它通常带有一个负的“ sigBytes”,这表明我使用了错误的密钥。为什么会这样呢?它与无效的填充有关吗?我尝试过不同模式的AES,同样的问题。 AES是否有可能不承认失败?
是否有一种标准的加密算法可以解密为随机字节,而不会显示成功或失败的迹象?
答案 0 :(得分:0)
是的,基于流的密码通常不会报告失败。基本上,如果您知道密文大小与明文大小相同,则无法报告失败。这是因为通用密码通常接受 any 消息,这意味着在一定的位长下,每个明文都只有一个密文,反之亦然,这与所使用的密钥无关。这样的1:1映射称为伪随机置换或PRP。当每个密文都返回到有效的明文消息时,不会有错误返回。
所有流密码(例如ChaCha)和块密码流模式都将具有此属性。流模式是不需要填充的模式,因此与纯文本大小相比,不应该扩展密文大小。当然,如果您 active 表示需要填充,则可以破坏此特定属性。当前,最常见的计数器模式可能是CTR模式,这也是因为它几乎用于所有认证的模式。 CFB / OFB通常仅用于传统目的。
请注意,根据明文中的信息,对手仍然可以获取信息。通常,即使知道很少的纯文本也可以找到密钥(例如,JPEG标头很容易就足够了)。对错误的明文进行的其他操作也可能很容易指示失败(将接收方转变为所谓的 plaintext oracle )。