如何验证解密结果是否正确


How to verify that the decryption result is correct?

周末我一直在玩php mcrypt,使用AES使用密钥加密文本字符串。
后来我开发了一个很小的 php 工具来使用 AES/mcrypt 加密/解密你的字符串,现在当密钥"错误"并且文本没有被解密时,你最终会得到我认为是二进制的东西从我读到的内容(https://i.stack.imgur.com/e5iXP.png),PHP 中是否有任何检查变量是否包含二进制或正确解码的字符串?

如果标题和介绍有点误导,我深表歉意。

当您加密文本然后尝试解密它时,您将获得相同的文本,但是当您尝试解密随机数据时,结果将是文本的可能性很小(随着数据长度而减少)。您尚未指定我们正在谈论的数据类型,但是通过应用启发式方法确定解密是否成功是一个坏主意。它很慢,可能会导致误报。

您应该有一个校验和或类似的东西来确定解密的结果是否有效。这可以通过对明文数据运行sha1,将结果附加到文本并将其作为一个整体进行加密来轻松完成。解密时,您可以拆分(sha1输出具有固定大小,因此您知道在哪里拆分)生成的字符串在文本部分上运行sha1并与哈希部分进行比较。如果匹配,则获得有效结果。当然,您可以使用SHA-256或SHA-512稍微提高安全性。

这只是一种方法,但可能不是最好的。更好的方法是对 AES 使用经过身份验证的操作模式,如 GCM 或 CCM,或者使用具有良好 MAC 功能的加密然后 MAC,如 HMAC-SHA512。

使用上述方法,您可以自由使用任何类型的数据进行加密,因为您不仅限于确定它是否是文本。