标签:
ENIGMA是一种复式替换序列密码体系,所谓序列密码,是指加密不分组,加密后的信息与加密前是等长的,简化了对通信buf的处理。它的强度并非很高。在商业通信中,完全不加密是危险的,过于复杂的加密也没必要。就像我们家庭,没必要像国库的安全级别,但也不能不锁门,我们通常使用的弹子锁,就是一种经济简便的安全措施。。
1 cat enigma1.c 2 3 #include <stdio.h> 4 5 #include <netcom.h> 6 7 #include <crc32.h> 8 9 /* 10 11 * A one-rotor machine designed along the lines of Enigma 12 13 * but considerably trivialized. 14 15 */ 16 17 char *des_fcrypt(); 18 19 char *crypt(); 20 21 #define ECHO 010 22 23 #include <stdio.h> 24 25 #define MASK 0377 26 27 28 29 30 31 /* 生成密码轮 */ 32 33 static enigma1_setup(pw,salt,conn) 34 35 char *pw,*salt; 36 37 struct crypt_s *conn; 38 39 { 40 41 int ic, i, k, temp; 42 43 unsigned random,seed; 44 45 char *buf,buf1[20]; 46 47 char *t1; 48 49 char *t2; 50 51 char *t3; 52 53 54 55 t1=conn->t1; 56 57 t2=conn->t2; 58 59 t3=conn->t3; 60 61 seed=ssh_crc32(pw,strlen(pw)); // seed=123; 62 63 64 65 buf=des_fcrypt(pw,salt,buf1); 66 67 for (i=0; i<13; i++) 68 69 seed = seed*buf[i] + i; 70 71 for(i=0;i<ROTORSZ;i++) { 72 73 t1[i] = i; 74 75 t3[i] = 0; 76 77 } 78 79 for(i=0;i<ROTORSZ;i++) { 80 81 seed = 5*seed + buf[i%13]; 82 83 random = seed % 65521; //random(key); 84 85 /* 生成主编码轮 t1 */ 86 87 k = ROTORSZ-1 - i; 88 89 ic = (random&MASK)%(k+1); 90 91 92 93 temp = t1[k]; 94 95 t1[k] = t1[ic]; 96 97 t1[ic] = temp; 98 99 /************************************************************************ 100 101 * 生成反射板 反射板只要不重不漏的把各点两两连接起来? 102 103 * 可以随机的 104 105 ************************************************************************/ 106 107 if(t3[k]!=0) continue; 108 109 random >>= 8; 110 111 ic = (random&MASK) % k; 112 113 while(t3[ic]!=0) ic = (ic+1) % k; 114 115 t3[k] = ic; 116 117 t3[ic] = k; 118 119 } 120 121 /* t2为t1的逆 */ 122 123 for(i=0;i<ROTORSZ;i++) 124 125 t2[t1[i]&MASK] = i; 126 127 } 128 129 130 131 void enigma1(pass, salt,string,len,conn) 132 133 char *pass,*string,*salt; 134 135 int len; 136 137 struct crypt_s *conn; 138 139 { 140 141 register char *p; 142 143 register int k; 144 145 int n1; 146 147 int n2; 148 149 char *t1,*t2,*t3; 150 151 152 153 if(!conn->pw||strncmp(conn->pw,pass,strlen(conn->pw))||strncmp(conn->salt,salt,2)) { 154 155 strncpy(conn->pw,pass,PWLEN); 156 157 strncpy(conn->salt,salt,SALTLEN); 158 159 conn->pw[PWLEN]=0; 160 161 conn->salt[SALTLEN]=0; 162 163 enigma1_setup(conn->pw,conn->salt,conn); 164 165 } 166 167 n2=n1 = 0; 168 169 p=string; 170 171 t1=conn->t1; 172 173 t2=conn->t2; 174 175 t3=conn->t3; 176 177 178 179 for(k=0;k<len;k++){ 180 181 *p++ = t2[(t3[(t1[(*p+n1)&MASK]+n2)&MASK]-n2)&MASK]-n1; 182 183 if(++n1==ROTORSZ) { 184 185 n1 = 0; 186 187 if(++n2==ROTORSZ) n2 = 0; 188 189 } 190 191 } 192 193 } 194 195 其中netcom.h中所需的内容: 196 197 #define ROTORSZ 256 198 199 #define PWLEN 16 200 201 #define SALTLEN 2 202 203 struct crypt_s { 204 205 char pw[PWLEN+1]; 206 207 char salt[SALTLEN+1]; 208 209 char t1[ROTORSZ]; /* pass.c: ROTORSZ*/ 210 211 char t2[ROTORSZ]; 212 213 char t3[ROTORSZ]; 214 215 }; 216 217 218 219 Demo程序: 220 221 #include <stdio.h> 222 223 #include<netcom.h> 224 225 226 227 extern void enigma1(char *key,char *salt,char *string,int len,struct crypt_s *enigma_s); 228 229 230 231 int main(int ac,char *av[]) 232 233 { 234 235 char buf[131702]; 236 237 char *key="agh57Dsar_~3C"; 238 239 int len,i,len1; 240 241 struct crypt_s enis; 242 243 244 245 *enis.salt=0; 246 247 memset(buf,‘A‘,sizeof(buf)); 248 249 buf[sizeof(buf)-1]=0; 250 251 while(!ferror(stdin)) { 252 253 fgets(buf,sizeof(buf),stdin); 254 255 if(feof(stdin)) break; 256 257 TRIM(buf); 258 259 len=strlen(buf); 260 261 enigma1(key+2,key,buf,len,&enis); 262 263 len1=len>30?30:len; 264 265 for(i=0;i<len1;i++) printf("%02X ",buf[i]&255); 266 267 printf("\n"); 268 269 enigma1(key+2,key,buf,len,&enis); 270 271 printf("%.100s\n",buf); 272 273 274 275 } 276 277 return 0; 278 279 } 280 281
这是一个单轮带反射器的ENIGMA加密/解密机。256个位置的转轮,可加密二进制字节信息。反射器可以转动,等价一个编码轮,或称为反射轮。它的序列长度为64K,比ENIGMA的17576长。ENIGMA之所以被破解,源于它只有3个转轮,敌方得到了这3个转轮,又得知每次3个转轮的排列、起始位置、插线板设置,就完全破解了。
我们在SDBC中的使用,每次连接时动态生成密钥,密钥是非常随机的,等于有无数个转轮。如果要破解此密码,可以设法再生t1码轮和t3反射轮(这可是相当于长达512字节的密钥),这似乎是比较困难的。再有就是对密钥的强力攻击了,这个程序是采用crypt密钥生成转轮的,强度等同于crypt。当然,也可以采用强度更高的算法生成转轮。这个算法是否应该再增加一些转轮来提高强度?我认为没必要。它主要用于网络通信,数据包通常都不会超过64K,增加转轮不过是增加序列长度,超过64K的序列并无意义,却要大幅度增加开销。
SDBC使用这个程序,基本都属于短时效数据,经过长时间破解了,已经没有意义。对于长时效数据,用户应该采用其他方法自行加密。而SDBC是支持二进制数据传输的。
标签:
原文地址:http://www.cnblogs.com/Yinxinghan/p/ENIGMA_Pasword_Machine.html