☰
engima机 Java实现
2026/10/7 2:16:16 网站建设 项目流程

文章目录

  • 基础介绍&参考
    • 参考
    • 介绍
    • 计算
  • 实现逻辑
    • 电路功能抽象
    • 转子内部工作原理
    • 输入字母H输出I的完整变化流程
  • 完整代码

基础介绍&参考

参考

  1. https://www.bilibili.com/video/BV1DS4y1R7hM b站恩格码机解密&原理
  2. https://www.bilibili.com/video/BV1mG411977i/ b站恩格码工作原理
  3. 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"));}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询