Arrays HMAC SHA-1截断HOTP逻辑

Arrays HMAC SHA-1截断HOTP逻辑,arrays,truncate,hmacsha1,one-time-password,rfc-4226,Arrays,Truncate,Hmacsha1,One Time Password,Rfc 4226,我试图计算HOTP的手动hmacsha-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 从最后

我试图计算HOTP的手动hmacsha-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

所以我从第五个数组ef(11101111)09(1001)39(111001)f8(11111000)开始计数

然后首先执行((11101111)&0x7f)apakabar:),SHA-1的大小是160位(20字节),而不是19位。您正在使用PHP,对吗? 问题是,这样访问数组是行不通的,因为您总是只读取字符:

$hash[5] // (4)
$hash[6] // (6)
$hash[7] // (9)
$hash[8] // (b)
应采取以下措施:

((intval(substr($hash, ($offset + 0) * 2, 2), 16) & 0x7f) << 24) |
((intval(substr($hash, ($offset + 1) * 2, 2), 16) & 0xff) << 16) |
((intval(substr($hash, ($offset + 2) * 2, 2), 16) & 0xff) << 8) |
(intval(substr($hash, ($offset + 3) * 2, 2), 16) & 0xff);

((intval(substr($hash,($offset+0)*2,2),16)和0x7f)卡巴尔·拜克,丹克:)。谢谢你的答复,先生。我不太了解数组,因为这是我第一次尝试解码HOTP(rfc4226)是如何被截断成6位的。我也在尝试做与这里相同的事情:,这里:,和这里:,将返回不同的HOTP值,我不能更改RFC4226给出的截断公式,这是我的结果:。它将十六进制值转换为十进制值。请告诉我,先生:)@GudangGaram我已经更新了我的解释。我不太清楚HOTP算法,但这似乎不是你的问题。问题是您如何访问存储在字符串中而不是数组中的数据。对不起,先生,我没有阅读您在回答中更新的解释,现在我阅读了,现在我正在处理。如果成功与否,我会在以后写。谢谢你的建议,先生。
((intval(substr($hash, ($offset + 0) * 2, 2), 16) & 0x7f) << 24) |
((intval(substr($hash, ($offset + 1) * 2, 2), 16) & 0xff) << 16) |
((intval(substr($hash, ($offset + 2) * 2, 2), 16) & 0xff) << 8) |
(intval(substr($hash, ($offset + 3) * 2, 2), 16) & 0xff);