原由

最近作者看到了一个二战传奇故事,是咱们计算机祖师爷图灵大佬破译德军的通讯密码,最后导致二战提前两年结束,这里就简单的介绍一下恩尼格码的加密与解密

加密

首先加密由原文和密码表组成,以下面的为例:

26字母表:['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']
映射表1 :['C', 'P', 'B', 'F', 'I', 'S', 'N', 'Z', 'Q', 'L', 'W', 'Y', 'J', 'O', 'H', 'U', 'A', 'V', 'E', 'R', 'T', 'K', 'D', 'M', 'X', 'G']

通过上面的两个表,我们得出了一个简单的对应关系,即:A对应Y,B对应X,即如下映射关系

{'A': 'C', 'B': 'P', 'C': 'B', 'D': 'F', 'E': 'I', 'F': 'S', 'G': 'N', 'H': 'Z', 'I': 'Q', 'J': 'L', 'K': 'W', 'L': 'Y', 'M': 'J', 'N': 'O', 'O': 'H', 'P': 'U', 'Q': 'A', 'R': 'V', 'S': 'E', 'T': 'R', 'U': 'T', 'V': 'K', 'W': 'D', 'X': 'M', 'Y': 'X', 'Z': 'G'}

假设我们现在输入原文(待加密的字符串):ABCDE
就可以得到加密后的字符串: CPBFI

源码如下

import random# 生成字母表
a = [chr(ord('A') + i) for i in range(0, 26)]
print(a)
# 生成两个对应表,并打乱
b = a.copy()
random.shuffle(b)
print(b)# 建立对应密码表
dict1 = dict(zip(a, b))
print(dict1)word = "ABCDE"
print("加密前: " + word)
mm = ""
for i in range(len(word)):mm += dict1[word[i]]print("加密后: " + mm)

上面仅仅是一个小小的Demo,且经过一张表的加密并不安全,可以通过26个字母出现的频率来反推其原文,所以可以使用两张或者多张表来进行混合加密,以下用双映射表为例:

26字母表:['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']
映射表1: ['C', 'P', 'B', 'F', 'I', 'S', 'N', 'Z', 'Q', 'L', 'W', 'Y', 'J', 'O', 'H', 'U', 'A', 'V', 'E', 'R', 'T', 'K', 'D', 'M', 'X', 'G']
映射表2: ['G', 'N', 'U', 'J', 'M', 'I', 'Z', 'X', 'E', 'Y', 'B', 'K', 'A', 'P', 'D', 'R', 'O', 'H', 'C', 'F', 'W', 'V', 'L', 'T', 'Q', 'S']

映射关系如下:

{'A': 'C', 'B': 'P', 'C': 'B', 'D': 'F', 'E': 'I', 'F': 'S', 'G': 'N', 'H': 'Z', 'I': 'Q', 'J': 'L', 'K': 'W', 'L': 'Y', 'M': 'J', 'N': 'O', 'O': 'H', 'P': 'U', 'Q': 'A', 'R': 'V', 'S': 'E', 'T': 'R', 'U': 'T', 'V': 'K', 'W': 'D', 'X': 'M', 'Y': 'X', 'Z': 'G'}
{'A': 'G', 'B': 'N', 'C': 'U', 'D': 'J', 'E': 'M', 'F': 'I', 'G': 'Z', 'H': 'X', 'I': 'E', 'J': 'Y', 'K': 'B', 'L': 'K', 'M': 'A', 'N': 'P', 'O': 'D', 'P': 'R', 'Q': 'O', 'R': 'H', 'S': 'C', 'T': 'F', 'U': 'W', 'V': 'V', 'W': 'L', 'X': 'T', 'Y': 'Q', 'Z': 'S'}

还是输入:ABCED
得到结果: CNBJI
此次加密我们使用了双表混合法,即第一个字符是使用第一个映射表加密,第二个字符使用第二张映射表来进行加密,这可以使加密的安全度提高很多,使信息更加安全

