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

摩爾斯電碼
摩斯密碼的定義如下:
摩爾斯電碼( 又譯為摩斯密碼,英語: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 還是蠻有用的,你覺得呢?這一章到這里就又要跟大家說再見了,下一次見是什么時候呢,不管什么時候,關注我你就可以天天看見我了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457540.html
標籤:其他
上一篇:厲害!我帶的實習生僅用四步就整合好SpringSecurity+JWT實作登錄認證!
下一篇:原始碼級別的廣播與監聽實作
