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