算法|将军令算法杂谈

将军令是一个动态加密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 编译。由于篇幅问题,没有贴出全部代码。若有转载请注明出处,欢迎有兴趣的大神留言讨论。

    推荐阅读