将军令算法杂谈

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

猜你喜欢

转载自windflyboy.iteye.com/blog/1829490