摩斯密码(Morse)
-
加密对象: 之前只能加密一些ascii表中常用的的字符,包括字母和数字以及常用的特殊符号。后来友unicode扩展可加密一切字符
-
加密原理:
-
对于一些简单地字符,有一张对应的密码对应表
字符 摩斯码 字符 摩斯码 字符 摩斯码 字符 摩斯码 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 ----- . .-.-.- , –…-- ? …–… ! -.-.– : —… " .-…-. ’ .----. = -…- ; -.-.-. @ .–.-. ( -.–. ) -.–.- - -…- _ …–.- $ …-…- / -…-. & .-… -
对于其他字符,首先将其转为unicode数值,再转为二进制,最后用".“替换"0”, 用"-“替换"1”, 就得到了该字符的摩斯码
-
-
代码
# write by 2021/7/21 # 摩斯密码 PLAIN2CIPHER = {'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': '-----', '.': '.-.-.-', ',': '--..--', '?': '..--..', '!': '-.-.--', ':': '---...', '"': '.-..-.', "'": '.----.', '=': '-...-', ';': '-.-.-.', '@': '.--.-.', '(': '-.--.', ')': '-.--.-', '-': '-....-', '_': '..--.-', '$': '...-..-', '/': '-..-.', '&': '.-...'} CIPHER2PLAIN = {'.-': '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_morse(string): ciphertext = "" # 清除空白字符 string = string.replace("\n", "").replace(" ", "").replace("\t", "").upper() for i in string: if i in PLAIN2CIPHER: ciphertext += PLAIN2CIPHER[i] + "/" else: ciphertext += bin(ord(i))[2::].replace("0", ".").replace("1", "-") + "/" return ciphertext[:-1] def decrypt_morse(string): plaintext = "" string = string.replace("\n", "").replace(" ", "").replace("\t", "") if string.count(".") + string.count("-") + string.count("/") != len(string): return -1 string_lis = string.split("/") for i in string_lis: if i in CIPHER2PLAIN: plaintext += CIPHER2PLAIN[i] else: plaintext += chr(int(i.replace("-", "1").replace(".", "0"), 2)) print(string_lis) return plaintext if __name__ == '__main__': ciphertext_ = encrypt_morse("i love you,中国") plaintext_ = decrypt_morse(ciphertext_) print(f"{plaintext_}: {ciphertext_}")