我需要验证遵循 FIPS-197 标准的工具的正确性。所以我会收到一个三元组,我想解码这个三元组(钥匙、密码、IV)。
有没有办法简单地做到这一点?是否有任何在线实施,这可能有用?
我刚刚发现,即使是两个不同的页面,实现了 AES-256,也没有与输出具有相同的值。
谢谢你的帮助。
编辑: 我需要验证我自己的实现,我想通过检查已经经过验证的工具验证的测试向量来做到这一点。
编辑2: 我正在寻找一种方法来验证我的实施。所以我想到了测试向量或其他已经验证的工具。这是我需要帮助的部分:我在哪里可以找到测试向量或这样的工具?
编辑3:用php评估
我们使用"openssl_encrypt"进行评估。
$CM = "aes-256-gcm"; //cypher mode
$PT = "";//plain
$CT = "";//cypher
$key = "";
$iv = "";
$cypher = openssl_encrypt($PT, $CM, $key, $options=0, $iv, $tag);
如果我们想评估标签,我们需要做:
print(unpack("h*", $tag)[1]);
现在我们可以看到,如果两者相等,关于"gcmEncryptExtIV256.rsp">
[凯伦 = 256] [IVlen = 96] [PTlen = 0] [AADlen = 0] [塔格伦 = 128]
计数 = 0
密钥 = b52c505a37d78eda5dd34f20c22540ea1b58963cf8e5bf8ffa85f9f2492505b4
IV = 516c33929df5a3284ff463d7
PT = AAD = CT =
标签 = bdc1ac884d332457a1d2664f168c76f0
我们有:
$CM = "aes-256-gcm";
$PT = ""; //plain
$CT = ""; //cypher
$key = "b52c505a37d78eda5dd34f20c22540ea1b58963cf8e5bf8ffa85f9f2492505b4 ";
$iv = "516c33929df5a3284ff463d7 ";
$cypher = openssl_encrypt($PT, $CM, $key, $options=0, $iv, $tag);
print(unpack("h*", $tag)[1]);
这不等于 bdc1ac884d332457a1d2664f168c76f0。
那我做错了什么?
https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/CAVP-TESTING-BLOCK-CIPHER-MODES#GCMVS 是用于分组密码模式(包括GCM)的NIST加密算法验证程序(CAVP)页面。
在底部,它包含一个指向测试向量语料库的链接,https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip
例如,gcmEncryptExtIV128.rsp
你得到这样的情况
Count = 0
Key = 11754cd72aec309bf52f7687212e8957
IV = 3c819d9a9bed087615030b65
PT =
AAD =
CT =
Tag = 250327c674aaf477aef2675748cf6971
因此,使用密钥11754cd72aec309bf52f7687212e8957
(以十六进制指定)和3c819d9a9bed087615030b65
的 IV/nonce(仍然是十六进制),空明文和空关联数据应该产生一个空密文和一个250327c674aaf477aef2675748cf6971
的身份验证标签(是的,仍然是十六进制)。
该模式有很多测试(不同的键,没有明文,没有AAD),然后是大量的"现在使用AAD",然后是"仅使用明文",最终出现的情况,例如
Count = 14
Key = f42c74bcf473f6e923119946a89a0079
IV = 14852791065b66ccfa0b2d80
PT = 819abf03a7a6b72892a5ac85604035c2
AAD = 297007ac9419553a292b0fee3a7ac3c9
CT = 48371bd7af4235c4f11c458f1789192a
Tag = 4f44e0aff49a5a20ab2c69c834
这使您可以检查整个套件和kaboodle。 不过,"一次一个部件"测试失败可能更容易调试。