我正在尝试计算 HOTP 的手动 HMAC SHA-1 截断,但它不会返回与我使用源代码计算相同的结果。例如,我有生成 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)) % 战俘 (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 值。谢谢