用Python破解摩斯密碼
大家好,歡迎來到 Crossin的編程教室 !
在電影《無間道》中,劉建明(劉德華飾)作為黑幫的臥底在一次行動中發(fā)現(xiàn)了警察的臥底陳永仁(梁朝偉飾)與黃警督(黃秋生飾)通過摩斯電碼進行通訊,經(jīng)過緊急的群發(fā)區(qū)域短信 "有內(nèi)鬼,終止交易" 避免了黑幫頭目被抓。
通過動圖能看到黃警督和陳永仁僅通過手指的敲擊就能完成通訊,是不是很神奇?他們用的方式就是我們今天要來分享的主題:
摩爾斯電碼
摩斯密碼的定義如下:
摩爾斯電碼( 又譯為摩斯密碼,英語:Morse code)是一種時通時斷的信號代碼,通過不同的排列順序來表達不同的英文字母、數(shù)字和標點符號。是由美國人艾爾菲德·維爾與薩繆爾·摩爾斯在1836年發(fā)明。
摩爾斯電碼是一種早期的數(shù)碼化通信形式,它依靠一系列的點和劃來傳遞編碼信息,它的代碼包括五種:
點( · ):1 (讀 “滴” dit ,時間占據(jù)1t ) 劃(—):111 (讀 “嗒” dah ,時間占據(jù)3t ) 字符內(nèi)部的停頓(在點和劃之間):0 (時間占據(jù)1t ) 字符間停頓:000 ( 時間占據(jù)3t ) 單詞間的停頓:0000000 ( 時間占據(jù)7t )
點的長度(也就是上面的時間長度t)決定了發(fā)報的速度。
我們的英文字母、數(shù)字和標點符號與摩斯密碼的對照圖如下:

我們現(xiàn)在要發(fā)送 “M O R S E(空格) C O D E” (morse code)這單詞,通過查表可知,它應(yīng)該是這樣
—— ——— ·—· ··· · / —·—· ——— —·· ·
對應(yīng)的報文應(yīng)該如下(滴 表示敲擊,? 表示停頓)
滴滴滴?滴滴滴???滴滴滴?滴滴滴?滴滴滴???滴?滴滴滴?滴???滴?滴?滴???滴???????滴滴滴?滴?滴滴滴?滴???滴滴滴?滴滴滴?滴滴滴
是不是很有意思?
Python實現(xiàn)
用 Python 實現(xiàn)摩斯密碼的加解密,其實很簡單,只需要把對照表放在一個字典中,加密的時候?qū)⒚魑牟鸱郑缓髲淖值渲腥〕鰧?yīng)的密碼組合在一起,解密的時候就是通過密文去對照表找對應(yīng)的明文,然后拼在一起就行。
摩斯密碼對照表
我們把摩斯密碼對照表用字典存儲之后,是這樣的:
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':?'-----',?
???????????????????',?':?'--..--',?'.':?'.-.-.-',?'?':?'..--..',?'/':?'-..-.',?'-':?'-....-',?
???????????????????'(':?'-.--.',?')':?'-.--.-'
???????????????????}
加密
加密的過程就是將明文通過對照表翻譯成密文的過程。
我們逐個讀取明文,如果是字母、數(shù)字或者標點符號就到字典里面找對應(yīng)的密碼,字符之間用空格隔開,如果是單詞之間的空格,就添加兩個連續(xù)空格,以隔開單詞。
加密過程的代碼如下:
def?encrypt(message):
????cipher?=?''
????for?letter?in?message:
????????if?letter?!=?'?':
????????????#?查字典并添加對應(yīng)的摩斯密碼
????????????#?用空格分隔不同字符的摩斯密碼
????????????cipher?+=?MORSE_CODE_DICT[letter]?+?'?'
????????else:
????????????#?1個空格表示不同的字符
????????????#?2表示不同的詞
????????????cipher?+=?'?'
????return?cipher
解密
在解密的情況下,我們首先在要解碼的字符串末尾添加一個空格,我們從字符串中提取字符。
一旦我們得到一個空格,我們就會在提取的字符序列(或我們的莫爾斯電碼)中查找相應(yīng)的英語字符,并將其添加到將存儲結(jié)果的變量中。
一旦我們得到 2 個連續(xù)的空格,我們就會向包含解碼字符串的變量添加另一個空格。
字符串末尾的最后一個空格將幫助我們識別莫爾斯電碼字符的最后一個序列。
解密過程的代碼如下:
#?將字符串從摩斯解密為英文的函數(shù)
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)
運行結(jié)果是:
.. ?.-.. --- ...- . ?-.-- --- ..-
大家可以自己對照著映射表來看看是否正確。
再測試一下解密算法:
message?=?"..??.-..?---?...-?.??-.--?---?..-"
result?=?decrypt(message)
print(result)
運行結(jié)果是:
I LOVE YOU
總結(jié)
整個摩斯密碼加密和解密的過程就是對字符串的操作,還比較簡單,可以當做一個Python的練手小項目。如果你需要在實際項目中使用,也可以考慮pyMorseCode之類的第三方模塊。
不過想想那些影視作品中的臥底、特工,能夠通過敲擊聲或者其他方式人肉加解密,還挺有難度呢(如果這是真的話……)
感謝轉(zhuǎn)發(fā)和點贊的各位~
作者:閑歡
來源:Python 技術(shù)「ID: pythonall」
_往期文章推薦_
