想起一个好玩的事情,使用python来实现德军在二战时加密的设备——恩格玛机。

那么什么是恩格玛机,他是怎么工作的?这篇文章提供了很详细的说明:

https://www.zhihu.com/question/28397034

请看高票回答。

路一步步走,饭一口口吃,下面,我们也来一步步的实现恩格玛机:

chapter 1

用python实现简单的字母替换:

当我输入一串字符串的时候(这串字符串并没有标点符号,只有字母和空格),程序会按照事先设置好的字母替换表,简单的替换掉密码。

如:

abcdefghjiklmnopqrstuvwxyz

qwertyuiopasdfghjklzxcvbnm

那么我输入hello world的时候,它应该自动给我替换成 itssg vgkar

试试看吧!

代码如下:使用的是string的maketrans方法,你想到了吗?

# -*- coding:utf-8 -*-
# 本代码的目的是通过python实现德军二战时期的密码机:恩格玛
# 首先,第一步是定义一个简单的函数:简单字符替换
import re
import stringdef simple_replace(password, replace_word):if not type(password) == type(replace_word) == type('a'):print('密码必须是字符串!')return Falsean = re.match('[a-z\s]+$', password)if not an:print('字符串只能包含小写字母和空格!')return Falseif len(replace_word) != 26:print('替换码必须为26个字母!')return Falseori_table = 'abcdefghijklmnopqrstuvwxyz'table = str.maketrans(ori_table, replace_word)return str.translate(password, table)a_password = input('请输入明文:')
r_password = 'qwertyuiopasdfghjklzxcvbnm'
print('密文如下:', simple_replace(a_password, r_password))

我没有考虑到的是,空格是不能加密的,当时的恩格码机也是没有空格和标点符号的,所以我把代码进行了修改。

# -*- coding:utf-8 -*-
# 本代码的目的是通过python实现德军二战时期的密码机:恩格玛
# 首先,第一步是定义一个简单的函数:简单字符替换
import re
import stringdef simple_replace(password, replace_word):if not type(password) == type(replace_word) == type('a'):print('密码必须是字符串!')return Falsean = re.match('[a-z]+$', password)  # 我没有考虑到的是,当时的enigma机是没有空格的,所以这里要求输入的明文也必须是小写字母if not an:print('字符串只能包含小写字母!')return Falseif len(replace_word) != 26:print('替换码必须为26个字母!')return Falseori_table = 'abcdefghijklmnopqrstuvwxyz'table = str.maketrans(ori_table, replace_word)return str.translate(password, table)a_password = input('请输入明文:')
r_password = 'qwertyuiopasdfghjklzxcvbnm'
print('密文如下:', simple_replace(a_password, r_password))

但是这里只能实现加密,加第一个转子的时候我再考虑恩格码机的自反属性

好的,更新了,现在我加了一个转子,对旧的代码进行了相应的修改

# -*- coding:utf-8 -*-
# 本代码的目的是通过python实现德军二战时期的密码机:恩格玛
# 首先,第一步是定义一个简单的函数:简单字符替换
import re
import stringdef simple_replace(password, replace_word):count = len(password)  # 先确定转子需要转动的次数new_pass = ''  # 设置一个空字符串准备接收密码ori_table = 'abcdefghijklmnopqrstuvwxyz'  # 原始的字符串,用来建立映射表for obj in password:  # 开始拆解原字符串table = str.maketrans(ori_table, replace_word)  # 建立映射表new_obj = str.translate(obj, table)  # 把obj通过映射表转换成new_objnew_pass += new_obj  # 返回的密码增加一个new_objreplace_word = rotors(replace_word)  # 转子转动return new_pass  # 返回新的已经被转子加密的密码# 单独把判断写成一个函数吧,这样比较好区分def is_str(password, replace_word):  # 判断的函数an = re.match('[a-z]+$', password)  # 我没有考虑到的是,当时的enigma机是没有空格的,所以这里要求输入的明文也必须是小写字母if not type(password) == type(replace_word) == type('a'):print('密码必须是字符串!')return Falseelif not an:print('字符串只能包含小写字母!')return Falseelif len(replace_word) != 26:print('替换码必须为26个字母!')return Falseelse:return True  # 修正了函数的写法,增加了一个返回true的选项# 然而这并非一个完整版,因为转子还不会转动,我们下面让转子每输入一个字符就转动一次。
# 明显不能输入一次计算一次,所以让转子转动len(明文)次,然后依次处理每个字符就可以了def rotors(replace_word):  # 转子转动的函数,每调用一次,就把转子前面第一个字母移动到最后return replace_word[1:] + replace_word[0]while True:a_password = input('请输入明文:')r_password = 'qwertyuiopasdfghjklzxcvbnm'if is_str(a_password, r_password):print('密文如下:', simple_replace(a_password, r_password))breakelse:pass

