Я пытаюсь подсчитать ручное усечение HMAC SHA-1 для HOTP, но оно не дает того же результата, что и исходный код. Например, у меня есть код для генерации HMAC SHA-1 как:
$hash = hash_hmac('sha1','375317186160478973','test');
Это даст мне HMAC = c359e469b8ef0939f83e79a300b20a6ef4b53a05
И разделите его на [19] массивы, чтобы было:
c3 59 e4 69 b8 ef 09 39 f8 3e 79 a3 00 b2 0a 6e f4 b5 3a 05
Из последнего массива у меня есть 05 (101 в двоичном формате), а после 101 и 0xf = 5
Так что считаю из 5-го массива ef(11101111)09(1001)39(111001)f8(11111000)
После этого выполните (((11101111) & 0x7f) ‹‹ 24) | (((1001) & 0xff) ‹‹ 16) | (((111001) & 0xff) ‹‹ 8) | ((11111000) & 0xff)) % pow (10,6)
Это дает мне результат: 56024
Но если я использую этот код:
$offset = ($hash[19]) & 0xf;
$otp = (((($hash[$offset + 0]) & 0x7f) << 24) |
((($hash[$offset + 1]) & 0xff) << 16) |
((($hash[$offset + 2]) & 0xff) << 8) |
(($hash[$offset + 3]) & 0xff)) % pow(10, 6);
Это дает мне результат: 599808
Тот же другой результат будет отображаться, если я напишу двоичное или десятичное значение в качестве значения из массивов. Может ли кто-нибудь помочь мне объяснить, в чем моя ошибка, чтобы я мог посчитать руководство и исходный код и дать мне результат того же значения HOTP. Спасибо