基于“均态分布”随机数算法的一次性口令OneTimePassword(原创)
/* 所谓均态分布随机数算法是指:每个数(整数或实数)无序地分布在数轴上,值只出现一次永不重复。体现了香农的一次一密理论。
* 均体现在每个数的值是平均概率,即都有出现;态体现在每个数在数轴上的位置是惟一性。
* 有别于函数式伪随机数算法的缺陷:已经有文献说明,输出一亿个函数式伪随机数,就能估算它的算法了,即函数式伪随机数算法可以被破解。
* 均态分布随机数算法分为真均态分布随机数算法和伪均态分布随机数算法。
* 真均态分布随机数算法是一种接近自然随机数的算法,没有文献说明能被破解,即不可破解。因为数轴是无穷大的,根本不能出现重复的值,亦即不可循环。
* 伪均态分布随机数算法是有限的,值会重复,亦即会循环。那么就有可能被破解,只是暂时没有找到破解算法。
* 本程序算法是基于伪均态分布随机数算法,是本人原创首创独创。既可以用于SSH作为登入口令,又可以作加解密算法。
*/
// 在 X86_32/X86_64 平台上的 Windows 用 DevCPP 编译通过,在 X86_32/X86_64 平台上的 Linux、*BSD、MacOS 用 gcc 编译通过。
// 用法:(Windows)OneTimePassword password 或(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[i] = 32 + rand() % 95;
for(unsigned long long j = 0; j < i; ++j)
{
if(aucKeyTable[j] == aucKeyTable[i])
{
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) %s
“, 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;
}
基于“均态分布”随机数算法的一次性口令OneTimePassword(原创)
原文地址:https://www.cnblogs.com/Wu-Yao-hui/p/13305025.html