这个高级的生成器:
可以用来替换压缩包里的生成器,不过参数多了一个,可以支持二进制key,从1字节到512字节都可以,想暴力破解的先琢磨琢磨。个别部位要修改一下。
里边的crc32仅用于随机数的种子,与安全性关系不大。
【 在 ylh1969 的大作中提到: 】
: 见6楼。
: 这个AI的评价已经相当高了。
: 不过,应该指出,它里边说的CRC啥的,都是在生成转轮中出现的。转轮的随机性并不完全依赖CRC,它只是随机的一个因素。
: ...................
#include <string.h>
#include <crc32.h>
#include <enigma.h>
/*
* A one-rotor machine designed along the lines of Enigma
* but considerably trivialized.
*/
#define MASK 0377
/* 生成密码轮 */
void enigma_init(ENIGMA t,const char *bin_key,int len)
{
int ic, i, k,random,seed;
signed char temp,*t1,*t2,*t3;
if(!t || !bin_key) return;
if(len<=0 && !(len=strlen(bin_key))) return;
seed=(int)ssh_crc32((unsigned char *)bin_key,len);
t1=t[0]; t2=t[1]; t3=t[2];
// 设置ic,初始化的自旋
ic=seed;
for(i=0;i<len;i++) ic += bin_key[i];
ic &= MASK;
//printf("%s:len=%d,seed=%d,ic=%d\n",__FUNCTION__,len,seed,ic);
// ic,初始化的自旋
for(i=0;i<ROTORSZ;i++) {
t1[i] = (i+ic) & MASK;
t3[i] = 0;
}
if(len>ROTORSZ) {//如果密钥长于ROTORSZ,使用最后一部分
bin_key += len-ROTORSZ;
len = ROTORSZ;
}
for(i=0;i<ROTORSZ;i++) {
seed = (seed<<1) + (signed)bin_key[i%len];
random = (seed&0X7FFFFFFF) % 65529; //random(key);
// 以上生成尽可能随机的random,你有充分的自由度选择你的算法
/* 生成主编码轮 t1 */
k = ROTORSZ-1 - i;
ic = random % (k+1);
temp = t1[k]; t1[k] = t1[ic]; t1[ic] = temp;
/************************************************************************
* 生成反射轮 反射轮只要不重不漏的把各点两两连接起来即可,
************************************************************************/
if(t3[k]!=0) continue;
ic = (random&MASK) % k;
while(t3[ic]!=0) ic = (ic+1) % k;
t3[k] = ic; t3[ic] = k;
}
/* t2为t1的逆 */
for(i=0;i<ROTORSZ;i++)
t2[t1[i]&MASK] = i;
/*
char buf[200],*cp;
cp=buf;
for(i=0;i<32;i++)
cp+=sprintf(cp,"%02X ",t1[i]&255);
ShowLog(5,"%s:len=%d,t1=%s",__FUNCTION__,len,buf);
*/
}
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*