AES中的密钥验证

时间:2018-05-24 10:37:59

标签: c++ encryption aes

我有一个AES的c ++实现,支持128位,192位,256位密钥长度。如果输入了错误密钥进行解密,则会生成一些垃圾数据,但我想验证用户在解密时输入的密钥,如果密钥不正确,则应该抛出错误。

如何验证用户输入的密钥。

感谢

3 个答案:

答案 0 :(得分:1)

最简单的方法是在加密前在可预测的位置为明文文件数据添加幻数;解密时,如果幻数错误,则使用了错误的密钥。这种方法的缺点是无法验证整个消息的完整性/真实性。

为此,请在经过身份验证的模式下使用AES(例如AES-GCM),这样可以更好地保证邮件的其余部分不被篡改。

答案 1 :(得分:1)

使用HMAC。基本前提是您通过HMAC运行明文,将结果添加到明文然后加密。然后在解密时执行相反的操作。如果明文和HMAC结果匹配,那么你就知道你有正确的密钥。

或者,如果您想在解密之前知道,请使用用户提供的密钥材料来导出另外两个密钥(使用,例如PBKDF2)。使用一个用于加密,另一个用于HMAC。在这种情况下,首先加密,然后然后使用第二个密钥应用HMAC。通过这种方式,您可以计算HMAC并检查它是否与您解密后 匹配。

答案 2 :(得分:0)

用于验证是否正确输入密钥而不泄露实际密钥的一种常用方法是使用 KCV(密钥检查值)。当您创建密钥时,您将同时计算 KCV ,当手动输入密钥时,您可以通过重新计算 KCV 来验证条目。这是例如。用于从物理密钥字母手动输入密钥到HSM时使用。

要计算AES密钥的 KCV ,您使用密钥加密空(0x00)块,然后生成的加密块的前3个字节为 KCV

看看here