CTF加密套路解析:base64与凯撒的N种组合方式(附Python解密脚本)
·
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. 实战技巧与注意事项
-
长度分析:base64编码后长度通常是原始数据长度的4/3倍(向上取整)
-
字符分布:凯撒加密不会改变字符频率分布特征
-
调试技巧:
# 动态调试解密过程 def debug_decrypt(step, data): print(f"[DEBUG] Step {step}: {data[:20]}... (len={len(data)})") return data -
自动化识别:
def detect_encryption(text): if all(c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' for c in text): if text.endswith('='): return 'base64' # 其他检测逻辑... return 'unknown' -
性能优化:
# 使用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竞赛中加密类题目的解题效率。在实际操作中,建议先静态分析加密流程,再编写对应解密脚本,最后通过动态调试验证解密结果。
更多推荐



所有评论(0)