【Python】破解摩斯密碼

来源:https://www.cnblogs.com/123456feng/archive/2022/04/07/16108351.html
-Advertisement-
Play Games

大家都看過電影《無間道》吧。在電影《無間道》中,劉建明(劉德華飾)作為黑幫的卧底在一次行動中發現了警察的卧底陳永仁(梁朝偉飾)與黃警督(黃秋生飾)通過摩斯電碼進行通訊,經過緊急的群發區域簡訊 “有內鬼,終止交易” 避免了黑幫頭目被抓。 通過動圖能看到黃警督和陳永仁僅通過手指的敲擊就能完成通訊,是不是 ...


大家都看過電影《無間道》吧。在電影《無間道》中,劉建明(劉德華飾)作為黑幫的卧底在一次行動中發現了警察的卧底陳永仁(梁朝偉飾)與黃警督(黃秋生飾)通過摩斯電碼進行通訊,經過緊急的群發區域簡訊 “有內鬼,終止交易” 避免了黑幫頭目被抓。

通過動圖能看到黃警督和陳永仁僅通過手指的敲擊就能完成通訊,是不是很神奇?

在這裡插入圖片描述

摩爾斯電碼

摩斯密碼的定義如下:

摩爾斯電碼( 又譯為摩斯密碼,英語:Morse code)是一種時通時斷的信號代碼,通過不同的排列順序來表達不同的英文字母、數字和標點符號。是由美國人艾爾菲德·維爾與薩繆爾·摩爾斯在1836年發明。

摩爾斯電碼是一種早期的數位化通信形式,它依靠一系列的點和劃來傳遞編碼信息,它的代碼包括五種:

Python學習、插件、素材群:906715085###
•點( · ):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 i
    for 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

總結

整個摩斯密碼加密和解密的過程就是對字元串的操作,還比較簡單。但是想想那些特務啥的通過敲擊聲或者其他方式去人工解密,還是有點技術難度的。這個加解密的程式裝一下 13 還是蠻有用的,你覺得呢?這一章到這裡就又要跟大家說再見了,下一次見是什麼時候呢。不管什麼時候,關註我你就可以天天看見我了。

在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、字元流的由來 由於使用位元組流操控中文時不是很方便,Java就提供了字元流來進行操控中文 實現原理:位元組流+編碼表 為什麼用位元組流進行複製帶有中文的文本文件時沒有問題? 因為底層操作會自動進行位元組拼接成中文 怎樣識別該位元組是中文呢? 漢字在存儲時,無論是UTF-8還是GBK,第一個位元組都是負數用來 ...
  • 《零基礎學Java》 文件輸入/輸出流 程式運行期間,大部分數據都被存儲在記憶體中,當程式結束或被關閉時,存儲在記憶體中的數據將會消失。如果要永久保存數據,那麼最好的辦法就是把數據保存到磁碟的文件中。為此,Java提供了文件輸入/輸出流,即 FilelnputStream類 與 FilcOutputSr ...
  • 之前刷到一個視頻,老師上課點到用系統點到回答問題,然後就點名結束了。相信很多學校現在也會玩這招吧,今天就用Python給大家做一個點名系統。來吧,展示… 一.準備工作 1.Tkinter Tkinter 是 python 內置的 TK GUI 工具集。TK 是 Tcl 語言的原生 GUI 庫。作為 ...
  • SpringCloud Function SpEL註入 漏洞分析 ...
  • 前言大家拍照的時候會用到全景嗎?在拍一個環境的時候還是會有很多人用全景的吧 ,今天教大家如何用Python拼接全景圖片。 圖像的全景拼接,即“縫合”兩張具有重疊區域的圖來創建一張全景圖。其中用到了電腦視覺和圖像處理技術有:關鍵點特征檢 測、局部不變特征、關鍵特征點匹配、RANSAC(Random ...
  • (Java 演算法的 ACM 模式) 前言 經常在 LeetCode 上用核心代碼模式刷題的小伙伴突然用 ACM 模式可能會適應不過來,把時間花在輸入輸出上很浪費時間,因此本篇筆記對 Java 演算法的 ACM 模式做了個小總結; 除此之外,需要註意一些小細節: 1. 數字讀取到字元串讀取間需要用 in ...
  • 上篇文章對併發的理論基礎進行了回顧,主要是為什麼使用多線程、多線程會引發什麼問題及引發的原因,和怎麼使用Java中的多線程去解決這些問題。 正所謂,知其然知其所以然,這是學習一個知識遵循的原則。 推薦讀者先行查看併發編程的理論知識,以便可以絲滑入戲。 併發編程系列之一併發理論基礎 本篇文章重點在於J ...
  • 原創:微信公眾號 【阿Q說代碼】,歡迎分享,轉載請保留出處。 近期疫情形勢嚴峻,情形不容樂觀,周末也不敢出去浪了,躲在家裡“葛優躺”。閑來無事,又翻了遍Spring的源碼。不翻不知道,一翻嚇一跳,之前翻過的源碼已經吃進了肚子里,再見亦是陌生人。 個人建議:為了以後能快速的撿起某個知識點,最好的方法還 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...