
基于 Python 的恩尼格玛(Enigma)密码机实现。
项目地址 -
GitHub | 项目地址 -
Gitee
View
README in English
开发这个项目的简单教程
安装
目前只支持 Python 3.10 及以上版本。
使用方法
导入
1
| from myenigma import Enigma
|
模块内提供了一些示例的圆盘(包括转子(rotor
)和反射器(reflector
)):
1 2
| from myenigma.sample_plate.rotor import rotor_i, rotor_ii, rotor_iii from myenigma.sample_plate.reflector import reflector_b
|
定义
转子从右向左排序:
1
| e = Enigma([rotor_iii(), rotor_ii(), rotor_i()], reflector_b())
|
加/解密
输入:
1
| assert e.input('HELLOWORLDBYTHEAUTHOROFTHISPACKAGEDINGJUNYAO') == 'ILBDAAMTAZIJNXSCSIJJPDDWZBRCCUPGQXGRJXQOFGHL'
|
更改转子位置(默认为全部转到初始位置):
1 2
| e.set_position() assert e.input('ILBDAAMTAZIJNXSCSIJJPDDWZBRCCUPGQXGRJXQOFGHL') == 'HELLOWORLDBYTHEAUTHOROFTHISPACKAGEDINGJUNYAO'
|
更改转子位置时,数字从 0 开始,从右向左排序。你也可以使用字母:
1 2 3 4
| e.set_position(3, 12, 21) assert e.input('HELLOWORLDBYTHEAUTHOROFTHISPACKAGEDINGJUNYAO') == 'XTGHAGDIVUPGBZVQSFMBSGLKVQHQWESYRTSRMOOFGRLE' e.set_position('D', 12, 21) assert e.input('XTGHAGDIVUPGBZVQSFMBSGLKVQHQWESYRTSRMOOFGRLE') == 'HELLOWORLDBYTHEAUTHOROFTHISPACKAGEDINGJUNYAO'
|
自定义
你可以自由地自定义你想要的恩尼格玛密码机。比如说,自定义转子的连线(或者说是映射):
1 2 3 4 5 6 7 8
| from myenigma.part.plate import Rotor, Reflector
rotor_I = Rotor('EKMFLGDQVZNTOWYHXUSPAIBRCJ', name='Rotor I', turnover='Q') rotor_II = Rotor('AJDKSIRUXBLHWTMCQGZNPYFVOE', name='Rotor II', turnover='E') rotor_III = Rotor('BDFHJLCPRTXVZNYEIWGAKMUSQO', name='Rotor III', turnover='V') reflector_B = Reflector('YRUHQSLDPXNGOKMIEBFZCWVJAT', name='Reflector B') e_customize = Enigma([rotor_III, rotor_II, rotor_I], reflector_B)
|
一个微型的恩尼格玛密码机:
1 2 3 4 5 6 7 8 9 10 11 12 13
| map_source = 'ASDF' e_custom_1 = Enigma( [ Rotor('AFSD', name='I', map_source=map_source), Rotor('SDAF', name='II', map_source=map_source), Rotor('DFAS', name='III', map_source=map_source), ], Reflector('DFAS', name='R', map_source=map_source), rotate_up=True, rotate_after_type=True ) assert e_custom_1.input('AA') == 'SD' e_custom_1.set_position() assert e_custom_1.input('SD') == 'AA'
|
甚至可以用别的字符!
1 2 3 4 5 6 7 8 9 10 11 12 13
| map_source_2 = '甲乙丙丁' e_custom_2 = Enigma( [ Rotor('甲丁乙丙', name='I', map_source=map_source_2), Rotor('乙丙甲丁', name='II', map_source=map_source_2), Rotor('丙丁甲乙', name='III', map_source=map_source_2), ], Reflector('丙丁甲乙', name='R', map_source=map_source_2), rotate_up=True, rotate_after_type=True ) assert e_custom_2.input('甲甲') == '乙丙' e_custom_2.set_position() assert e_custom_2.input('乙丙') == '甲甲'
|
接线板
本模块也支持接线板:
1 2 3 4 5 6 7
| e.plugboard.plug('L', 'M') e.plugboard.plug('O', 'P') assert e.input('HELLOWORLDBYTHEAUTHOROFTHISPACKAGEDINGJUNYAO') == 'IMKPJAITPZIJNXSCSIJEOEDWZBRMCUOGQXGRJXQPFGHF' e.set_position() assert e.input('IMKPJAITPZIJNXSCSIJEOEDWZBRMCUOGQXGRJXQPFGHF') == 'HELLOWORLDBYTHEAUTHOROFTHISPACKAGEDINGJUNYAO' e.unplug('L') e.unplug('P')
|
参考资料
协议
MIT 协议。