关于HOTP的dynamic truncation(动态截获)问题

阿振 2011-03-28 09:44:06
相信大家都一般OTP密码发生器并不陌生,对于HMAC_sha和HMAC_md5也都很熟系,本人一直对产生OTP的DH(dynamic truncation,动态截获)不解。
动态截获的流程为:
1.将一段数组的最后一个字节的低4位作为一个偏移offset.
2.取从当前数组开始偏移offset的后4个字节。
3.将获取的4字节按照大端方式去将最高字节的最高位清零,然后将其返回。
例如:
-------------------------------------------------------------
| Byte Number |
-------------------------------------------------------------
|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|
-------------------------------------------------------------
| Byte Value |
-------------------------------------------------------------
|1f|86|98|69|0e|02|ca|16|61|85|50|ef|7f|19|da|8e|94|5b|55|5a|
-------------------------------***********----------------++|
1.offset=5a & 0x0F = a;
2.以a为偏移取后面的4个字节。85 50 ef 7f。
3.将8550ef7f的最高字节的最高位清零,处理后为0550ef7f。
将0x0550ef7f转换成十进制,并且去右边的6-8位。转换成10进制为:89190271,取右边的6-8位数即为最终的OTP密码。

现在的问题是,由于offset可能取值的范围是0-F,假如数组长度小于20,并且offset值为F,如果通过偏移取4字节的话,很可能会越界。HMAC_md5返回的长度为16,极有可能出现这种情况,如果出现了这种情况该怎么处理?
目前还不知道如何解决这个问题,望知道的朋友不吝赐教!
...全文
77 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