ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

engima机 Java实现

engima机 Java实现 文章目录基础介绍参考参考介绍计算实现逻辑电路功能抽象转子内部工作原理输入字母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?uspdrive_link电路功能抽象流程如下 忽略交换转子内部工作原理正向 过偏移 -正向映射 - 过偏移反向 过偏移 -反向映射 - 过偏移偏移部分每个转子有内部触点、外部触点转子旋转后内部和外部触点的映射关系会变化 示意图如下 实际内外各26个触点 这里只画了4个看图旋转k次后 从外部到转子内部需要k偏移 同理出的时候-k偏移映射部分engima具有自反性 转子正向输入时如果将A-B, C-A则反向时A-C B-A输入字母H输出I的完整变化流程完整代码publicclassEngimaRun{publicEngimaRun(){this.rotate3newRotate(EKMFLGDQVZNTOWYHXUSPAIBRCJ,1,转1);this.rotate2newRotate(AJDKSIRUXBLHWTMCQGZNPYFVOE,1,转2);this.rotate1newRotate(BDFHJLCPRTXVZNYEIWGAKMUSQO,1,转3);this.reflectnewReflects(YRUHQSLDPXNGOKMIEBFZCWVJAT);}publicstaticclassRotate{protectedMapCharacter,CharactermapnewHashMap();privateMapCharacter,CharacterreversenewHashMap();privateintindex;privateStringname;publicRotate(StringmapStr,intidx,Stringname){for(inti0;i26;i){charorder(char)(Ai);map.put(order,mapStr.charAt(i));reverse.put(mapStr.charAt(i),order);}indexidx-1;this.namename;}publicCharacterforward(charc){returnget(c,map);}publicCharacterbackward(charc){returnget(c,reverse);}protectedCharacterget(charc,MapCharacter,Charactermap){intnewChar(c-Aindex)%26;charoffset(char)(AnewChar);charresmap.get(offset);newChar(res-A-index26)%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)(newCharA);}publicbooleannext(){if(index0){index;returnfalse;}if(index%260){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();}}charresrotate1.forward(ch);resrotate2.forward(res);resrotate3.forward(res);resreflect.reflect(res);resrotate3.backward(res);resrotate2.backward(res);resrotate1.backward(res);returnres;}privateStringmsg(Stringinput){inputinput.toUpperCase();StringBuilderresultnewStringBuilder();for(inti0;iinput.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));}}
返回列表