现在已经可以通过转子来实现动态加密了,!

不信?你运行一下,输入aaaaa试试,会被加密成qwert哈

转载于:https://www.cnblogs.com/sunchao1984/p/5082067.html

python编程挑战——使用python实现恩格玛机(1)相关推荐

  1. 单表恩格玛机的源码实现

    最近看了一部电影,叫<模仿游戏>,主要讲的就是二战期间图灵破解德军通讯密码的故事,最后的意义是导致二战提前两年结束,拯救了至少1400万人的生命.然后自己一时兴起就写了一个单表随机排列的恩 ...

  2. 山东python编程培训,Python进入山东省小学教材了

    根据最近火爆朋友圈的一则消息,Python已经进入山东省小学教材.Python这几年的火热,离不开人工智能和机器学习. 已经没有什么能够阻挡Python了.根据国务院<新一代人工智能发展规划的通 ...

  3. arcgis python编程案例-ArcGIS Python编程案例-电子资料链接

    ArcGIS Python编程案例(1)-Python语言基础 https://www.jianshu.com/p/dd90816d019b ArcGIS Python编程案例(2)-使用ArcPy编 ...

  4. python编程入门电子书-Python编程基础 PDF 原书高质量版

    给大家带来的一篇关于Python入门相关的电子书资源,介绍了关于Python编程基础.Python编程教程方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小6 MB,张健 张良均编写,目前 ...

  5. 大M法的python编程求解和python包求解

    大M法的python编程求解和python包求解 一.大M算法的求解步骤讲解 二.python编程求解 三.利用python包scipy的优化包optimize 四.用excel求解 五.分析结果 一 ...

  6. 青少年python编程入门书-青少年Python编程入门——图解Python

    商品详情 书名:青少年Python编程入门--图解Python 定价:69.8 ISBN:9787121395543 作者:傅骞 版次:第1版 出版时间:2020-09 内容提要: 本书介绍pytho ...

  7. 青少年python编程入门书籍_新书推荐 | 《青少年Python编程入门——图解Python》

    原标题:新书推荐 | <青少年Python编程入门--图解Python> 随着信息时代的到来,在编程教育中进行计算思维培养正在成为信息技术教育关注的重点.<普通高中信息技术课程标准( ...

  8. 自学python编程笔记本推荐-python自学教程 | 3万字为你详解每个重要知识点

    本文目录: 什么是Python? Python的用途是什么? 如何安装Python? 为什么选择Python? R与Python 学习Python的最佳方法 什么是顶级Python IDE 哪个是最适 ...

  9. python编程入门指南-Python入门学习指南

    对于初学者,入门至关重要,这关系到初学者是从入门到精通还是从入门到放弃.以下是结合Python的学习经验,整理出的一条学习路径,主要有四个阶段 NO.1 新手入门阶段,学习基础知识 总体来讲,找一本靠 ...

最新文章

  1. LINUX UMASK详解
  2. 关于对话框DoModal()函数调用失败的原因分析
  3. 【解决方案】from pip import main
  4. 【26】Python Iterator笔记
  5. Golang之slice操作
  6. js调用浏览器的下载框
  7. mysql sql执行过程_MySQL探秘(二):SQL语句执行过程详解
  8. c语言标准库函数大全.chm,C语言标准库函数(word版).doc
  9. [Leetcode]字符串转换整数 (ATOI)
  10. 转]最长递增子序列问题的求解
  11. 不调用python函数实现直方图均衡化_数字图像处理之直方图均衡化
  12. 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(day01~day10)
  13. 基于Packet Tracer的校园网络设计与规划
  14. 格雷码与二进制相互转换的verilog实现
  15. Linux 上通过 Rhythmbox 听音乐
  16. ODI 11g安装记录
  17. 道场与世间修行的区别
  18. html5实现canvas迷宫游戏,HTML5/Canvas/JS 迷宫生成动画
  19. Taurus.MVC 如何升级并运行在NET6、NET7
  20. 【课内学习】数字电路Flip-Flop

热门文章

  1. RocketMQ大数据畅想
  2. 不要过打折的生活,当你发现这些你有了,说明你开始成熟了
  3. [转]C#和C++结构体Socket通信
  4. 【linux】——Linux tar打包命令
  5. IBM DB2 Intelligent for Data/Text Version 6
  6. React中diff算法的理解
  7. sh脚本和bash脚本_在脚本中使用Bash陷阱
  8. 用户生命周期常用指标_生命周期管理工具如何使用指标
  9. blender使用_使用Blender准备骨科手术
  10. mesos_Linux Foundation提供了新的认证,Mesos进入了Google等等