文章目录
- 基础介绍&参考
- 参考
- 介绍
- 计算
- 实现逻辑
- 电路功能抽象
- 转子内部工作原理
- 输入字母H输出I的完整变化流程
- 完整代码
基础介绍&参考
参考
- https://www.bilibili.com/video/BV1DS4y1R7hM b站恩格码机解密&原理
- https://www.bilibili.com/video/BV1mG411977i/ b站恩格码工作原理
- https://www.101computing.net/enigma-machine-emulator/ 基础原理&在线模拟器
介绍
- 最上方为转子 每个转子可设定初始位置(可以认为是对称加密的密钥
- 转子下面是输出 当从输入端输入后 亮的字母即为输出
- 输入端
- 最下面为交换机 在输入和输出再次交换字母(本次代码未处理
计算
其状态可能性为
26 3 ∗ s w i t c h ( 26 , 20 ) 26^3 * switch(26,20)263∗switch(26,20)
switch(26,20) 为 26个字母选择 20 个两两交换
s w i t c h ( 26 , 20 ) = C ( 26 , 20 ) ∗ 两两组合 ( 20 ) = C ( 26 , 20 ) ∗ 20 ! 2 10 ∗ 10 ! = 26 ! 6 ! 2 10 ∗ 10 ! \begin{aligned} switch(26,20) &= C(26,20) * 两两组合(20) \\ &= C(26,20) * \frac{20!}{2^{10} * 10!} \\ &= \frac{26!}{6!2^{10}*10!} \end{aligned}switch(26,20)=C(26,20)∗两两组合(20)=C(26,20)∗210∗10!20!=6!210∗10!26!
两两组合可以理解为先把20个字母全排列,
- 再除以每个组合内部的顺序 (A,B) 和 (B,A) 是一样的
- 组合之间的顺序 10个之间前后不影响结果 10!
实现逻辑
完整交互图
https://drive.google.com/file/d/1dL270rjVfZlA1ZKzYgo1uhUkKk_gq2n5/view?usp=drive_link
电路功能抽象
流程如下 (忽略交换):
转子内部工作原理
- 正向 过偏移 ->正向映射 -> 过偏移
- 反向 过偏移 ->反向映射 -> 过偏移
偏移部分,每个转子有内部触点、外部触点,转子旋转后内部和外部触点的映射关系会变化 示意图如下 (实际内外各26个触点 这里只画了4个
看图旋转k次后 从外部到转子内部需要+k偏移 同理出的时候-k偏移
映射部分engima具有自反性 转子正向输入时如果将
- A->B, C->A
则反向时 - A->C B->A
输入字母H输出I的完整变化流程
完整代码
publicclassEngimaRun{publicEngimaRun(){this.rotate3=newRotate("EKMFLGDQVZNTOWYHXUSPAIBRCJ",1,"转1");this.rotate2=newRotate("AJDKSIRUXBLHWTMCQGZNPYFVOE",1,"转2");this.rotate1=newRotate("BDFHJLCPRTXVZNYEIWGAKMUSQO",1,"转3");this.reflect=newReflects("YRUHQSLDPXNGOKMIEBFZCWVJAT");}publicstaticclassRotate{protectedMap<Character,Character>map=newHashMap<>();privateMap<Character,Character>reverse=newHashMap<>();privateintindex;privateStringname;publicRotate(StringmapStr,intidx,Stringname){for(inti=0;i<26;i++){charorder=(char)('A'+i);map.put(order,mapStr.charAt(i));reverse.put(mapStr.charAt(i),order);}index=idx-1;this.name=name;}publicCharacterforward(charc){returnget(c,map);}publicCharacterbackward(charc){returnget(c,reverse);}protectedCharacterget(charc,Map<Character,Character>map){intnewChar=(c-'A'+index)%26;charoffset=(char)('A'+newChar);charres=map.get(offset);newChar=(res-'A'-index+26)%26;/* System.out.printf("%s index %s->%s->%s->映射->%s->出口->%s->%s%n", name, index, c, (index == 0 ? "" : "偏转->" + offset), res, (index <= 0) ? "" : "偏转", (char) (newChar + 'A'));*/return(char)(newChar+'A');}publicbooleannext(){if(index==0){++index;returnfalse;}if(++index%26==0){returntrue;}returnfalse;}}publicstaticclassReflectsextendsRotate{publicReflects(StringmapStr){super(mapStr,1,"反0");}publicReflects(){super("YRUHQSLDPXNGOKMIEBFZCWVJAT",1,"反0");}publicCharacterreflect(charc){returnget(c,map);}}privateRotaterotate1;privateRotaterotate2;privateRotaterotate3;privateReflectsreflect;privatecharsecretChar(Characterch){if(rotate1.next()){if(rotate2.next()){rotate3.next();}}charres=rotate1.forward(ch);res=rotate2.forward(res);res=rotate3.forward(res);res=reflect.reflect(res);res=rotate3.backward(res);res=rotate2.backward(res);res=rotate1.backward(res);returnres;}privateStringmsg(Stringinput){input=input.toUpperCase();StringBuilderresult=newStringBuilder();for(inti=0;i<input.length();i++){result.append(secretChar(input.charAt(i)));}returnresult.toString();}privatestaticStringinitRun(Strings){returnnewEngimaRun().msg(s);}publicstaticvoidmain(String[]args){/*Reflects reflects = new Reflects(); for (int i = 0; i < 26; i++) { char c = (char) ('A' + i); char r = reflects.forward(c); Assert.isTrue(c == reflects.reflect(r), String.format("%s %s not eq", r, c)); }*//*EngimaRun engimaRun = new EngimaRun(); System.out.println("\n" + engimaRun.msg("H")); engimaRun = new EngimaRun(); System.out.println("\n" + engimaRun.msg("M"));*//*System.out.println(initRun("E")); System.out.println(initRun("V")); System.out.println(initRun(initRun("E"))); Assert.isTrue( "E".equals(initRun(initRun("E"))), "E not eq" );*//* engimaRun = new EngimaRun(); System.out.println(engimaRun.msg("I"));*///System.out.println(initRun("AAAAA"));/* System.out.println(initRun("HelloWorld")); System.out.println(initRun("MFNCZBBFZM"));*/System.out.println(initRun("HELLOWORLD"));}}