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

我們現(xiàn)在要發(fā)送 “M O R S E(空格) C O D E” (morse code)這單詞,通過查表可知,它應(yīng)該是這樣
—— ——— ·—· ··· · / —·—· ——— —·· ·
對(duì)應(yīng)的報(bào)文應(yīng)該如下(滴 表示敲擊,? 表示停頓)
滴滴滴?滴滴滴???滴滴滴?滴滴滴?滴滴滴???滴?滴滴滴?滴???滴?滴?滴???滴???????滴滴滴?滴?滴滴滴?滴???滴滴滴?滴滴滴?滴滴滴
是不是很有意思?
Python實(shí)現(xiàn)
用 Python 實(shí)現(xiàn)摩斯密碼的加解密,其實(shí)很簡單,只需要把對(duì)照表放在一個(gè)字典中,加密的時(shí)候?qū)⒚魑牟鸱?,然后從字典中取出?duì)應(yīng)的密碼組合在一起,解密的時(shí)候就是通過密文去對(duì)照表找對(duì)應(yīng)的明文,然后拼在一起就行。
摩斯密碼對(duì)照表
我們把摩斯密碼對(duì)照表用字典存儲(chǔ)之后,是這樣的:
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':?'-----',?
???????????????????',?':?'--..--',?'.':?'.-.-.-',?'?':?'..--..',?'/':?'-..-.',?'-':?'-....-',?
???????????????????'(':?'-.--.',?')':?'-.--.-'
???????????????????}加密
加密的過程就是將明文通過對(duì)照表翻譯成密文的過程。
我們逐個(gè)讀取明文,如果是字母、數(shù)字或者標(biāo)點(diǎn)符號(hào)就到字典里面找對(duì)應(yīng)的密碼,字符之間用空格隔開,如果是單詞之間的空格,就添加兩個(gè)連續(xù)空格,以隔開單詞。
加密過程的代碼如下:
def?encrypt(message): ????cipher?=?'' ????for?letter?in?message: ????????if?letter?!=?'?': ????????????#?查字典并添加對(duì)應(yīng)的摩斯密碼 ????????????#?用空格分隔不同字符的摩斯密碼 ????????????cipher?+=?MORSE_CODE_DICT[letter]?+?'?' ????????else: ????????????#?1個(gè)空格表示不同的字符 ????????????#?2表示不同的詞 ????????????cipher?+=?'?' ????return?cipher
解密
在解密的情況下,我們首先在要解碼的字符串末尾添加一個(gè)空格,我們從字符串中提取字符。
一旦我們得到一個(gè)空格,我們就會(huì)在提取的字符序列(或我們的莫爾斯電碼)中查找相應(yīng)的英語字符,并將其添加到將存儲(chǔ)結(jié)果的變量中。
一旦我們得到 2 個(gè)連續(xù)的空格,我們就會(huì)向包含解碼字符串的變量添加另一個(gè)空格。
字符串末尾的最后一個(gè)空格將幫助我們識(shí)別莫爾斯電碼字符的最后一個(gè)序列。
解密過程的代碼如下:
#?將字符串從摩斯解密為英文的函數(shù) def?decrypt(message): ????#?在末尾添加額外空間以訪問最后一個(gè)摩斯密碼 ????message?+=?'?' ????decipher?=?'' ????citext?=?'' ????global?i ????for?letter?in?message: ????????#?檢查空間 ????????if?letter?!=?'?': ????????????i?=?0 ????????????#?在空格的情況下 ????????????citext?+=?letter ????????#?在空間的情況下 ????????else: ????????????#?如果?i?=?1?表示一個(gè)新字符 ????????????i?+=?1 ????????????#?如果?i?=?2?表示一個(gè)新單詞 ????????????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)
運(yùn)行結(jié)果是:
.. .-.. --- ...- . -.-- --- ..-
大家可以自己對(duì)照著映射表來看看是否正確。
再測試一下解密算法:
message?=?"..??.-..?---?...-?.??-.--?---?..-" result?=?decrypt(message) print(result)
運(yùn)行結(jié)果是:
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': '-----',
', ': '--..--', '.': '.-.-.-', '?': '..--..', '/': '-..-.', '-': '-....-',
'(': '-.--.', ')': '-.--.-'
}
# 根據(jù)摩斯密碼圖對(duì)字符串進(jìn)行加密的函數(shù)
def encrypt(message):
cipher = ''
for letter in message:
if letter != ' ':
# 查字典并添加對(duì)應(yīng)的摩斯密碼
# 用空格分隔不同字符的摩斯密碼
cipher += MORSE_CODE_DICT[letter] + ' '
else:
# 1個(gè)空格表示不同的字符
# 2表示不同的詞
cipher += ' '
return cipher
# 將字符串從摩斯解密為英文的函數(shù)
def decrypt(message):
# 在末尾添加額外空間以訪問最后一個(gè)摩斯密碼
message += ' '
decipher = ''
citext = ''
global i
for letter in message:
# 檢查空間
if letter != ' ':
i = 0
# 在空格的情況下
citext += letter
# 在空間的情況下
else:
# 如果 i = 1 表示一個(gè)新字符
i += 1
# 如果 i = 2 表示一個(gè)新單詞
if i == 2:
# 添加空格來分隔單詞
decipher += ' '
else:
# 使用它們的值訪問密鑰(加密的反向)
decipher += list(MORSE_CODE_DICT.keys())[list(MORSE_CODE_DICT.values()).index(citext)]
citext = ''
return decipher
def main():
message = "I LOVE YOU"
result = encrypt(message.upper())
print(result)
message = ".. .-.. --- ...- . -.-- --- ..-"
result = decrypt(message)
print(result)
# 執(zhí)行主函數(shù)
if __name__ == '__main__':
main()總結(jié)
整個(gè)摩斯密碼加密和解密的過程就是對(duì)字符串的操作,還比較簡單。但是想想那些特務(wù)啥的通過敲擊聲或者其他方式去人工解密,還是有點(diǎn)技術(shù)難度的。這個(gè)加解密的程序裝一下 13 還是蠻有用的,你覺得呢?
以上就是利用Python破解摩斯密碼的詳細(xì)內(nèi)容,更多關(guān)于Python 摩斯密碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python實(shí)現(xiàn)連續(xù)變量最優(yōu)分箱詳解--CART算法
今天小編就為大家分享一篇python實(shí)現(xiàn)連續(xù)變量最優(yōu)分箱詳解--CART算法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11
SpringBoot調(diào)用python接口的實(shí)現(xiàn)步驟
本文主要介紹如何利用Springboot框架調(diào)用python腳本,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
講解Python中for循環(huán)下的索引變量的作用域
這篇文章主要介紹了講解Python中for循環(huán)下的索引變量的作用域,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),本文給出了Python3的示例幫助讀者理解,需要的朋友可以參考下2015-04-04
python實(shí)現(xiàn)FFT快速傅立葉變換算法案例
FFT(快速傅里葉變換)是計(jì)算DFT及其逆變換的一種算法,其基本思想是利用DFT的對(duì)稱性和周期性,通過分而治之的策略將DFT分解為更小的DFT,從而降低計(jì)算復(fù)雜度,FFT的算法步驟包括選擇分解、重新排序、蝶形運(yùn)算和逐層計(jì)算,在Python中2024-10-10
Python實(shí)現(xiàn)自動(dòng)計(jì)算Excel數(shù)據(jù)指定范圍內(nèi)的區(qū)間最大值
這篇文章主要為大家詳細(xì)介紹了如何基于Python自動(dòng)計(jì)算Excel數(shù)據(jù)指定范圍內(nèi)的區(qū)間最大值,文中的示例代碼簡潔易懂,感興趣的小伙伴可以了解下2023-07-07
Python的for和break循環(huán)結(jié)構(gòu)中使用else語句的技巧
平時(shí)我們把在if結(jié)構(gòu)中使用else語句當(dāng)作理所當(dāng)然,然而,Python強(qiáng)大的語法糖可以讓else語句在for和while循環(huán)中使用!下面我們就通過例子來看一下Python的for和break循環(huán)結(jié)構(gòu)中使用else語句的技巧2016-05-05

