Python微实践 - 布莱切利庄园的秘密

news2024/11/25 17:22:57

二战时期,英国数学家、计算机科学之父Alan Turing在布莱切利庄园成功破译了德军密码,为赢得世界反法西斯战争的胜利做出了重大贡献。为了表达对前辈先贤的敬意,本微实践取名为“布莱切利庄园的秘密”。

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

在人类尚未获得足够的算力之前,加密和解密都是手工进行的。受限于有限的人工算力,加解密只能采取一些简单的方法,比如下面这种:
在这里插入图片描述
信息的发送方和接收方同时持有如上表所示的明密文字母对照表,该对照表对任何第三方保密。加密时,按照该对照表,将明文中的a映射为f,b映射为v,…,z映射为t,即得密文。解密时,同样按照该对照表,将密文中的f映射为a,v映射为b,…,t映射为z,即得明文。

在随书代码的CH6子目录下,文件article.txt包含了示例中的“明文”,其内容引自一本著名的英文小说:

A few days later, Tom invites Nick to a party in New York City. On the way, Tom picks up his ...

通过执行CH6子目录下的encode.py,可以将明文article.txt按前述加密方法加密成密文,文件名为encoded.txt:

f izg dfho efuzj, ulq sansuzo asrw ul f bfjuh sa azg hljw rsuh. la uyz gfh, ulq bsrwo cb yso ...

看起来,即便密文被第三方截获,也难以解读,实则不然。在正常的英文表达中,每个字母出现的频率是有差异的,比如e的出现频次通常最高的,而z、x、q则相较较低。这提供了一种解密思路:对密文中的字母出现频率进行统计,其中出现次数最高者极可能是e,次高者可能是t,最低者则可能是z、x或者q。

应用上述解密思路,我们设计了下述解密程序:

#decode.py
f = open("encoded.txt")     #打开并读取密文内容至s
s = f.read().lower()        
f.close()

stats = {}                  #对密文中的字母出现次数进行统计
for c in s:
    if c.isalpha():
        stats[c.lower()] = stats.get(c.lower(),0) + 1

stats = list(stats.items()) #将字典转换为列表,对字母按出现次数降序排序
stats.sort(key=lambda x:x[1],reverse=True)
stats = "".join([x[0] for x in stats])
print("密文统计的按频次降序排列的英文字母:", stats)

codes = "etansoirhldygmcubwfkvpjzxq"
print("语料统计的按频次降序排序的英文字母:",codes)

r = ""                      #进行解密,明文存于r
for c in s:
    if c.isalpha():
        r += codes[stats.index(c)]
    else:
        r += c

f = open("decoded.txt","wt")  #将明文r写入文件
f.write(r)
f.close()
print("解密完成: decoded.txt")

🚩第2 ~ 4行:打开当前工作路径下的密文文件encoded.txt,将其中的内容按字符串形式读出,保存在变量s中。使用Python进行文件读写的详细方法,我们在第8章中讨论。请读者留意第3行中lower()函数的存在,在整个解密过程中,我们统一使用小写字母。

🚩第6 ~ 9行:借助于字典stats对密文中各字母的出现次数进行统计。统计完成后,stats中将得到形如{“a”:112, “x”:7, … “z”:3}的结果数据。统计过程中,我们使用for循环对密文s中的字符c逐一进行处理,如果字符c是英文字母(使用成员函数isalpha()进行判断),则将其在字典中的出现次数加1。请读者留意get()函数的运用,当某个字母是首次发现时,其在字典中尚不存在,此时,get()函数将返回默认值0。

🚩第11 ~ 14行:通过列表按统计的频次对字母进行降序排序。在字典中,键值对之间没有前后之分,因此排序只能通过列表进行。第11行将字典的键值对转换为列表,其内容形式为:[(“a”,112),( “q”,3),…,(“x”,7)]。第12行使用sort()函数对该列表进行排序,排序时通过匿名函数获取每个元组的下标1值,即频次做为排序依据。第13行使用列表推导语法将有序列表中的字母单独提取出来,并使用空字符串””将所有字母串接在一起。如执行结果的第1行所示,stats字符串的值为zufaolsjyedhpqrcvgiwnbmtkx,这表明在密文中,出现频次最高的是z,然后是u,f,出现频次最低是x。

🚩第16行:字符串codes给出了从正常语料库中统计的字母出现频次的降序排列。