说完了加密我们来唠唠解密,其实解密就比较简单(知道密码本的情况下),将映射表进行反转

将上面的映射表反转之后如下:

{'C': 'A', 'P': 'B', 'B': 'C', 'F': 'D', 'I': 'E', 'S': 'F', 'N': 'G', 'Z': 'H', 'Q': 'I', 'L': 'J', 'W': 'K', 'Y': 'L', 'J': 'M', 'O': 'N', 'H': 'O', 'U': 'P', 'A': 'Q', 'V': 'R', 'E': 'S', 'R': 'T', 'T': 'U', 'K': 'V', 'D': 'W', 'M': 'X', 'X': 'Y', 'G': 'Z'}
{'G': 'A', 'N': 'B', 'U': 'C', 'J': 'D', 'M': 'E', 'I': 'F', 'Z': 'G', 'X': 'H', 'E': 'I', 'Y': 'J', 'B': 'K', 'K': 'L', 'A': 'M', 'P': 'N', 'D': 'O', 'R': 'P', 'O': 'Q', 'H': 'R', 'C': 'S', 'F': 'T', 'W': 'U', 'V': 'V', 'L': 'W', 'T': 'X', 'Q': 'Y', 'S': 'Z'}

然后将加密后的:CNBJI 代入得到结果: ABCDE

代码如下:

import random# 生成字母表
a = [chr(ord('A') + i) for i in range(0, 26)]
print(a)
# 生成两个对应表,并打乱
b = a.copy()
random.shuffle(b)
print(b)
c = a.copy()
random.shuffle(c)
print(c)# 建立对应密码表
dict1 = dict(zip(a, b))
dict2 = dict(zip(a, c))
print(dict1)
print(dict2)word = "ABCDE"
print("加密前: " + word)
mm = ""
for i in range(len(word)):if i % 2 == 0:mm += dict1[word[i]]else:mm += dict2[word[i]]print("加密后: " + mm)dict3 = dict(zip(dict1.values(), dict1.keys()))
dict4 = dict(zip(dict2.values(), dict2.keys()))
print(dict3)
print(dict4)word = ""
for i in range(len(mm)):if i % 2 == 0:word += dict3[mm[i]]else:word += dict4[mm[i]]print("明文是: " + word)

进过上面的学习,你知道了恩尼格码密码机加密与解密规则了吗?如果知道了请给作者一个大大的赞,您的支持就是作者更新的最大动力

