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
在修复密钥长度并计算内部和外部填充时,需要使用底层哈希函数的块大小,这与其输出大小不同.这是函数操作的输入块的大小.在SHA256的情况下,块大小为512位(64字节),输出大小为256位(32字节).
如果您使用32作为blocksize,您的结果就是您得到的结果.
使用正确的长度的块大小的key,o_key_pad并且i_key_pad基本上是相同的,唯一的两倍长与尾00,5c或36分别字节.
内部哈希的结果(即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实现得到的结果相匹配.
| 归档时间: |
|
| 查看次数: |
1407 次 |
| 最近记录: |