0

解密 AES 密文时,如何检查密文是否有效?例如:

Encryption Key: stackoverflow
Plaintext: Hello World!
AES Ciphertext: 3AN75bE2LlGR957fjjd5WOfRmdY=

当使用相同的加密密钥对其进行解密时,明文结果将是Hello World!

但是,如果我使用不同的密钥:

Encryption Key: stackexchange
AES Ciphertext: 3AN75bE2LlGR957fjjd5WOfRmdY=
Plaintext Result: ]o+ãTy¹¶Ïâ

有没有办法验证明文结果是否有效以及指定的加密密钥是否正确?

我正在使用http://www.movable-type.co.uk/scripts/aes.html编写一个 JS 实现。

4

2 回答 2

0

检查密文是否正确的最佳方法是在密文上使用 MAC(例如,使用 SHA-256 的 HMAC)和其他参数(如 IV)或经过身份验证的密码(如 GCM)。如果您使用使用分组密码的 MAC,您当然应该使用单独的密钥。

检查已知值(如在接受的答案中)会使您容易受到各种攻击,并且由于填充和明文预言机攻击,当然不应该在传输协议上使用。

于 2013-02-27T21:07:11.620 回答
-1

当然:加密一个序列化的 json 对象,该对象包含您的纯文本,而不仅仅是纯文本。如果它不反序列化它不是正确的密钥

序列化和加密这个:

{"p": "Hello World!"}

解密时得到{"p":"前缀的几率是1:2^48,后缀是"}1:2^16。明文的解密也必须对 json 值有效。这意味着通过检查解密的文本是否可以反序列化并具有价值,误报的可能性小于 1:2^64,这p对于大多数应用程序来说已经足够好了。

如果你真的坚持你可以包含另一个字段来存储你的明文的第一个字符:

{"p": "Hello World!","v":"H"}

...但我认为有 1:2 ^ 128 的误报验证机会有点过头了

于 2013-02-27T16:44:20.620 回答