您当前的位置:首页 > 计算机 > 编程开发 > C语言

一次性口令(OneTimePassword)C语言源码

时间:10-27来源:作者:点击数:
城东书院 www.cdsy.xyz

此算法技术是一种接近自然随机数算法:均态分布随机数算法(非正态分布/高斯分布随机数算法,更不是函数式伪随机数算法)。

可能是超简单、超快速、超高效的口令生成器。

/*

所谓均态分布随机数算法是指:每个数(整数或实数)无序地分布在数轴上,值只出现一次永不重复。体现了香农的一次一密理论。

* 均体现在每个数的值是平均概率,即都有出现;态体现在每个数在数轴上的位置是惟一性。

* 有别于函数式伪随机数算法的缺陷:已经有文献说明,输出一亿个函数式伪随机数,就能估算它的算法了,即函数式伪随机数算法可以被破解。

* 均态分布随机数算法分为真均态分布随机数算法和伪均态分布随机数算法。

* 真均态分布随机数算法是一种接近自然随机数的算法,没有文献说明能被破解,即不可破解。因为数轴是无穷大的,根本不能出现重复的值,亦即不可循环。

* 伪均态分布随机数算法是有限的,值会重复,亦即会循环。那么就有可能被破解,只是暂时没有找到破解算法。

* 本程序算法是基于伪均态分布随机数算法,既可以用于SSH作为登入口令,又可以作加解密算法。

*/

// 在 X86_32/X86_64 平台上的 Windows 用 DevCPP 编译通过,在 X86_32/X86_64 平台上的 Linux、*BSD、MacOS 用 gcc 编译通过。

// 用法:(Windows)OneTimePasswordpassword或(Linux、*BSD、MacOS)./OneTimePassword password

#include    <stdio.h>
#include    <stdlib.h>
#include    <time.h>

#define    AMOUNT    64

int main(int argc, char *argv[])
{
// 95+1个可打印字符密码本
    unsigned char aucKeyTable[96];

// 这个字符任意
    aucKeyTable[95] = 36;

    srand((unsigned int)time(NULL));

// 用函数式伪随机数算法初始化密码本
    for(unsigned long long i = 0; i < 95; ++i)
    {
LOOP:
        aucKeyTable = 32 + rand() % 95;

        for(unsigned long long j = 0; j < i; ++j)
        {
            if(aucKeyTable[j] == aucKeyTable)
            {
                goto LOOP;
            }
        }
    }

    unsigned long long ulPasswordLength = -1;

// 口令任意长度,从一到无穷大均可。
    while(argv[1][++ulPasswordLength]);

    for(unsigned long long i = 1; i <= AMOUNT; ++i)
    {
// 输出口令
        for(unsigned long long j = 0; argv[1][j]; ++j)
        {
            argv[1][j] = aucKeyTable[argv[1][j] % 96];
        }

        printf("One Time Password(%lu)\t%s\n", i, argv[1]);

// 伪均态随机数算法,这个就是算法的核心。
        for(unsigned long long k = 0; k < 12; ++k)
        {
            unsigned long long ulKeyIndex, ulKeyTemp, *pulKeySwap1 = (unsigned long long*)aucKeyTable, *pulKeySwap2 = (unsigned long long*)aucKeyTable;

            if(i & 1)
            {
                ulKeyIndex = argv[1][k % ulPasswordLength] % 12;
            }
            else
            {
                ulKeyIndex = rand() % 12;
            }

            ulKeyTemp = pulKeySwap1[k];

            pulKeySwap1[k] = pulKeySwap2[ulKeyIndex];

            pulKeySwap2[ulKeyIndex] = ulKeyTemp;
        }
    }

    return 0;
}

 

城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