解密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实现。
答案 0 :(得分:0)
检查密文是否正确的最佳方法是在密文和其他参数(如IV)或经过验证的密码(如GCM)上使用MAC(例如,使用SHA-256的HMAC)。如果您使用使用分组密码的MAC,您当然应该使用单独的密钥。
检查已知值(如在接受的答案中)使您容易受到各种攻击,并且当然不应该因为填充和扩展而使用传输协议。明文oracle攻击。
答案 1 :(得分:-1)
当然:加密一个序列化的json对象,它保存你的明文而不仅仅是纯文本。如果它没有反序列化它不是正确的密钥
序列化并加密:
{"p": "Hello World!"}
解密获得{"p":"
前缀的可能性为1:2 ^ 48且后缀"}
1:2 ^ 16。明文的解密也必须对json值有效。这意味着只需检查解密后的文本是否可以反序列化并具有p
值,对于大多数应用程序而言,这意味着误报率低于1:2 ^ 64。
如果您确实坚持要求您可以添加另一个字段来存储明文的第一个字符:
{"p": "Hello World!","v":"H"}
...但我认为对1:2 ^ 128
的假阳性进行验证机会是一种矫枉过正的行为