Enigma源自希腊文,英文解释为:“迷,费解之物”。
我们知道,enigma机是德军二战中重要的情报加密机器,其有许多特点。
首先,它是一台加解密一体机
其次,它有排己性,虽然多次输入同一明文可能得到不同的密文,但明文a永远不可能加密为其本身。这样完美掩盖本身明文的性质是由反射板造成的,但也最终在图灵的利用下给了enigma机致命一击。
enigma机先后有多种不同的型号,如3转轮型,5转轮型,5转轮选3转轮型等等。本人对三转轮enigma机进行的程序复现。需要说明的是,由于enigma机的精华部分是转子和反射板,所以代码中也着重复现了这一过程,而对接线板进行了省略。毕竟,enigma机的厉害之处在于其疯狂到近乎变态的做到了几乎“一字一换表”,而接线板只是做简单的字母替换,本身并无新意。
话不多说,直接上代码:(一些使用说明见文末)
# -*- coding: utf-8 -*-
"""
Created on Tue Jan 4 09:40:42 2022
@author: burger
"""
from numpy import random
import numpy as np
import time
arr = np.array(['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'])
#输入一个批次号
num = input('请输入您要使用的enigma机批次号XXX-XXX-XXX(示例:123-456-789)\n')
filename = 'enigma_code_book.txt'
with open(filename) as file_object:
context = file_object.read()
if num in context:
number = context.find(num)
arr_a=context[(number+12):(number+38)] #一号转轮
arr_b=context[(number+39):(number+65)] #二号转轮
arr_c=context[(number+66):(number+92)] #三号转轮
arr_d=context[(number+93):(number+119)] #反射板
else:
arr_a=random.permutation(arr)
arr_b=random.permutation(arr)
arr_c=random.permutation(arr)
arr_d=random.permutation(arr)
with open(filename,'a') as file_object:
str_1='\n'
str_1=str_1+num
str_1+=' '
for i in range(len(arr_a)):
str_1+=arr_a[i]
str_1+=' '
for i in range(len(arr_b)):
str_1+=arr_b[i]
str_1+=' '
for i in range(len(arr_c)):
str_1+=arr_c[i]
str_1+=' '
for i in range(len(arr_d)):
str_1+=arr_d[i]
str_1+=' '
file_object.write(str_1)
zzwz=input('请输入初始转子位置(规范为三个英文字母中间加两个英文逗号)\n eg: a,b,c\n')#zzwz即转子位置
zz_1=list(zzwz)[0]
zz_2=list(zzwz)[2]
zz_3=list(zzwz)[4]
num_zz_1=ord(zz_1)-97
num_zz_2=ord(zz_2)-97
num_zz_3=ord(zz_3)-97
def main():
global num_zz_1
global num_zz_2
global num_zz_3
text=input('请输入加密内容\n')
for n in range(len(text)):
string=list(text)[n]
print(zhuanhuan(string),end='')
num_zz_1+=1
if num_zz_1 == 26:
num_zz_1 = 0
num_zz_2+=1
if num_zz_2 == 26:
num_zz_2=0
num_zz_3+=1
if num_zz_3 == 26:
num_zz_3 = 0
def zhuanhuan(letter):
#a号转轮
#右侧有26个触点
#生成a轮的随机连线方式
a_1_1=False
a_1_2=False
a_1_3=False
a_1_4=False
a_1_5=False
a_1_6=False
a_1_7=False
a_1_8=False
a_1_9=False
a_1_10=False
a_1_11=False