ENIGMA密码机程序
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是支持二进制数据传输的。
转载于:https://www.cnblogs.com/Yinxinghan/p/ENIGMA_Pasword_Machine.html
ENIGMA密码机程序相关推荐
- 【历史上的今天】7 月 15 日:Mozilla 基金会正式成立;Enigma 密码机的首次工作;任天堂推出 FC 游戏机
整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 7 月 15 日,在 2006 年的今天,Twttr(现在被称为 Twitter)正式推出:在 3 ...
- 【历史上的今天】2 月 23 日:Enigma 密码机申请专利;戴尔电脑创始人出生;Mellanox 收购 EZchip
整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2023 年 2 月 23 日,在 2006 年的今天,都灵冬奥会自由式滑雪男子空中技巧决赛在意大利都灵萨奥兹·杜 ...
- Enigma密码机初级解析
原文地址:http://blog.sina.com.cn/s/blog_6f06b8b101016s9r.html 写在前面 在又一次读完1001n兄的<密码传奇>之后,我决定写些 ...
- Enigma密码机原理介绍
注:本文修改自三思科学<ENIGMA的兴亡> ENIGMA ENIGMA看起来是一个装满了复杂而精致的元件的盒子.不过要是我们把它打开来,就可以看到它可以被分解成相当简单的几部分.下面的图 ...
- Enigma Sim-英格玛密码机模拟器
Enigma Sim是一款Enigma(英格玛)密码机模拟软件,能够对信息进行多表代换加密.该模拟器高度还原了二战时期德国所使用的三种型号Enigma的功能和细节,转子和反射器所对应的字母代换表都参考 ...
- 京东程序员回应“被猝死”;淘宝特价版已提交微信小程序;苹果 M1 单核性能勇超 Intel 11 代 i7|极客头条...
「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 丁恩华 出品 | CSDN(ID:CSDNnews ...
- 【译文】程序语言简史
1801 - Joseph Marie Jacquard用打孔卡为一台织布机编写指令,在挂毯上织出了"hello, world"字样.当时的reddit网友对这项工作的反响并不热烈 ...
- 这几部适合程序员看的电影!一定要安利给你们!烧脑必备
往期热门文章:1.<往期精选优秀博文都在这里了!> 2.17 张程序员专属壁纸,太太太太太太骚了- 3.刚刚,腾讯每人发100股:市值7万,不算年终奖!员工:愿为小马哥拼命 4.在 IDE ...
- 二战时图灵机破译的Enigma密码,现在AI仅需13分钟便可破译
点击有惊喜 第二次世界大战期间,布莱切利园是英国破译密码的中心.图灵当时也在那里工作.密码破译者的天才工作挽救了许多平民和士兵的生命,据说将战争缩短了两年. Enigma密码机非常复杂,它最先进的化身 ...
最新文章
- hive进行词频统计
- 项目中使用oracle序列
- 成都python工作-在成都学习Python能做什么?到底有没有发展前途?
- 配置环境将win32项目移植到Android
- presto-docker运行
- Object-C 入门
- 计算机操作系统(5):操作系统的结构设计
- Vivado生成bit文件报错彻底解决
- 多个Excel合并为一个Excel表
- django模型多对一 多对多 一对一三种关系解读
- MySQL官方教程及各平台的安装教程和配置详解入口
- 计算机画图 教学反思,画图教学反思
- 视频教程-微信公众号二维码签到和抽奖软件-微信开发
- 【其他】Tensorflow分布式使用简介
- 网站流量不是很多,还有这几十种途径让网站变现转化
- mysql笛卡尔积查询很慢_浅谈MySQL使用笛卡尔积原理进行多表查询
- 100天搞定机器学习(100-Days-Of-ML)(一)数据预处理
- android+8g开机剩余,8G内存的iQOO开机只剩4G,Jovi没用,网友直言后悔了
- 电竞英雄联盟数据API接口 - 【联赛列表】API调用示例代码
- PowerBI visuals共计246组2020年1月31日扒取(Power BI 视觉对象)
热门文章
- 论文《Neural News Recommendation with Attentive Multi-View Learning》阅读
- Map对象转换为一个实体类对象
- mysql show where_MySQL SHOW命令使用详解
- SQL学习(组合查询)
- 20221224英语学习
- 用c语言编写1x3 5x7,c语言编程例题及答案-20210315033236.docx-原创力文档
- 2023基于微信小程序的大学生科技竞赛竞技报名管理系统(springboot+mysql)-JAVA.VUE(论文+开题报告+运行)
- 红黑树是什么?红黑树的作用?红黑树的调整?
- bes2300之电源管理(六)
- Kinect开发之获取彩色摄像头数据