HMAC实现 - 伪代码

Rei*_*eid 3 cryptography pseudocode sha256 hmac

我不得不实现我自己的HMAC-SHA256用于嵌入式项目.我无法让它工作.我甚至无法得到伪代码,手工计算工作,所以我知道我做错了什么!

我的pseduoCode计算.按照维基百科中的图表

 1 function hmac (key, message)
 2     if (length(key) > blocksize) then
 3         // keys longer than blocksize are shortened
 4         key = hash(key)
 5     end if
 6     if (length(key) < blocksize) then
 7         // keys shorter than blocksize are zero-padded
 8         key = key ? zeroes(blocksize - length(key))
 9     end if
10
11     // Where blocksize is that of the underlying hash function
12     o_key_pad = [0x5c * blocksize] ? key
13     i_key_pad = [0x36 * blocksize] ? key // Where ? is exclusive or (XOR)
14     // Where ? is concatenation
15     return hash(o_key_pad ? hash(i_key_pad ? message))
16 end function
Run Code Online (Sandbox Code Playgroud)

当我为key ="mykey"和message ="helloworld"进行手工计算时,我得到以下结果:

key = 0x6d796b6579000000000000000000000000000000000000000000000000000000

o_key_pad = 0x31253739255c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c

i_key_pad = 0x5b4f5d534f363636363636363636363636363636363636363636363636363636

hash(i_key_pad ? message) = 6fb2e91de7b8b5ec6283846ff7245cd6eb4a4fd26056b529bd42d99fcf3314d2

和整体的hmac 0d76a16089f85cd2169bb64b6f2c818e6a404a218896483fcd97fee5cce185ae

mat*_*att 5

在修复密钥长度并计算内部和外部填充时,需要使用底层哈希函数的块大小,这与其输出大小不同.这是函数操作的输入块的大小.在SHA256的情况下,块大小为512位(64字节),输出大小为256位(32字节).

如果您使用32作为blocksize,您的结果就是您得到的结果.

使用正确的长度的块大小的key,o_key_pad并且i_key_pad基本上是相同的,唯一的两倍长与尾00,5c36分别字节.

内部哈希的结果(即hash(i_key_pad ? message):

8bf029764919f9e35249d0d55ffb8fd6c62fe23a85c1515e0120c5005aa813d5
Run Code Online (Sandbox Code Playgroud)

最终值(hash(o_key_pad ? hash(i_key_pad ? message)))是:

7fdfaa9c9c0931f52d9ebf2538bc99700f2e771f3af1c1d93945c2256c11aedd
Run Code Online (Sandbox Code Playgroud)

这与我从OpenSSL的HMAC实现得到的结果相匹配.