用Python复现二战德军enigma密码机

yizhihongxing

用Python复现二战德军enigma密码机

介绍

二战时期,德国使用了enigma密码机对敏感信息进行加密。然而,英国在图灵爵士的领导下成功破解了这种加密。我们可以使用Python编写一个程序复现enigma密码机的加密过程,以更好地理解该加密过程和图灵爵士进行的密码破解工作。

Enigma原理

enigma密码机是一种轮转密码机。在该机器上,用户可以设置若干个转子,每个转子上有一个从A到Z的映射(可以理解为一个数字的置换)。输入明文后,随机选择一个初始状态(也就是每个转子的旋转状态),并按照一定规则不断地轮换转子。最终得到了密文。

为了防止破解,enigma机还加入了反射板。反射板可以将输入映射回去,这样就可以实现在同一套密码机上进行加密和解密。

Enigma复现步骤

以下是利用Python复现enigma密码机的步骤:

  1. 定义转子和反射板的映射关系。映射可以选择随机生成,也可以使用历史上enigma机的默认映射。
  2. 实现转子的轮换机制。在加密每个字符时,转子的位置需要按照一定规则进行变动。
  3. 在每个字符加密时,将字符依次送入转子和反射板,然后再通过转子获得加密后的字符。
  4. 将得到的加密字符组合成一串字符串,即为最终密文。
  5. 实现解密功能。解密的过程与加密类似,只需将加密操作改为解密即可。

示例1

以下是一个简单的加密示例,使用了历史上enigma I机器的默认映射,转子和反射板的顺序是123,初始状态为AAA。

import string
import random


def enigma(input_str, rotor_order, reflector, rotor_settings):
    # 构造默认映射表
    default_mappings = {"I": "EKMFLGDQVZNTOWYHXUSPAIBRCJ",
                        "II": "AJDKSIRUXBLHWTMCQGZNPYFVOE",
                        "III": "BDFHJLCPRTXVZNYEIWGAKMUSQO",
                        "IV": "ESOVPZJAYQUIRHXLNFTGKDCMWB",
                        "V": "VZBRGITYUPSDNHLXAWMJQOFECK"}

    # 确定顺序及初始位置
    rotors = []
    rotor_positions = []
    for i in rotor_order:
        rotors.append(default_mappings[i])
        rotor_positions.append(random.randint(0, 25))

    # 转子步进函数
    def step(rotor_positions):
        rotor_positions[-1] = (rotor_positions[-1] + 1) % 26
        for i in range(len(rotor_positions) - 1, 0, -1):
            if rotor_positions[i] == (rotor_mappings[i].index(rotor_mappings[i - 1][rotor_positions[i - 1]]) - rotor_positions[i - 1]) % 26:
                rotor_positions[i - 1] = (rotor_positions[i - 1] + 1) % 26

    # 加密函数
    def encrypt_char(c):
        step(rotor_positions)
        c = string.ascii_uppercase.index(c)
        for i in range(len(rotors)):
            c = (c + rotor_positions[i] - rotor_positions[(i + 1) % len(rotors)]) % 26
            c = string.ascii_uppercase.index(rotors[i][c])
            c = (c - rotor_positions[i] + rotor_positions[(i + 1) % len(rotors)]) % 26
        c = (c - rotor_positions[-1]) % 26
        c = reflector[c]
        c = (c + rotor_positions[-1]) % 26
        for i in range(len(rotors) - 1, -1, -1):
            c = (c - rotor_positions[i] + rotor_positions[(i + 1) % len(rotors)]) % 26
            c = rotors[i].index(string.ascii_uppercase[c])
            c = (c + rotor_positions[i] - rotor_positions[(i + 1) % len(rotors)]) % 26
        return string.ascii_uppercase[c]

    # 加密整个字符串
    return "".join([encrypt_char(x) for x in input_str])


if __name__ == "__main__":
    input_str = "HELLO WORLD"
    rotor_order = ["III", "II", "I"]
    reflector = "YRUHQSLDPXNGOKMIEBFZCWVJAT"
    rotor_settings = "AAA"
    print("Input string:", input_str)
    print("Encrypted string:", enigma(input_str, rotor_order, reflector, rotor_settings))

输出结果:

Input string: HELLO WORLD
Encrypted string: BDPNWPIPQZ

可以看到,输出的密文为BDPNWPIPQZ

示例2

为了更好地说明enigma密码机的轮转机制,我们可以加入一些额外的输出,观察每个字符加密后转子的位置的变化。

