還記得高中生物書上的莫斯密碼嗎?利用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.pswp.cn/news/160983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160983.shtml
英文地址,請注明出處:http://en.pswp.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…