CTF加密套路解析:base64与凯撒的N种组合方式(附Python解密脚本)

在CTF竞赛中,加密类题目往往采用多种加密算法的组合来增加破解难度。本文将深入分析base64与凯撒加密的混合使用模式,并提供可复用的Python解密脚本模板。通过实际案例拆解,帮助安全研究人员快速识别算法特征并构建解密流程。

1. 加密组合模式的特征识别

当遇到多层加密的CTF题目时,快速判断加密类型是解题的关键。以下是三种典型加密算法的识别方法:

base64加密特征

  • 输出字符串长度总是4的倍数
  • 常出现===填充字符
  • 字符集为A-Za-z0-9+/
  • 在IDA中可见明显的编码表(如ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

凯撒加密特征

  • 字母和数字的位移操作
  • 代码中出现(ch - key + N) % N的模运算
  • 在IDA中常见如下模式:
    *v7 = (v5 - 65 + 3) % 26 + 65;  // 大写字母处理
    *v7 = (v5 - 97 + 3) % 26 + 97;  // 小写字母处理 
    *v7 = (v5 - 48 + 3) % 10 + 48;  // 数字处理
    

替换加密特征

  • 使用strncpy进行数据块搬移
  • 明文字符位置与密文字符位置存在固定映射关系
  • 代码中可见多个内存拷贝操作,如:
    strncpy(a3, a1 + 26, 0xDui64);
    strncpy(v6 + 13, Source, 0xDui64);
    

2. 典型三重加密流程分析

以[羊城杯2020]easyre为例,其加密流程为典型的base64→替换→凯撒组合:

2.1 第一层:base64加密

import base64

def custom_base64_encode(plaintext):
    # 标准base64编码
    return base64.b64encode(plaintext.encode()).decode()

sample = "flag{test_string_for_demo}"
encoded = custom_base64_encode(sample)
print(f"Base64编码结果: {encoded}")

2.2 第二层:替换加密

采用四段位置交换模式:

原始分段:[A(0-12)][B(13-25)][C(26-38)][D(39-51)]
加密后:[C][A][D][B]

Python实现:

def replace_encrypt(text):
    seg_len = 13
    seg1 = text[2*seg_len : 3*seg_len]  # 取第三段
    seg2 = text[:seg_len]               # 取第一段
    seg3 = text[3*seg_len:]             # 取第四段
    seg4 = text[seg_len : 2*seg_len]    # 取第二段
    return seg1 + seg2 + seg3 + seg4

2.3 第三层:凯撒加密

对字母和数字分别进行位移:

def caesar_encrypt(text, shift=3):
    result = []
    for char in text:
        if 'A' <= char <= 'Z':
            result.append(chr((ord(char) - 65 + shift) % 26 + 65))
        elif 'a' <= char <= 'z':
            result.append(chr((ord(char) - 97 + shift) % 26 + 97))
        elif '0' <= char <= '9':
            result.append(chr((ord(char) - 48 + shift) % 10 + 48))
        else:
            result.append(char)
    return ''.join(result)

3. 逆向解密脚本开发

解密需要按照加密的逆序进行,即:凯撒解密→替换还原→base64解码。

3.1 凯撒解密

def caesar_decrypt(ciphertext, shift=3):
    result = []
    for char in ciphertext:
        if 'A' <= char <= 'Z':
            result.append(chr(65 + (ord(char) - 65 - shift) % 26))
        elif 'a' <= char <= 'z':
            result.append(chr(97 + (ord(char) - 97 - shift) % 26))
        elif '0' <= char <= '9':
            result.append(chr(48 + (ord(char) - 48 - shift) % 10))
        else:
            result.append(char)
    return ''.join(result)

3.2 替换解密

def replace_decrypt(text):
    seg_len = 13
    seg1 = text[seg_len : 2*seg_len]    # 恢复原第二段
    seg2 = text[3*seg_len : 4*seg_len]  # 恢复原第四段
    seg3 = text[:seg_len]               # 恢复原第一段
    seg4 = text[2*seg_len : 3*seg_len]  # 恢复原第三段
    return seg3 + seg1 + seg4 + seg2

3.3 完整解密流程

def full_decrypt(ciphertext):
    # 第一步:凯撒解密
    step1 = caesar_decrypt(ciphertext)
    print(f"凯撒解密后: {step1}")
    
    # 第二步:替换解密
    step2 = replace_decrypt(step1)
    print(f"替换解密后: {step2}")
    
    # 第三步:base64解码
    step3 = base64.b64decode(step2).decode()
    print(f"Base64解码后: {step3}")
    
    return step3

# 测试用例
cipher = "EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG"
print(f"最终flag: {full_decrypt(cipher)}")

4. 其他常见组合模式

除上述组合外,CTF中还常见以下加密组合方式:

模式1:base64变异→凯撒

  • 使用自定义base64编码表
  • 凯撒位移量动态变化

模式2:凯撒→base64→二次凯撒

  • 第一层凯撒使用固定位移
  • 第二层凯撒使用位置相关位移

模式3:替换→base64→替换

  • 双重替换增加混淆度
  • 中间用base64防止直接观察

针对这些变种,解密时需要灵活调整策略。例如遇到自定义base64编码表时,需要先提取或逆向出编码表:

# 自定义base64解码示例
def custom_b64decode(text, custom_table):
    std_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    trans = str.maketrans(custom_table, std_table)
    return base64.b64decode(text.translate(trans)).decode()

5. 实战技巧与注意事项

  1. 长度分析:base64编码后长度通常是原始数据长度的4/3倍(向上取整)

  2. 字符分布:凯撒加密不会改变字符频率分布特征

  3. 调试技巧

    # 动态调试解密过程
    def debug_decrypt(step, data):
        print(f"[DEBUG] Step {step}: {data[:20]}... (len={len(data)})")
        return data
    
  4. 自动化识别

    def detect_encryption(text):
        if all(c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' for c in text):
            if text.endswith('='):
                return 'base64'
        # 其他检测逻辑...
        return 'unknown'
    
  5. 性能优化

    # 使用bytes操作加速凯撒解密
    def fast_caesar_decrypt(ciphertext):
        bytes_arr = bytearray(ciphertext.encode())
        for i in range(len(bytes_arr)):
            c = bytes_arr[i]
            if 65 <= c <= 90:  # A-Z
                bytes_arr[i] = (c - 65 - 3) % 26 + 65
            elif 97 <= c <= 122:  # a-z
                bytes_arr[i] = (c - 97 - 3) % 26 + 97
            elif 48 <= c <= 57:  # 0-9
                bytes_arr[i] = (c - 48 - 3) % 10 + 48
        return bytes_arr.decode()
    

通过系统掌握这些加密组合模式的识别与破解方法,配合提供的Python脚本模板,能够有效提升CTF竞赛中加密类题目的解题效率。在实际操作中,建议先静态分析加密流程,再编写对应解密脚本,最后通过动态调试验证解密结果。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