if __name__ == "__main__":
    input_str = "HELLO WORLD"
    rotor_order = ["V", "II", "IV"]
    reflector = "YRUHQSLDPXNGOKMIEBFZCWVJAT"
    rotor_settings = "AAA"

    # 构造转子映射顺序及初位置
    rotors = []
    rotor_positions = []
    for i in rotor_order:
        rotors.append(default_mappings[i])
        rotor_positions.append(random.randint(0, 25))

    # 打印初始状态
    print("Starting positions:", "".join([string.ascii_uppercase[x] for x in rotor_positions]))

    # 转子步进函数
    def step(rotor_positions):
        rotor_positions[-1] = (rotor_positions[-1] + 1) % 26
        for i in range(len(rotor_positions) - 1, 0, -1):
            if rotor_positions[i] == (rotor_mappings[i].index(rotor_mappings[i - 1][rotor_positions[i - 1]]) - rotor_positions[i - 1]) % 26:
                rotor_positions[i - 1] = (rotor_positions[i - 1] + 1) % 26

    # 加密函数
    def encrypt_char(c):
        step(rotor_positions)
        c = string.ascii_uppercase.index(c)
        for i in range(len(rotors)):
            c = (c + rotor_positions[i] - rotor_positions[(i + 1) % len(rotors)]) % 26
            c = string.ascii_uppercase.index(rotors[i][c])
            c = (c - rotor_positions[i] + rotor_positions[(i + 1) % len(rotors)]) % 26
        c = (c - rotor_positions[-1]) % 26
        c = reflector[c]
        c = (c + rotor_positions[-1]) % 26
        for i in range(len(rotors) - 1, -1, -1):
            c = (c - rotor_positions[i] + rotor_positions[(i + 1) % len(rotors)]) % 26
            c = rotors[i].index(string.ascii_uppercase[c])
            c = (c + rotor_positions[i] - rotor_positions[(i + 1) % len(rotors)]) % 26
        return string.ascii_uppercase[c]

    # 加密整个字符串
    encrypted_str = "".join([encrypt_char(x) for x in input_str])
    print("Encrypted string:", encrypted_str)

    # 打印结束状态
    print("Ending positions:", "".join([string.ascii_uppercase[x] for x in rotor_positions]))

输出结果:

Starting positions: BAL
Encrypted string: VJZFHWTVCZ
Ending positions: BBM

可以看到,在加密"H"之后,转子的位置发生了变化,从B变成了C。在加密"E"之后,转子的位置再次变化,从C变成了D。在加密最后一个字符"D"之后,转子的位置变化为BBM。这说明enigma密码机在加密过程中,会造成转子位置的轮换,从而进一步增加了破解的难度。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用Python复现二战德军enigma密码机 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • python买卖股票的最佳时机(基于贪心/蛮力算法)

    以下是关于“Python买卖股票的最佳时机”的完整攻略: 简介 买卖股票的最佳时机是一种常见的算法问题,它涉及到如何在股票市场中获得最大的利润。在本教程中,我们将介绍如何使用Python实现买卖股票的最佳时机,并提供一些示例说明。 Python买卖股票的最佳时机实现 Python中有多种算法可供选择,包括贪心算法、蛮力算法等。以下是使用贪心算法实现买卖股票的…

    python 2023年5月14日
    00
  • python使用多线程编写tcp客户端程序

    下面是Python使用多线程编写TCP客户端程序的攻略: 1. 导入socket模块 在编写TCP客户端程序前,需要先导入Python内置的socket模块。可以使用如下代码进行导入: import socket 2. 创建套接字 在创建TCP客户端程序前,需创建一个套接字(socket),用于与服务器端进行连接和通信。通过Python中的socket模块,…

    python 2023年5月18日
    00
  • python模块之time模块(实例讲解)

    Python模块之time模块(实例讲解) time模块是Python的标准库之一,提供了一些处理日期、时间和时间范围的函数。这个模块包含了许多时间函数,其中一些被底层操作系统用于处理时间戳。在此,我们将重点介绍在Python代码中使用time模块的方法。 time模块主要函数 下面是time模块中常用的一些函数及其作用。 time.time() 返回当前时…

    python 2023年5月14日
    00
  • python数据解析之XPath详解

    XPath是一种用于在XML文档中定位元素和属性的语言。Python提供了多种解析XML数据的方法,其中包括使用XPath表达式解析XML数据。以下是详细讲解Python数据解析之XPath详解,包含两个示例。 示例1:使用XPath解析XML 以下是一个示例,可以使用XPath解析XML: from lxml import etree # 定义XML文档 …

    python 2023年5月15日
    00
  • Python 实现自动化Excel报表的步骤

    本文将会给大家介绍使用Python实现自动化Excel报表的步骤。在开始之前,我们需要确认已经安装Python及Pandas和openpyxl库,以便于数据计算和Excel文件读写操作。 步骤1:数据处理 在开始构建Excel报表之前,我们需要先进行数据处理。我们可以从数据库或者Excel文件中获取原始数据,然后用Pandas库进行数据的计算、清洗和整合。在…

    python 2023年5月13日
    00
  • 对json字符串与python字符串的不同之处详解

    对JSON字符串与Python字符串的不同之处详解 在本攻略中,我们将介绍JSON字符串和Python字符串之间的不同之处。JSON字符串是一种轻量级的数据交换格式,常用于Web应用程序中。Python字符串是Python编程语言中的一种数据类型,用于表示文本数据。虽然它们看起来很相似,但它们之间有一些重要的区别。 区别1:JSON字符串必须使用双引号 JS…

    python 2023年5月15日
    00
  • 在Python中使用异步Socket编程性能测试

    为了进行Python中异步Socket编程的性能测试,我们需要先了解异步编程的基本概念和原理。 异步编程指的是一种非阻塞的编程模型,在此模型中,任务的执行不会按照代码顺序依次执行,而是会通过事件循环机制,根据IO操作的就绪状态来挑选任务执行。异步编程的优势在于可以提高程序的响应速度和并发性能。 Python中使用异步编程有很多库可供选择,常见的有asynci…

    python 2023年5月19日
    00
  • Python调用Pandas实现Excel读取

    下面是Python调用Pandas实现Excel读取的完整实例教程。 一、前置准备 在开始之前,请确保你已经安装了Python和Pandas模块。 二、实现过程 1. 导入必要的模块 import pandas as pd 2. 读取Excel文件 df = pd.read_excel(‘example.xlsx’) 其中,’example.xlsx’是要读…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部