将军令是一个动态加密key,需要时钟的支持。但key时钟允许有偏差,可以是±(5-15)具体看网络延迟 策划需求设定。
参数1:序列号 -> 可以看做种子;
参数2:时间 -> 动态密码的关键;
参数3:hash和offset -> 本文中简单期间已写死,即“7”、“3”、“11”、"5" ,以及hash初始值。 此参数主要加大对key的破解难度。)
参数4:时间偏差 -> 为了简单期间散列算法不涉及,主要为了修正用户电子时钟的偏移。
算法:
获得时间:
=================================
unsigned long now = time(0);
// 精确到秒
now = now - (now % 86400 % 60);
// 在一分钟内now的值不变
=================================
时间偏差算法:
=================================
int time_offset= 8;
// 假定时间快8秒
now = now - time_offset;
=================================
接下来是重点散列算法:
=================================
unsigned long hash = 0L;
unsigned int i = 0;
const char *seed = "5890283734";
while(*seed)
{
if(( i++ & 1) == 0)
{
// 偶数
hash ^= ((hash << 7) ^ (now% *seed++) ^ (hash >> 3));
}
else
{
// 奇数
【算法|将军令算法杂谈】hash ^= (~((hash << 11) ^ (now% *seed++) ^ (hash >> 5)));
}
}
// 0xF423F 是取值<=6位数 不满6位需要补零我这就不补了。
return hash & 0xF423F;
=================================
未修正时钟程序运行结果:
-----------------------------------------------------
// 第一次
now : 1361570520
seed : 5890283734
mkey : 524856
// 第二次
now : 1361570580
seed : 5890283734
mkey : 475704
-----------------------------------------------------
ps:上述散列算法,只是为了说明将军令的动态key的由来与原理,并不保证此算法和将军令算法一致。
seed在此算法中的作用是保证相同时间戳内的不同的token不一样密码。
now在此算法中的作用是保证每分钟的密码不同。
此散列算法我并没有做碰撞测试。所以也不列概率问题。
本文中的代码来自linux c++, makefile 编译。由于篇幅问题,没有贴出全部代码。若有转载请注明出处,欢迎有兴趣的大神留言讨论。
推荐阅读
- 人工智能|干货!人体姿态估计与运动预测
- 分析COMP122 The Caesar Cipher
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- Python机器学习基础与进阶|Python机器学习--集成学习算法--XGBoost算法
- 数据结构与算法|【算法】力扣第 266场周赛
- 数据结构和算法|LeetCode 的正确使用方式
- leetcode|今天开始记录自己的力扣之路
- 人工智能|【机器学习】深度盘点(详细介绍 Python 中的 7 种交叉验证方法!)
- 网络|简单聊聊压缩网络