Что нового

[Хеширование, цифровая подпись] HMAC-SHA512 выдает не то, что положено или...?

timsky

Осваивающий
Сообщения
93
Репутация
28
Для справки: HMAC

Нашел на оф. форуме вот такую функцию.
Чуток подправил ее, вот пример:
Код:
#include <Crypt.au3>

$CALG_SHA_512 = 0x0000800e

$message = 'abc'
$key = '123'

$result = hmac($key, $message)
If @error Then MsgBox(16, @extended, @error)
MsgBox(0, BinaryLen($result), $result)
;ClipPut($result)

Func hmac($key, $message, $sAlg = "SHA_512")
	Local $blocksize = 64
	Local $a_opad[$blocksize], $a_ipad[$blocksize]
	Local Const $oconst = 0x5C, $iconst = 0x36	; 92 / 54 DEC
	Local $opad = Binary(''), $ipad = Binary('')
	$key = Binary($key)
	If BinaryLen($key) > $blocksize Then $key = _HASH($key, $sAlg)
	For $i = 1 To BinaryLen($key)
		$a_ipad[$i - 1] = Number(BinaryMid($key, $i, 1))
		$a_opad[$i - 1] = Number(BinaryMid($key, $i, 1))
	Next
	For $i = 0 To $blocksize - 1
		$a_opad[$i] = BitXOR($a_opad[$i], $oconst)
		$a_ipad[$i] = BitXOR($a_ipad[$i], $iconst)
	Next
	For $i = 0 To $blocksize - 1
		$ipad &= Binary('0x' & Hex($a_ipad[$i], 2))
		$opad &= Binary('0x' & Hex($a_opad[$i], 2))
	Next

	; $ipad = StringToBinary($ipad)
	; $opad = StringToBinary($opad)
	;MsgBox(0, VarGetType($ipad), $ipad)
	;MsgBox(0, VarGetType($opad), $opad)
	
	Local $ret = _HASH($ipad & Binary($message), $sAlg)
	$ret = _HASH($opad & $ret, $sAlg)
	Return $ret

EndFunc   ;==>hmac

Func _HASH($message, $sAlg)
	Return _Crypt_HashData($message, Eval('CALG_' & $sAlg))
EndFunc

Это должно выдавать 58585ACD673067F96BEA32A1C57BF3FC3FD5A42678567E72D5CB0AB7F08EA41DCF3A41AF96C53948E13184AE6FE6CD0B8B4193FC593DFB2693B00C2B0EE7A316

А выдает B212278CE73603B7B0A522013FA9943B39189D29F98ECB43FE2BA0E06FB95E747CEC20CD4B719AF8E68C09C231D0C012DFA376AE12EECC80188825F40B60200C

Вот где это можно проверить: http://www.asecuritysite.com/security/Encryption/hmac
Проверял не толко в онлайн сервисах, тот же http://hcrypto.sourceforge.net/ все прекрасно HMAC-ает вот такой командной строкой:
Код:
hmac.exe --file=abc.txt --hkey=313233 --algo=SHA-512
abc.txt - файл, содержащий 3 символа: "123"
313233 - HEX байтов 1,2 и 3

Сделал свой вариант (запорол уже его, но выдавал он то же самое, неправильное...), все идет вроде нормально до этого места:
Код:
Local $ret = _HASH($ipad & Binary($message), $sAlg)
	$ret = _HASH($opad & $ret, $sAlg)
	Return $ret


В чем затык? :stars:
 
Верх