还记得高中生物书上的莫斯密码吗?利用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.hqwc.cn/news/207908.html

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

相关文章

力扣.面试题 04.06. 后继者(java 树的中序遍历)

Problem: 面试题 04.06. 后继者 文章目录 题目描述思路解题方法复杂度Code 题目描述 设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。 如果指定节点没有对应的“下一个”节点,则返回null。 思路 由于题…

「Docker」如何在苹果电脑上构建简单的Go云原生程序「MacOS」

介绍 使用Docker开发Golang云原生应用程序,使用Golang服务和Redis服务 注:写得很详细 为方便我的朋友可以看懂 环境部署 确保已经安装Go、docker等基础配置 官网下载链接直达:Docker官网下载 Go官网下载 操作步骤 第一步 创建一个…

【SpringBoot】ThreadLocal 的详解

一、ThreadLocal 简介 ThreadLocal 叫做线程变量,意思是 ThreadLocal 中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal 为变量在每个线程中都创建了一个副本,那么每个线…

虚拟机centos设置网络模式(桥接|NAT)

前言 桥接模式是通过物理网卡直接与外部网络建立联系的,而NAT模式则是通过虚拟网卡VMnet1或VMnet8通过宿主机共享IP与外部建立网络关系当需要将虚拟机资源共享给局域网用户使用时,宜采用桥接模式;当需要保护虚拟机资源,确保只能由…

封面从这里取好啦

文章目录 前端NPMViteNode.js 后端JavaMavenPython 数据库算法 前端 NPM Vite Node.js 后端 Java Maven Python 数据库 算法

C#使用whisper.net实现语音识别(语音转文本)

目录 介绍 效果 输出信息 项目 代码 下载 介绍 github地址:https://github.com/sandrohanea/whisper.net Whisper.net. Speech to text made simple using Whisper Models 模型下载地址:https://huggingface.co/sandrohanea/whisper.net/tree…

【wireshark】基础学习

TOC 查询tcp tcp 查询tcp握手请求的代码 tcp.flags.ack 0 确定tcp握手成功的代码 tcp.flags.ack 1 确定tcp连接请求的代码 tcp.flags.ack 0 and tcp.flags.syn 1 3次握手后确定发送成功的查询 tcp.flags.fin 1 查询某IP对外发送的数据 ip.src_host 192.168.73.134 查询某…

飞瓜数据B站丨B站UP主11月第3周榜单排行榜榜单(B站平台)发布!

飞瓜轻数发布2023年11月13日-11月19日飞瓜数据UP主排行榜(B站平台),通过充电数、涨粉数、成长指数、带货数据等维度来体现UP主账号成长的情况,为用户提供B站号综合价值的数据参考,根据UP主成长情况用户能够快速找到运营…

竞赛选题 酒店评价的情感倾向分析

前言 🔥 优质竞赛项目系列,今天要分享的是 酒店评价的情感倾向分析 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/post…

Docker Swarm总结(2/3)

目录 8、service 操作 8.1 task 伸缩 8.2 task 容错 8.3 服务删除 8.4 滚动更新 8.5 更新回滚 9、service 全局部署模式 9.1 环境变更 9.2 创建 service 9.3 task 伸缩 10、overlay 网络 10.1 测试环境 1搭建 10.2 overlay 网络概述 10.3 docker_gwbridg 网络基础…

cocos2dx ​​Animate3D (一)

3D相关的动画都是继承Grid3DAction 本质上是用GirdBase进行创建动画的小块。 Shaky3D 晃动特效 // 持续时间(时间过后不会回到原来的样子) // 整个屏幕被分成几行几列 // 晃动的范围 // z轴是否晃动 static Shaky3D* create(float initWithDuration, const Size& …

线程的几种状态

(线程的几种状态) 1.线程状态(生命周期) 1.1.源码中的状态 关于Java线程的状态,网上说法很多,有五种、六种甚至七种,本文采用Java官方的线程状态分类。 实际上,官方一共给出了六种…