🚩第19 ~ 24行:按照字母频次的统计结果,进行解密。字符串stats给出了密文统计的字母频次降序排列,字符串codes则给出了正常语料统计的字母频次降序排列。粗略地,我们认为,密文字母stats[i]对应的明文字母即为codes[i]。在下述统计结果中,z在密文中出现频次最高,我们认为它对应明文字母e;u在密文中出现频次为第二高,我们认为它对应明文字母t。

密文统计的按频次降序排列的英文字母: zufaolsjyedhpqrcvgiwnbmtkx    [stats]
语料统计的按频次降序排序的英文字母: etansoirhldygmcubwfkvpjzxq    [codes]

解密过程中,我们使用for循环逐一处理密文s中的字符c。如果字符c是字母(isalpha()),首先通过stats.index©找到它在密文中的频次排位,然后再以该频次排位作为下标,从codes中获得对应的明文字母,并将明文字母附加至明文字符串r。举例,假设c为字母”f”,stats.index©的结果为下标2,对照codes[2],明文字母即为”a”。如代码的第23 ~ 24行所示,对于那些不是字母的密文字符,直接将其附加至明文字符串r。

🚩第26 ~ 28行:将解密所得的明文字符串r写入文件decoded.txt。

使用Visual Studio Code打开解密文件decoded.txt,可见解密结果是正确的:

a few days later, tom invites nick to a party in new york city. on the way, tom picks up his ...

需要说明的是,由于密文较短,其字母频次统计结果不一定能与正常语料统计的字母频次完美对应。此时,按上述方法得到解密结果可能并不十分准确,比如z被错误解读成了q。在多数字母被正确解密的情况下,少数字母的错误对应关系容易通过人工进行校正。

源程序、数据文件下载: 请在浏览器中复制并录入下述地址
源程序、数据文件下载

为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

简洁的C及C++
由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造
Python编程基础及应用
由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造

如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

Python编程基础及应用

Python编程基础及应用实验教程
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

西安邮电大学-2020计算机科学与技术培养方案【笔记】

2020计算机科学与技术培养方案【笔记】 前言说明2020计算机科学与技术培养方案培养目标培养要求课程设置与学分分布1. 通识教育类 67 学分 √(1) 公共基础课程 40 学分1) 必修课 38 学分2) 选修课 2 学分 (2) 自然科学基础课程 20 学分1) 必修课 20 学分2) 选修课 0 学分 (3) 综…

算法训练营第三十二天||122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

122.买卖股票的最佳时机 本题首先要清楚两点: 只有一只股票!当前只有买股票或者卖股票的操作 想获得利润至少要两天为一个交易单元。 #贪心算法 这道题目可能我们只会想,选一个低的买入,再选个高的卖,再选一个低的…

7-2 九牛一毛

7-2 九牛一毛 分数 5 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 这是一道脑筋急转弯题:猪肉一斤 15 元,鸡肉一斤 20 元,那么一毛钱能买多少头牛? 答案是:9 —— 因为“九牛一毛”。 本题就请你按照这个逻辑…

百度地图 —— 给InfoWindow文本添加点击事件

前言: 需求描述:点击Marker标记出现infoWindow文本框,点击文本框中的红色框中的文字,出现侧边栏 代码实现:

js-二维子矩阵的和

// 给定一个二维矩阵 matrix,以下类型的多个请求: // 计算其子矩形范围内元素的总和,该子矩阵的左上角为(row1, col1) ,右下角为(row2, col2) 。// 实现 NumMatrix 类:// NumMatrix(int[][] matrix) 给定整数矩阵 matr…

刷题日记07《回溯算法》

题目描述 力扣https://leetcode.cn/problems/VvJkup/ 给定一个不含重复数字的整数数组 nums ,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2…

STM32 Proteus仿真ILI9341显示电桥电子秤重量测量差分放大电路 -0062

STM32 Proteus仿真ILI9341显示电桥电子秤重量测量差分放大电路 -0062 Proteus仿真小实验: STM32 Proteus仿真ILI9341显示电桥电子秤重量测量差分放大电路 -0062 功能: 硬件组成:STM32F103R6单片机 ILI9341TFT显示器4个电位器组成的电桥电…

好用的文献阅读插件(Easy Scholar、EasyPubMedicine、Sci-Hub X Now!)

