/* 所謂均态分布随機數算法是指:每個數(整數或實數)無序地分布在數軸上,值隻出現一次永不重複。展現了香農的一次一密理論。
* 均展現在每個數的值是平均機率,即都有出現;态展現在每個數在數軸上的位置是惟一性。
* 有别于函數式僞随機數算法的缺陷:已經有文獻說明,輸出一億個函數式僞随機數,就能估算它的算法了,即函數式僞随機數算法可以被破解。
* 均态分布随機數算法分為真均态分布随機數算法和僞均态分布随機數算法。
* 真均态分布随機數算法是一種接近自然随機數的算法,沒有文獻說明能被破解,即不可破解。因為數軸是無窮大的,根本不能出現重複的值,亦即不可循環。
* 僞均态分布随機數算法是有限的,值會重複,亦即會循環。那麼就有可能被破解,隻是暫時沒有找到破解算法。
* 本程式算法是基于僞均态分布随機數算法,是本人原創首創獨創。既可以用于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)\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;
}