python-恩尼格码密码机实现相关推荐

  1. 恩尼格码的发明和破解

    恩尼格码是二战德军所采用的电子加密机械 其基本组成可以分为三部分: 键盘,转子和显示器 键盘一共具有26个键,类似于今天的计算机键盘(显示起见,省略为6个) 转子实际上有3个,缩略起见只画了1个 显示 ...

  2. 【Python 小白到精通 | 课程笔记】第二章:图灵和恩尼格马密码机2(文本分析)

    Alstudio 课程地址:飞桨AI Studio - 人工智能学习实训社区 (baidu.com) Python 小白到精通--第二章:图灵和恩尼格马密码机2(文本分析) 今天的任务:破解密钥 原以 ...

  3. Python编写尼姆游戏

    Python编写尼姆游戏 最主要的思想是要构建函数思想.就是要将玩家和电脑分模块给编写出来.玩家可以编写比较简单不多赘述.这里主要讲一讲电脑模块.首先我们要保证电脑拿走物品剩下来过后要是2∧n-1如果 ...

  4. Python笔记 | 尼科彻斯定理

    文章目录 0x00 前言 0x01 问题分析  0x02 代码设计 0x03 代码流程 0x04 完整代码 0x05 运行效果 0x06 总结 0x00 前言 尼科彻斯定理:任何一个整数的立方都可以写 ...

  5. 一个苹果成就了牛顿,一个苹果杀死了图灵。

    今天不发技术文章了. 假期看了一部电影<模仿游戏>,讲的是人工智能之父图灵的故事. 说起图灵,可能你知道他是计算机科学之父.人工智能之父.计算机领域最负盛名的奖项「图灵奖」都用他的名字命名 ...

  6. iOS 加密算法之MD5加密使用

    2020.06.04编辑 前言 对于加密算法这个概念我的确不太清楚,虽然我知道加密算法存在的意义,但是这并不妨碍我不知道加密算法具体都有哪些.所以今天这篇文章就是了大家一起学习开发中哪些加密算法. 在 ...

  7. 从“天地一体”到“移动组网”,中国量子通信产业是如何“炼成”的?

    近一两年里,随着有关量子科技的报道越来越多地出现在眼前,我们恐怕再也不能仅仅停留在"遇事不决,量子力学"的认知水平了. 我们知道,量子科技主要包括量子计算和量子通信两大技术领域.与 ...

  8. RSA,AES算法加解密

    密码的前世今生 密码Cryptology,是一种混淆人们视听的一种技术.将可以被正常认知的信息转变成不可以被识别的信息.有交流就有信息,有信息的传递,自然会产生秘密,这是文明发展的必然.密码的出生自然 ...

  9. CTF中Crypty入门必看(密码类,密码学)

    常见编码 ASCII编码 ASCII码大致可以分为三部分组成: 第一部分是:ASCII非打印控制字符 第二部分是:ASCII打印字符: 第三部分是:扩展ASCII打印字符. 在线ASCII码与进制互相 ...

  10. 唯一被图灵求婚的女人,与他并肩破译纳粹德国 Enigma 密码,拯救千万人生命!| 人物志...

    电影剧照(左为琼•克拉克) 作者 | 数小妹 责编 | 胡巍巍 本文经授权转载自DataGirls 奥斯卡获奖电影<模仿游戏>(The Imitation Game)展示了图灵不为人知的一 ...

最新文章

  1. 理解js中this的指向
  2. DC_command的部分理解(持续更新)
  3. NoSQL还是SQL?这一篇讲清楚
  4. php按每小时显示数据,mysql-PHP按某月统计每个小时生成的数据
  5. 构建并用 TensorFlow Serving 部署 Wide Deep 模型
  6. 创建简单的Flex组件
  7. Android官方开发文档Training系列课程中文版:调用相机之简单摄像
  8. spring aop 中@annotation()和自定义注解的使用
  9. 竟然如此简单!C++实现完全随机加密、解析库,并附上完整代码分析
  10. 普通的PHP上传到云函数,php封装上传函数代码示例
  11. 为什么程序员赚不了大钱?
  12. 矩阵分析(三):矩阵的列空间、行空间与零空间
  13. STM32的选型参考
  14. linux不能识别隶书怎么办,[ArchLinux]使用Fontconfig配置字体控制台/sublime/fcitx输入法选字条中文显示高低宽窄不一, 请问应该怎么调整...
  15. 《Java游戏编程原理与实践教程》读书笔记(第4章——Java游戏程序的基本框架)
  16. 频响函数和传递函数详解-工程实例
  17. 高薪岗位云计算面试题,云计算运维工程师必备
  18. php Guzzle源码,PHP Guzzle获取请求
  19. 查找计算机16mb的文件,如何搜索win7电脑里的文件
  20. PostgreSQL 14 pageinspect新增gist索引支持

热门文章

  1. 关于VirtualBox运行出现“0x00000000指令引用的0x00000000内存。该内存不能为written”的解决方法
  2. 在多树联动和动态生树的情况下给树上添加新节点
  3. Intellij IDEA 强大的搜索能力
  4. 简单谈谈自己对前端的感想
  5. 2021-09-21用pyecharts做全球各个国家的gdp色彩深度图
  6. AI绘图第二弹!绘制专属动漫头像
  7. PPT动态文字制作过程
  8. fiddler连接代理手机无法上网问题解决办法
  9. python对话框打开文件_python打开文件对话框
  10. 英语六级翻译整理【未更新完】