用Python复现二战德军enigma机

本文介绍了作者使用Python复现二战德军Enigma加密机的过程,重点关注了转子和反射板的实现,略过了接线板部分。通过详细讲解代码逻辑,包括反射过程中的关键步骤,展示了如何构建和使用Enigma机。文章还提到了实际操作方法,包括创建配置文件、输入批次号和转轮位置以加密和解密文本。尽管只实现了26个小写字母的加密,但作者指出可通过扩展实现更多字符的加密,例如结合base64。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值