溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何利用Python破解摩斯密碼

發(fā)布時(shí)間:2022-02-19 13:39:40 來(lái)源:億速云 閱讀:177 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)如何利用Python破解摩斯密碼,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

摩爾斯電碼

摩斯密碼的定義如下:

摩爾斯電碼( 又譯為摩斯密碼,英語(yǔ):Morse code)是一種時(shí)通時(shí)斷的信號(hào)代碼,通過(guò)不同的排列順序來(lái)表達(dá)不同的英文字母、數(shù)字和標(biāo)點(diǎn)符號(hào)。是由美國(guó)人艾爾菲德·維爾與薩繆爾·摩爾斯在1836年發(fā)明。

摩爾斯電碼是一種早期的數(shù)碼化通信形式,它依靠一系列的點(diǎn)和劃來(lái)傳遞編碼信息,它的代碼包括五種:

  • 點(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)的長(zhǎng)度(也就是上面的時(shí)間長(zhǎng)度t)決定了發(fā)報(bào)的速度。

我們的英文字母、數(shù)字和標(biāo)點(diǎn)符號(hào)與摩斯密碼的對(duì)照?qǐng)D如下:

如何利用Python破解摩斯密碼

我們現(xiàn)在要發(fā)送 “M O R S E(空格) C O D E” (morse code)這單詞,通過(guò)查表可知,它應(yīng)該是這樣

—— ——— ·—· ··· · / —·—· ——— —·· ·

對(duì)應(yīng)的報(bào)文應(yīng)該如下(滴 表示敲擊,? 表示停頓)

滴滴滴?滴滴滴???滴滴滴?滴滴滴?滴滴滴???滴?滴滴滴?滴???滴?滴?滴???滴???????滴滴滴?滴?滴滴滴?滴???滴滴滴?滴滴滴?滴滴滴

是不是很有意思?

Python實(shí)現(xiàn)

用 Python 實(shí)現(xiàn)摩斯密碼的加解密,其實(shí)很簡(jiǎn)單,只需要把對(duì)照表放在一個(gè)字典中,加密的時(shí)候?qū)⒚魑牟鸱郑缓髲淖值渲腥〕鰧?duì)應(yīng)的密碼組合在一起,解密的時(shí)候就是通過(guò)密文去對(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': '-----', 
                   ', ': '--..--', '.': '.-.-.-', '?': '..--..', '/': '-..-.', '-': '-....-', 
                   '(': '-.--.', ')': '-.--.-'
                   }

加密

加密的過(guò)程就是將明文通過(guò)對(duì)照表翻譯成密文的過(guò)程。

我們逐個(gè)讀取明文,如果是字母、數(shù)字或者標(biāo)點(diǎn)符號(hào)就到字典里面找對(duì)應(yīng)的密碼,字符之間用空格隔開(kāi),如果是單詞之間的空格,就添加兩個(gè)連續(xù)空格,以隔開(kāi)單詞。

加密過(guò)程的代碼如下:

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)的英語(yǔ)字符,并將其添加到將存儲(chǔ)結(jié)果的變量中。

一旦我們得到 2 個(gè)連續(xù)的空格,我們就會(huì)向包含解碼字符串的變量添加另一個(gè)空格。

字符串末尾的最后一個(gè)空格將幫助我們識(shí)別莫爾斯電碼字符的最后一個(gè)序列。

解密過(guò)程的代碼如下:

# 將字符串從摩斯解密為英文的函數(shù)
def decrypt(message):
    # 在末尾添加額外空間以訪問(wèn)最后一個(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:
                # 添加空格來(lái)分隔單詞
                decipher += ' '
            else:
                # 使用它們的值訪問(wèn)密鑰(加密的反向)
                decipher += list(MORSE_CODE_DICT.keys())[list(MORSE_CODE_DICT.values()).index(citext)]
                citext = ''
    return decipher

測(cè)試

我們先來(lái)測(cè)試一下加密算法:

message = "I LOVE YOU"
result = encrypt(message.upper())
print(result)

運(yùn)行結(jié)果是:

..  .-.. --- ...- .  -.-- --- ..-

大家可以自己對(duì)照著映射表來(lái)看看是否正確。

再測(cè)試一下解密算法:

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):
    # 在末尾添加額外空間以訪問(wèn)最后一個(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:
                # 添加空格來(lái)分隔單詞
                decipher += ' '
            else:
                # 使用它們的值訪問(wèn)密鑰(加密的反向)
                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()

關(guān)于“如何利用Python破解摩斯密碼”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI