使用 python 实现恩尼格码的加密

article/2025/10/2 8:41:38

使用 python 实现恩尼格码的加密

  • 又是摸鱼的一天
  • 查阅资料,尝试理解恩尼格码
    • 字符的映射
    • 混淆的次数
    • 反射板和转接线的设置
    • 描述转子转动的规律
    • 完整代码的实现
  • 实现过程的复盘

又是摸鱼的一天

今天在问答胡混的时候,看到一个提问,关于恩尼格码的 https://ask.csdn.net/questions/7579065?answer=53605305,然后上网找了找资料 https://blog.csdn.net/weixin_30807779/article/details/98515455,嗯,看起来不难,于是就尝试这写了一个小python玩玩

查阅资料,尝试理解恩尼格码

字符的映射

首先,需要知道转子的路线,即字符对应关系

比如资料中,在这里插入图片描述
那么,这个转子描述出来就是 badfec,很简单就能描述清楚

混淆的次数

然后,我们需要知道转子的数量及顺序,嗯,用一个列表就好,如问答中的内容,六个转子,那么我的描述就是

rotor = ['coipytrewqasdughjklmnbvfxz','hpxyrngaltiocjvbekzmdqwusf','enopmlusaxwrjzchygtfvbqdik','rweutyoiqpasdfghjklzxcnbvm','rsdfqweabxcvtymiopghjklznu','yklnaocdreimbgjhxtzsquvfpw']

反射板和转接线的设置

由于还有转接线板和反射线板,所以需要一个字典对应,毕竟这个可不一定是可以一一对应的,a->b,b->d,反射和接线都会可能存在这个情况,所以,我们用两个字典来进行描述

link = {"a" : "x" , "x" : "a" , "b" : "j" , "j" : "b" , "c" : "g" , "g" : "c" ,"d" : "o" , "o" : "d" , "e" : "p" , "p" : "e" , "f" : "y" , "y" : "f" ,"h" : "q" , "q" : "h" , "i" : "u" , "u" : "i" , "k" : "m" , "m" : "k" ,"l" : "v" , "v" : "l"}
reverser = {'b' : 'a' , 'a' : 'b' , 'c' : 'p' , 'd' : 'q' , 'e' : 'r' , 'f' : 'k' , 'g' : 't' , 'h' : 'u' ,'i' : 'v' , 'j' : 'w' , 's' : 'x' , 'l' : 'y' , 'm' : 'z' , 'n' : 'o' , 'o' : 'n' , 'p' : 'c' ,'q' : 'd' , 'r' : 'e' , 'k' : 'f' , 't' : 'g' , 'u' : 'h' , 'v' : 'i' , 'w' : 'j' , 'x' : 's' ,'y' : 'l' , 'z': 'm'}

描述转子转动的规律

再然后就是转子的转动规律了,根据电文中字母的位置,来确定转子的转动情况

所以,先写一个转子转动后,初始字母表的对应,这里还有正转反转之分,天知道该怎么转,我选择一种作为正转,大家不要较真

def TurnRotor(m,n):chars = 'abcdefghijklmnopqrstuvwxyz'z = m//26**n%26if z>0:chars = chars[-z:]+chars[0:-z] # 这个是正转#chars = chars[z:]+chars[0:z] # 这是反转return chars

这个方法是什么意思呢,就是根据你当前的字母位置,以及转子位置,来确定初始字母表

例如,第一个字母,初始字母表就是 abcdef…,不管多少转子都一样

然后,第二个字母,第一个转子的初始字母表就是 zabcdef…xy 了,其他转子不动

再然后,第三个字母,第一个转子的初始字母表是 yzabcd…uvwx,其他继续不懂

嗯嗯。。。第二十六个字母,第一个转子的初始字母表又变成abcdef…xyz了,第二个转子则编程了 zabcdef…xy,其他继续不动。。。

就这么个规律,一个方法实现出来

完整代码的实现

然后,就是具体的加密过程了

def Enigma(rotors,linker,reverser,text):r = ''for i in range(len(text)):lines = [{TurnRotor(i,n)[rotors[n].index(x)]:x for x in rotors[n]} for n in range(len(rotors))]e = []e.append(text[i])e.append(e[-1] if list(link).count(e[-1])==0 else link[e[-1]])for c in lines:e.append(c[e[-1]])e.append(reverser[e[-1]])for c in range(len(lines),0,-1):e.append(list(lines[c-1].keys())[list(lines[c-1].values()).index(e[-1])])e.append(e[-1] if list(link).count(e[-1])==0 else link[e[-1]])#print(e)r += e[-1]return r

定义一个Enigma的方法,初始值需要传入四个参数,分别是转子列表,接线板字典,反射线板字典,以及需要加密或解密的文本内容了,恩尼格码的有趣之处在于,原文加密后得到密文,密文再次加密后得到原文,即:加密和解密算法是完全一致的!

实现过程的复盘

好了,现在来看看老顾写这个方法的思路

首先定义一个字符串r,用来保存加密后的内容

然后,按照字符串长度来遍历字符串,为什么用长度呢,因为需要根据这个字母所在位置来确定转子的转动情况咯

然后,根据转子的情况,以及字母顺序来确定转子的对照表~~~

lines = [{TurnRotor(i,n)[rotors[n].index(x)]:x for x in rotors[n]} for n in range(len(rotors))]

得到各个转子在当前字母顺序时的映射关系字典

我在这里用了一个数组 e ,这个其实是用来记录,每经过一个线板(包括转子、反射、接线)时,字母的变化,其实可以简化掉它

先记录初始字母,我用的是哪个字母

然后,按照接线对字母进行映射

然后,按照转子数量进行映射

然后,按照反射进行映射

然后,按照转子数量反向映射

然后,按照接线进行反射映射(代码中没体现,因为问答中的例子,接线的反向映射与正向映射一致,如有需要可自行修改这一行)

这就得到了所有的字母变化过程,我们取最后一次变化的内容,添加到变量r之后,也就是返回的密文

然后,就得到结果啦

在这里插入图片描述
整个代码,其实就是两个方法就实现了,其他的都是自定义的初始值了,很简单的规律啦

当然,如果只有密文和原文,是推算不出转子、反射、接线的,毕竟有初始值和没初始值是两回事 ^ v ^


http://chatgpt.dhexx.cn/article/BTsP1vMT.shtml

相关文章

密码分析学-Enigma机破解

密码分析学 Enigma机破解 目录 作业要求摘要正文一:Enigma机加密1.1 背景1.2 加密原理1.3 安全性分析1.4 加密算法实现 二:Enigma解密2.1 历史上的解密2.2 Enigma机破解原理2.2.1 寻找明密文对关系 -- Ciber2.2.2 通过环路屏蔽接线板2.2.3 还原接线板 2…

密码学的发展(第二篇:恩尼格码机)

1、恩尼格玛机 恩尼格码机又叫英格玛机、哑谜机器或者奇谜机,它在二战中大放异彩。它使用的本质还是第二代机密法----替代和移位。但因为可以切换无穷种加密配套组合,所以在对抗频率分析上极为有效。 恩尼格玛机是一种机械电子式的加密机,由…

密码学简史(一)--- 谍战中的古典密码学

文章目录 1. 隐藏法2. 移位法与替代法3. 维吉尼亚加密法3.1 维吉尼亚加密法的破解3.2 维吉尼亚加密法2.0版3.3 维吉尼亚加密法3.0版 4. 恩尼格玛密码机(Enigma)4.1 第一代恩尼格玛机的破解4.2 第二代恩尼格玛机的破解 更多文章: 密码学数千年的发展史,加…

MATLAB实现Enigma 密码机

Matlab 模拟实现 enigma 密码机。密码机包含三个转子和反射器,满足以下条件: 1. 输入信号从左往右通过各个转子(在到达反射器之前); 2. 根据输入信号的流经次序,从左到右将转子依次标号为转子 1、转子 2、…

通过Java实现恩尼格玛密码机

1 简介 前一段时间看了B站介绍恩尼格玛密码机的视频,试了试用Java来实现一台恩尼格玛密码机,在此文章中来简单介绍自己实现的思路和代码以供大家学习参考,如有错误,欢迎指出。 单表替换密码会由于字母分布的规律被破解出来&…

加密解密工具 之 恩尼格玛密码机密码

工具链接:http://www.atoolbox.net/Tool.php?Id993 恩尼格码密码机及加密原理 恩尼格码密码机是二战时期的纳粹德国及其盟国,特别是德国军方所使用的一种高级机械加密系统,以转子结构为主体。 密码机一般装在一个盒子里。当要加密一串字符…

