我自己实施了香港发展基金,似乎运作良好。我成功复制了所有列出的这里测试向量,但是.除了这个:
Test with SHA-256 and longer inputs/outputs
Hash = SHA-256
IKM = 0x000102030405060708090a0b0c0d0e0f
101112131415161718191a1b1c1d1e1f
202122232425262728292a2b2c2d2e2f
303132333435363738393a3b3c3d3e3f
404142434445464748494a4b4c4d4e4f (80 octets)
salt = 0x606162636465666768696a6b6c6d6e6f
707172737475767778797a7b7c7d7e7f
808182838485868788898a8b8c8d8e8f
909192939495969798999a9b9c9d9e9f
a0a1a2a3a4a5a6a7a8a9aaabacadaeaf (80 octets)
info = 0xb0b1b2b3b4b5b6b7b8b9babbbcbdbebf
c0c1c2c3c4c5c6c7c8c9cacbcccdcecf
d0d1d2d3d4d5d6d7d8d9dadbdcdddedf
e0e1e2e3e4e5e6e7e8e9eaebecedeeef
f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff (80 octets)
L = 82
PRK = 0x06a6b88c5853361a06104c9ceb35b45c
ef760014904671014a193f40c15fc244 (32 octets)
OKM = 0xb11e398dc80327a1c8e7f78c596a4934
4f012eda2d4efad8a050cc4c19afa97c
59045a99cac7827271cb41c65e590e09
da3275600c2f09b8367793a9aca3db71
cc30c58179ec3e87c14c01d5c1f3434f
1d87 (82 octets)经过一个小时的调试,我发现(并且相信)我的实现是正确的,并且这个测试向量是错误的。我无法得到正确的OKM值,甚至PRK也是错误的。为了发现这一点,我做了以下工作:
考虑到PRK = HMAC-Hash(salt, IKM) (如RFC中所描述的),我试图计算HMAC,我发现结果值是不同的。
有人能确认这个测试载体是“窃听”的吗?
发布于 2014-04-05 12:36:59
在C#中匆忙编写的HKDF实现与RFC测试向量一致:
private const int SHA1 = 1;
private const int SHA256 = 2;
private static HMAC NewHMAC(int h, byte[] key)
{
switch (h) {
case SHA1:
return new HMACSHA1(key);
case SHA256:
return new HMACSHA256(key);
default:
throw new Exception("NYI");
}
}
private static byte[] HKDFExtract(int h,
byte[] salt, byte[] ikm)
{
using (HMAC hm = NewHMAC(h, salt)) {
return hm.ComputeHash(ikm);
}
}
private static byte[] HKDFExpand(int h,
byte[] prk, byte[] info, int len)
{
using (HMAC hm = NewHMAC(h, prk)) {
MemoryStream ms = new MemoryStream();
byte[] T = new byte[0];
int j = 0;
while (len > 0) {
byte[] buf = new byte[T.Length + info.Length + 1];
Array.Copy(T, 0, buf, 0, T.Length);
Array.Copy(info, 0, buf, T.Length, info.Length);
buf[buf.Length - 1] = (byte)(++ j);
T = hm.ComputeHash(buf);
int clen = Math.Min(T.Length, len);
ms.Write(T, 0, clen);
len -= clen;
}
return ms.ToArray();
}
}您可以随意重用和修改它,以便打印中间值,以确定您的实现差异所在的位置。与@Andrey类似,我发现您的代码在应用HMAC时出错,其密钥大于基础哈希函数块大小( SHA-1和SHA-256为64字节):在这种情况下,应该首先单独散列键,然后使用散列结果(分别为SHA-1和SHA-256)作为实际的HMAC密钥。
因此,您可能希望将HMAC实现与来自RFC 4231的测试向量(特别是最后两个测试向量)进行比较,后者使用“键大于块”的情况。
https://crypto.stackexchange.com/questions/15404
复制相似问题