首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HMAC-SHA256 256错误的HKDF测试向量

HMAC-SHA256 256错误的HKDF测试向量
EN

Cryptography用户
提问于 2014-04-04 21:39:25
回答 1查看 945关注 0票数 2

我自己实施了香港发展基金,似乎运作良好。我成功复制了所有列出的这里测试向量,但是.除了这个:

代码语言:javascript
复制
   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,我发现结果值是不同的。

有人能确认这个测试载体是“窃听”的吗?

EN

回答 1

Cryptography用户

发布于 2014-04-05 12:36:59

在C#中匆忙编写的HKDF实现与RFC测试向量一致:

代码语言:javascript
复制
    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的测试向量(特别是最后两个测试向量)进行比较,后者使用“键大于块”的情况。

票数 5
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/15404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档