一.摩斯密码
摩斯密码的介绍:由美国人萨缪尔·摩尔斯(Samuel Morse)及其助手阿尔弗雷德·维尔(Alfred Vail)在1836年发明的。摩斯密码的原理基于两种基本信号:点和划(或称为短音和长音),通过它们的组合来表示字母、数字和符号。
摩斯密码的基本原理:
1.点和划
点(·):最短的信号,表示一个短音
划(-):较长的信号,表示一个长音
2.间隔
字母间间隔:表示两个字母之间的间隔,通常是三个点的长度。
单词间间隔:表示两个单词之间的间隔,通常是七个点的长度。
3.编码规则
每个字母或数字由一系列点和划的组合表示。
例如,字母“A”用“· -”表示,字母“B”用“- · · ·”表示。
解密脚本
# 摩尔斯电码解码器
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', '-----': '0', '.----': '1', '..---': '2', '...--': '3',
'....-': '4', '.....': '5', '-....': '6', '--...': '7', '---..': '8',
'----.': '9', '.-.-.-': '.', '--..--': ',', '..--..': '?',
'-.-.--': '!', '---...': ':', '.----.': "'", '..--.-': '/',
'-..-.': '(', '-.--.': ')', '-.--.-': '&', '.-...': '@',
'-.-.-.': '_', '.-.-.': '+', '-....-': '-', '..--.-': '$',
'.-.-.': '*', '.--.-.': '/', '-..-.': '^', '-.--.': '~',
'.--.': 'B', '-....-': '=', '-.-.--': '"'
}
def decode_morse(morse_code):
# 将摩尔斯电码按字符分割
words = morse_code.split(' ')#这里可以修改分隔符
decoded_text = ''
for word in words:
decoded_word = ''
for letter in word.split():
decoded_word += MORSE_CODE_DICT.get(letter, '')
decoded_text += decoded_word
return decoded_text.strip()
# 摩尔斯电码字符串
morse_code = input("请输入要解密的摩斯密码")
# 解码
decoded_message = decode_morse(morse_code)
print('Decoded message:', decoded_message)
有的时候在比赛题目中,摩斯密码可能是用/分隔的,可以修改分隔符
二.输错的字符
例:
老师让小红抄写一段话,结果粗心的小红把部分数字抄成了字母,
还把所有字母都换成大写。你能帮小红恢复并解开答案吗
SGUXBGGFRZGPZFGVDGW
这里考虑所有的情况
猜测是base64加密,因为这种加密方式在比赛中最为常见,base64一般是4个4个来的,所以这里最后补上=,然后猜测所有可能性
s->5
u->0
z->2
g->9
考虑错的字符和错了几个字符之间的组合,通过递归得到所有组合并解码,得到如下脚本
from base64 import b64decode
from string import printable
# 字母数字对应表
Numlist = {'s': '5', 'g': '9', 'z': '2', 'u': '0'}
# 分割字符串
def cut(obj, sec):
return [obj[i:i + sec] for i in range(0, len(obj), sec)]
# 使用递归将字符串还原回所有可能的结果
def decode(str):
res = []
if len(str) > 1:
relist = decode(str[1:])
Rlist = decode(str[0])
for i in Rlist:
for j in relist:
res.append(i + j)
else:
res.append(str[0].lower())
res.append(str[0].upper())
if str[0].lower() in Numlist:
res.append(Numlist[str[0].lower()])
return res
# 判断base解码后是否是正常的字符
def isbase(str):
try:
res = b64decode(str)
except Exception:
return False
# 判断是否为可打印字符
for i in res:
if i not in printable.encode():
return False
return True
# 主函数,处理输入并输出所有可能的解码结果
def process_string(enstr):
enlist = cut(enstr, 4) # 切割字符串成4个字符一组
all_combinations = [] # 用来存储所有组合的解码结果
# 逐组解码并生成所有可能的组合
for i in enlist:
delist = decode(i) # 获取每组的所有可能字符组合
possible_decodes = []
for base in delist:
base += '=' * (4 - len(base) % 4) # 填充 '=' 以确保Base64格式
if isbase(base): # 检查是否为有效的Base64编码
decoded_str = b64decode(base).decode() # 解码并获取原始文本
possible_decodes.append(decoded_str) # 保存有效解码结果
all_combinations.append(possible_decodes) # 将每组的解码结果加入列表
return all_combinations
# 输出所有可能的完整解码结果
def generate_combinations(all_combinations):
from itertools import product
# 使用itertools.product生成所有组合
for combination in product(*all_combinations):
print(''.join(combination)) # 输出每个完整的解码结果
if __name__ == '__main__':
enstr = 'SGUXBGGFRZGPZFGVDGW' # 输入字符串
# 获取所有可能的解码组合
all_combinations = process_string(enstr)
# 输出所有完整的解码结果
generate_combinations(all_combinations)