目录 一、Easy Scholar 二、EasyPubMedicine 一、Easy Scholar Easy Scholar:自动显示期刊等级,帮助筛选优质论文。 安装: 点击浏览器右上角的“。。。”,选择“扩展”。 点击打开加载项 在浏览器的扩展商店中搜索“easy sch…

MyBatis 中如何使用缓存

MyBatis 中如何使用缓存 MyBatis 是一个基于 Java 的持久层框架,它提供了多种方式来使用缓存,包括一级缓存和二级缓存。本文将介绍 MyBatis 中常见的缓存使用方式及其使用方法。 1. 一级缓存 MyBatis 中的一级缓存是指 SqlSession 的缓存,它…

Android 圆环统计图(带外延折线可点击)

需求先看UI效果图吧 看到这肯定去找轮子,找了半天,没找到相似的,大部分搜到的都是点击外凸,而这个UI是内凸,其实外凸内凸区别还不小,没找到一样的,于是乎,和iOS说好了要不就放弃吧&…

途乐证券-充电性能最高提升3.8倍,固态电池有新突破!

固态电池当时处于起步阶段,工业化仍需时刻。组织预计2030年商场空间有望达200亿元。 固态电池技能继续取得突破发展 过去10年,液态锂离子电池的能量密度现已提高了2倍~3倍,现在现已挨近理论上限。而全固态电池运用固体电解质替代了传统锂离子…

科技资讯|苹果Vision Pro预计2024年末全球发售

据彭博社记者古尔曼消息,苹果首款头显Vision Pro计划于2024年初在美国市场指定店铺进行开售,这些商店将会有专属区域用于产品演示,配备座位、配件和测量尺寸的工具等。知情人士透露,将有270家美国的苹果商店会销售Vision Pro&…

简述MySQL体系结构以及安装部署MySQL

目录 一、简述MySQL体系结构 1、连接层: 2、SQL层: 3、存储引擎层: 4、物理文件层: 5、一条SQL语句执行过程: 二、安装部署MySQL(使用yum以及通用二进制方式) 1、前期准备 1.1、关闭防火…

金九银十Java八股文面试题整理(含阿里、腾迅大厂java面试真题)

前言 看到了许多朋友在焦急的准备“金九银十”跳槽面试,甚至很多即将毕业的大学生都在备战秋招,对于学历还算优秀的大学生来说,这是一次离大厂最近的机会,毕竟是应届毕业生,不会对技术有非常严格的要求。 而对于工作…

注解开发配置实例

对比一下xm的配置: 新:注解开发,现在任何框架都有两套配置,一套xml配置,一套注解配置 现在我想把user Dao 和user serve 放到spring 中进行配置 service业务层 看到reipaositerei,就是我们Dao 层 用他来标注初始化方…

WORD模板替换,将文件给前端下载

1.word模板设计填充字段加{{填充字段名}} 2.后端依赖 <poi-tl.version>1.7.3</poi-tl.version> <poi.version>4.1.2</poi.version> <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId>&l…

基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目

功能演示 摘要&#xff1a;手势识别是一种通过技术手段识别视频图像中人物手势的技术。本文详细介绍了手势识别实现的技术原理&#xff0c;同时基于python与pyqt开发了一款带UI界面的手势识别系统软件&#xff0c;以便于进行结果显示。手势识别采用了mediapipe的深度学习算法进…

[MMDetection]绘制PR图

评价指标 平均精度与平均召回率 AP 是所有类别的平均值。传统上&#xff0c;这称为“平均精度”(mAP)。我们不区分 AP 和 mAP&#xff08;同样&#xff0c;AR 和 mAR&#xff09; APAP at IoU.50:.05:.95 (primary challenge metric)AP50AP at IoU.50 (PASCAL VOC metric)AP…

数据结构初阶--绪论

目录 一.什么是数据结构 二.什么是算法 三.算法的时间复杂度 四.算法的空间复杂度 五.复杂度练习 题一&#xff1a;消失的数字 题二&#xff1a;旋转数组 一.什么是数据结构 数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。 数据结构的三要素…

【LittleXi】 N-gram模型(C++实现)

LittleXi N-gram模型&#xff08;C实现&#xff09;马尔科夫性 (独立性假设)代码实现英文训练版本中文训练版本 训练效果 N-gram模型&#xff08;C实现&#xff09; 定义&#xff1a;通俗地讲&#xff0c;就是利用前文的单词&#xff0c;来推算下一个最大概率出现的单词 马尔…