恩尼格玛密码机原理解析(Enigma principle )

恩尼格玛机也结合了机械系统与电子系统。机械系统包括了一个包含了字母与数字的键盘,相邻地排列在一个轴上的一系列名为“转子” 的旋转圆盘,还有一个在每次按键后就使一个或几个转子旋转的装置。各种恩尼格玛机上的机械系统都各为不同,但是&…

使用HttpClient模拟POST请求

HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。当前官网最新版介绍页是:http://hc.apache.org/httpcomponents-client-4…

fastmock模拟post、get请求

参考资料: fastmock 帮助文档 初学者可以根据这个文档了解如何创建项目 【前端必备基本技能】-fastMock平台使用_哔哩哔哩_bilibili 如果觉得文档不好理解的小伙伴可以看这个视频,本人觉得讲的很仔细。 Mock.js 实例练习: get请求 …

TCP模拟HTTP请求

HTTP的特性 HTTP是构建于TCP/IP协议之上,是应用层协议,默认端口号80 HTTP协议是无连接无状态的 HTTP报文 请求报文 HTTP协议是以ASCⅡ码传输,建立在TCP/IP协议之上的应用层规范。 HTTP请求报文由请求行(request line)、…

使用postman模拟post、get请求

postman通常作为一种接口测试工具,如:采用post、get等方式,模拟对接口进行访问,用于查看接口功能是否正常。 模拟POST请求 选择请求方式为POST 设置请求url地址 http://localhost:8081/webside/subSystemLogin.html 选择Header…

如何简单的模拟发送http post请求

有天在做项目演示的时候要用到post请求的模拟发送,为此总不至于写一个html页面,当时只记得百度了一下模拟发送http post请求,方法大概都是说用fiddler工具或者使用cmd内置telnet客户端模拟http请求。 这里抄送附上fiddler工具和telnet模拟po…

接口测试中模拟post四种请求数据

转自 作者:隋胖胖LoveFat 链接:https://www.jianshu.com/p/3b6d7aa2043a 来源:简书 一、背景介绍 在日常的接口测试工作中,模拟接口请求通常有两种方法,fiddler模拟和HttpClient模拟。 Fiddler是一个简单的http协议调…

谷歌学术访问

https://via.hypothes.is/ 不需要镜像,不需要任何操作,只需打开这个网站,输入你要访问的学术网站,秒开 第一步: 第二步:

谷歌学术(google scholar)个人主页的论文信息不准确怎么办?

题目:谷歌学术(google scholar)个人主页的论文信息不准确怎么办? 谷歌学术主页是很多人展示自己学术成果的一种方式,但很多时候,谷歌自动给你聚集到主页的论文信息是有误的,这时候怎么去编辑呢? 论文信息…

谷歌学术介绍

转载自:http://blog.renren.com/share/111541487/15517062888 “谷歌学术”是谷歌搜索引擎中的学术检索部分,相对于知网、维普、万方、Pubmed等专业的论文数据库来说功能单薄了些,但具有页面简约、搜索速度快、集国内外文献于一体、某些文章可…

Google 学术搜索(Google Scholar)使用技巧

本文简介Google 学术搜索(Google Scholar)使用技巧, 关于Web Of Science 上搜索文献,查看SCI分区及影响因子情况参见我的另一篇博客(https://xiongyiming.blog.csdn.net/article/details/78474211) Google…

【谷歌学术】使用指南

【谷歌学术】使用指南 谷歌可以清楚看到作者的影响力,尤其是在衡量一个学者有多厉害,论文质量有多高【往往是博士阶层往上】 谷歌学术网站: https://scholar.google.com.hk/?hlzh-CN 查人 查论文都很好用 同时你订阅这个作者 还会收到他…

如何在谷歌学术下载论文

如何在谷歌学术下载论文(在Mac Pro上记录,但是windows应该同样适用) 1 下载谷歌浏览器 下载谷歌浏览器 官网截图如下: 2 下载谷歌浏览器扩展程序 googlehelper下载 在下载的时候,要记住下载的位置,后面…

谷歌学术搜索

Google Scholar (谷歌学术搜索,简称GS)是一个可以免费搜索学术文章的网络搜索引擎索引了出版文章中文字的格式和科目,能够帮助用户查找包括期刊论文、学位论文、书籍、预印本、文摘和技术报告在内的学术文献,内容涵盖自…