RFC4226 HOTP Java 实施

RFC4226 HOTP Java Implementation

我试图复制官方 RFC4226 文档第 27 页上的 HOTPAlgorithm.java 代码 (HOTPAlgorithm.java) and compared it against the official HOTP RFC 4226's sample implementation (RFC4226 Page 27)。 HOTPAlgorithm.java 和 RFC4226 中的实现均由同一作者 Loren Hart 编写并设置为版本 1.0。从我的比较来看,这两个代码本质上是相同的。

我尝试 运行 测试 6 位 HOTP 代码的向量(不修改 HOTPAlgorithm.java 脚本)并注意到 RFC4226 和 HOTPAlgorithm.java 中给出的源代码产生不同使用完全相同的设置,针对已发布的 RFC4226 结果测试矢量结果。

与 RFC4226 测试向量相比,RFC4226 示例 Java 代码和 HOTPAlogrithm.java 发布的 Java 代码是否存在差异?

来自 HOTPAlgorithm.java 和 RFC4226 Java 代码的测试结果(两者产生相同的结果):

755224
030356
132975
957805
463120
994243
844697
570244
487336
025740

来自 RFC4226 出版物的测试向量 (RFC4226 Page 32)

755224
287082
359152
969429
338314
254676
287922
162583
399871
520489

我是不是遗漏了什么或者官方发布的示例代码与官方发布的结果之间是否存在差异?

改变

int otp = binary % DIGITS_POWER[codeDigits];

int otp = (int) (binary % Math.pow(10, codeDigits));

或者

int otp = binary % 1000000;

对 Math.pow() 的更改没有任何区别,但我认为您可能在调用 generateOTP() 时将 0 作为 truncationOffset 参数值。尝试使用 -1 给出参考测试向量。