CTF密码学常见加密及解密脚本二

一.摩斯密码

摩斯密码的介绍:由美国人萨缪尔·摩尔斯(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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值