还记得高中生物书上的莫斯密码吗?利用Python破解摩斯密码的代码示例!

文章目录

  • 前言
    • 摩尔斯电码
    • Python实现
      • 摩斯密码对照表
      • 加密
      • 解密
      • 测试
    • 完整代码
    • 总结
      • 关于Python技术储备
        • 一、Python所有方向的学习路线
        • 二、Python基础学习视频
        • 三、精品Python学习书籍
        • 四、Python工具包+项目源码合集
        • ①Python工具包
        • ②Python实战案例
        • ③Python小游戏源码
        • 五、面试资料
        • 六、Python兼职渠道


前言

在电影《无间道》中,刘建明(刘德华饰)作为黑帮的卧底在一次行动中发现了警察的卧底陈永仁(梁朝伟饰)与黄警督(黄秋生饰)通过摩斯电码进行通讯,经过紧急的群发区域短信 “有内鬼,终止交易” 避免了黑帮头目被抓。

通过动图能看到黄警督和陈永仁仅通过手指的敲击就能完成通讯,是不是很神奇?

摩尔斯电码

摩斯密码的定义如下:

摩尔斯电码( 又译为摩斯密码,英语:Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。是由美国人艾尔菲德·维尔与萨缪尔·摩尔斯在1836年发明。

摩尔斯电码是一种早期的数码化通信形式,它依靠一系列的点和划来传递编码信息,它的代码包括五种:

  • 点( · ):1 (读 “滴” dit ,时间占据1t )
  • 划(—):111 (读 “嗒” dah ,时间占据3t )
  • 字符内部的停顿(在点和划之间):0 (时间占据1t )
  • 字符间停顿:000 ( 时间占据3t )
  • 单词间的停顿:0000000 ( 时间占据7t )

点的长度(也就是上面的时间长度t)决定了发报的速度。

我们的英文字母、数字和标点符号与摩斯密码的对照图如下:

我们现在要发送 “M O R S E(空格) C O D E” (morse code)这单词,通过查表可知,它应该是这样

—— ——— ·—· ··· · / —·—· ——— —·· ·

对应的报文应该如下(滴 表示敲击,▢ 表示停顿)

滴滴滴▢滴滴滴▢▢▢滴滴滴▢滴滴滴▢滴滴滴▢▢▢滴▢滴滴滴▢滴▢▢▢滴▢滴▢滴▢▢▢滴▢▢▢▢▢▢▢滴滴滴▢滴▢滴滴滴▢滴▢▢▢滴滴滴▢滴滴滴▢滴滴滴

是不是很有意思?

Python实现

用 Python 实现摩斯密码的加解密,其实很简单,只需要把对照表放在一个字典中,加密的时候将明文拆分,然后从字典中取出对应的密码组合在一起,解密的时候就是通过密文去对照表找对应的明文,然后拼在一起就行。

摩斯密码对照表

我们把摩斯密码对照表用字典存储之后,是这样的:

MORSE\_CODE\_DICT = {'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': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.', '0': '-----', ', ': '--..--', '.': '.-.-.-', '?': '..--..', '/': '-..-.', '-': '-....-', '(': '-.--.', ')': '-.--.-'}

加密

加密的过程就是将明文通过对照表翻译成密文的过程。

我们逐个读取明文,如果是字母、数字或者标点符号就到字典里面找对应的密码,字符之间用空格隔开,如果是单词之间的空格,就添加两个连续空格,以隔开单词。

加密过程的代码如下:

def encrypt(message):cipher = ''for letter in message:if letter != ' ':# 查字典并添加对应的摩斯密码# 用空格分隔不同字符的摩斯密码cipher += MORSE\_CODE\_DICT\[letter\] + ' 'else:# 1个空格表示不同的字符# 2表示不同的词cipher += ' 'return cipher

解密

在解密的情况下,我们首先在要解码的字符串末尾添加一个空格,我们从字符串中提取字符。

一旦我们得到一个空格,我们就会在提取的字符序列(或我们的莫尔斯电码)中查找相应的英语字符,并将其添加到将存储结果的变量中。

一旦我们得到 2 个连续的空格,我们就会向包含解码字符串的变量添加另一个空格。

字符串末尾的最后一个空格将帮助我们识别莫尔斯电码字符的最后一个序列。

解密过程的代码如下:

# 将字符串从摩斯解密为英文的函数
def decrypt(message):# 在末尾添加额外空间以访问最后一个摩斯密码message += ' 'decipher = ''citext = ''global ifor letter in message:# 检查空间if letter != ' ':i = 0# 在空格的情况下citext += letter# 在空间的情况下else:# 如果 i = 1 表示一个新字符i += 1# 如果 i = 2 表示一个新单词if i == 2:# 添加空格来分隔单词decipher += ' 'else:# 使用它们的值访问密钥(加密的反向)decipher += list(MORSE\_CODE\_DICT.keys())\[list(MORSE\_CODE\_DICT.values()).index(citext)\]citext = ''return decipher

测试

我们先来测试一下加密算法:

message = "I LOVE YOU"
result = encrypt(message.upper())
print(result)

运行结果是:

… .-… — …- . -.-- — …-

大家可以自己对照着映射表来看看是否正确。

再测试一下解密算法:

message = "..  .-.. --- ...- .  -.-- --- ..-"
result = decrypt(message)
print(result)

运行结果是:

I LOVE YOU

完整代码

#!/usr/bin/env python3
# -\*- coding: utf-8 -\*-
"""
@author: 闲欢
"""# 表示摩斯密码图的字典
MORSE\_CODE\_DICT = {'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': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....','7': '--...', '8': '---..', '9': '----.', '0': '-----',', ': '--..--', '.': '.-.-.-', '?': '..--..', '/': '-..-.', '-': '-....-','(': '-.--.', ')': '-.--.-'}# 根据摩斯密码图对字符串进行加密的函数
def encrypt(message):cipher = ''for letter in message:if letter != ' ':# 查字典并添加对应的摩斯密码# 用空格分隔不同字符的摩斯密码cipher += MORSE\_CODE\_DICT\[letter\] + ' 'else:# 1个空格表示不同的字符# 2表示不同的词cipher += ' 'return cipher# 将字符串从摩斯解密为英文的函数
def decrypt(message):# 在末尾添加额外空间以访问最后一个摩斯密码message += ' 'decipher = ''citext = ''global ifor letter in message:# 检查空间if letter != ' ':i = 0# 在空格的情况下citext += letter# 在空间的情况下else:# 如果 i = 1 表示一个新字符i += 1# 如果 i = 2 表示一个新单词if i == 2:# 添加空格来分隔单词decipher += ' 'else:# 使用它们的值访问密钥(加密的反向)decipher += list(MORSE\_CODE\_DICT.keys())\[list(MORSE\_CODE\_DICT.values()).index(citext)\]citext = ''return decipherdef main():message = "I LOVE YOU"result = encrypt(message.upper())print(result)message = "..  .-.. --- ...- .  -.-- --- ..-"result = decrypt(message)print(result)# 执行主函数
if \_\_name\_\_ == '\_\_main\_\_':main()

总结

整个摩斯密码加密和解密的过程就是对字符串的操作,还比较简单。但是想想那些特务啥的通过敲击声或者其他方式去人工解密,还是有点技术难度的。这个加解密的程序给自己玩玩还是不错的,你觉得呢?


关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python基础学习视频

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述
因篇幅有限,仅展示部分资料

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、Python工具包+项目源码合集
①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

六、Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述
在这里插入图片描述
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

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

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

相关文章

Arduino驱动MLX90614红外温度传感器(温湿度传感器)

目录 1、传感器特性 2、MLX90614发射率补偿方法 3、控制器和传感器连线图 4、驱动程序 MLX90614红外测温模块,通过探测物体红外辐射能量的大小和波长的分布来检测物体的表面温度。红外测温器由光学系统、光电探测器、信号放大器

一文读懂 Linux mmap

文章目录 1.简介2.实现原理3.相关函数4.mmap和常规文件操作的区别5.作用参考文献 1.简介 mmap(memory map)即内存映射,用于将一个文件或设备映射到进程的地址空间。 实现这样的映射关系后,进程虚拟地址空间中一段内存地址将与文…

TorchScript C++ 自定义运算符 cpucuda

参考 在 C 中注册调度运算符 使用自定义 C 运算符扩展 TorchScript 环境: NVIDIA Driver Version : 545.23.08CUDA Version: 12.1Python Version: 3.11Pytorch Version: 2.1Cmake version : 3.18.1工作目录:workspace/test 一、 C 自定义运算符 创建…

逐字节讲解 Redis 持久化(RDB 和 AOF)的文件格式

前言 相信各位对 Redis 的这两种持久化机制都不陌生,简单来说,RDB 就是对数据的全量备份,AOF 则是增量备份,而从 4.0 版本开始引入了混合方式,以 7.2.3 版本为例,会生成三类文件:RDB、AOF 和记…

2014年5月28日 Go生态洞察:GopherCon 2014大会回顾

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Java面试附答案:掌握关键技能,突破面试难题!

问题:什么是大O表示法?它在Java中的应用是什么? 回答: 大O表示法是一种用来衡量算法复杂度的方法,它描述了算法的时间复杂度和空间复杂度的增长速度。它使用符号O(n)来表示算法的渐进时间复杂度,其中n表示…

如何让Python2与Python3共存

安装 首先分别安装Py2和Py3,我都安装到C盘根目录里了,然后分别将Py2和Py3都配置到系统环境变量中去:C:\Python36\Scripts\;C:\Python36\;C:\Python27\;C:\Python27\Scripts; 配置 修改两个版本的可执行文件名字 验证 重新配置一下pip …

Ubuntu删除应用图标

删除用户下的图标 sudo nautilus ~/.local/share/applications删除系统下的图标 sudo nautilus /usr/share/applications

大数据-之LibrA数据库系统告警处理(ALM-25500 KrbServer服务不可用)

告警解释 系统按30秒周期性检测组件KrbServer的服务状态。当检测到组件KrbServer服务异常时产生该告警。 当检测到组件KrbServer服务恢复时告警恢复。 告警属性 告警ID 告警级别 可自动清除 25500 致命 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务…

解决MySQL中某列数据过长无法入库的问题-Details:data too long for column `xxx` at row 1

问题描述: 我在将轨迹的经纬度转换为字符串入库时,遇到写入问题 Mysql数据入库报错: Caused by:java.long.exception:写入数据库表失败.Details:data too long for column xxx at row 1,我的xxx字段类型是string,在mysql库表中…

加速CI构建,实现高效流水线——CloudBees CI发布工作区缓存功能

加速软件交付流程能够更快接触到客户,获得竞争优势。然而,识别这一过程中存在的瓶颈可能颇具挑战。让我们从审查构建和测试阶段开始着手。例如,当CI作业执行时间较长时,它会延迟开发人员的反馈循环,从而可能导致发布延…

使用Python解析CAN总线

缘起 在新能源车辆的开发和维护中,经常需要对CAN总线数据进行分析。CANOE等总线软件虽然方便,但功能有限,难以满足数据分析的要求。Matlab的Vehicle Network Toolbox可以方便的进行数据解析和分析,它是闭源且收费的。因此&#x…

SpringBoot启动顺序

前言 每次有人问起SpringBoot的启动顺序是不是又来翻博客了?其实只需要稍微查看Spring的源码即可 步骤 SpringBoot的入口org.springframework.boot.SpringApplication#run(String... args), 这里面实现了SpringBoot程序启动的所有步骤 启动事件的顺序可以看监听器…

uni-app 使用uni.getLocation获取经纬度配合腾讯地图api获取当前地址

前言 最近在开发中需要根据经纬度获取当前位置信息,传递给后端,用来回显显示当前位置 查阅uni-app文档,发现uni.getLocation () 可以获取到经纬度,但是在小程序环境没有地址信息 思考怎么把经纬度换成地址,如果经纬度…

buildadmin+tp8表格操作(1)----表头上方添加按钮和自定义按钮

buildAdmin 的表头上添加一些按钮&#xff0c;并实现功能 添加按钮 <template><!-- buttons 属性定义了 TableHeader 本身支持的顶部按钮&#xff0c;仅需传递按钮名即可 --><!-- 这里的框架自带的 顶部按钮 分别有 刷新 &#xff0c; 添加&#xff0c; 编辑&…

C++ 问题 怎么在C++11标准语法中调用C++20的类

一. 问题 在工作中,因为一个算法功能需要跟别的部门对接,他们提供了该算法的头文件.h,静态库.lib,动态库.dll。但是头文件中使用了C++20才有的新特性,如#include等,而本地使用的vs2015开发环境,只支持C++11标准语法,这种情况下,该怎么把该算法集成到本地项目中呢? …

写单元测试,没你想得那么简单!

前言 单元测试是什么我们就简单介绍一下&#xff1a; 单元测试是针对程序模块&#xff08;软件设计的最小单位&#xff09;来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。 接下来是本人对单元测试的理解和实践。里面没有废话&#xff0c;希望每句话能说到你心…

YOLOv8改进实战 | 更换主干网络Backbone(六)之轻量化模型VanillaNet进阶篇

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

每日一题(LeetCode)----链表--分隔链表

每日一题(LeetCode)----链表–分隔链表 1.题目&#xff08;86. 分隔链表&#xff09; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初…

关于LORA的优势以及常见应用产品领域

lora的优势&#xff1a; 1 低功耗 2 传输距离远 3 信号穿透性好 4 灵敏度高&#xff0c;适合可靠性要求高的领域 5 低成本 Lora 产品领域 &#xff1a; 一、智慧城市 1 智能停车&#xff1a;在较大的停车场&#xff0c;通过Lora技术&#xff0c;采集车位信息&#xff0…