CTF新手必看:从猪圈密码到JSFuck,这10种古典密码的识别与破解实战

张开发
2026/4/19 23:37:15 15 分钟阅读

分享文章

CTF新手必看:从猪圈密码到JSFuck,这10种古典密码的识别与破解实战
CTF密码学实战10种古典密码的快速识别与高效破解指南第一次参加CTF比赛时我盯着那道Crypto题目发呆了半小时——密文由一堆点和横线组成隐约像是某种编码但完全无从下手。直到队友提醒试试摩斯密码三行Python代码就解出了flag。这种经历让我意识到密码学挑战的核心不是数学能力而是快速识别密码类型并选择正确工具的能力。本文将分享CTF中最常见的10种古典密码的实战破解流程从特征识别到工具使用帮你避开我踩过的那些坑。1. 密码学挑战的解题思维框架在CTF竞赛中遇到密码学题目时新手常犯的错误是直接开始暴力破解。实际上高效的解题流程应该是观察特征→分类识别→选择工具→验证结果。以下是具体操作步骤密文特征分析统计字符集范围是否只有A/B包含数字吗观察字符分布规律固定分组重复模式检查是否有非文本内容图片、音频等题目线索挖掘# 示例从题目描述提取关键词 description The message was encoded using an ancient cipher used by monks keywords [ancient, monks] # 可能指向圣堂武士密码工具链准备工具类型推荐工具适用场景在线解码CyberChef快速验证多种密码Python库pycryptodome复杂加密算法专用解码器dCode.fr小众密码自定义脚本本文提供的代码片段特定变种密码提示永远先尝试在线工具快速验证猜想再考虑编写定制化解码脚本2. 高频古典密码识别特征与破解2.1 猪圈密码Pigpen Cipher识别特征由直线和点组成的图形符号类似九宫格分区部分变种包含X形符号常出现在图片题或替换密码题中破解方法对照标准密码表手动翻译╔═══╦═══╦═══╗ ║ A ║ B ║ C ║ ╠═══╬═══╬═══╣ ║ D ║ E ║ F ║ ╠═══╬═══╬═══╣ ║ G ║ H ║ I ║ ╚═══╩═══╩═══╝Python自动化解码pigpen_map { ╔═══╗: A, ╦═══╗: B, ╦═══╗: C, ╠═══╣: D, ╬═══╣: E, ╬═══╣: F, ╚═══╝: G, ╩═══╝: H, ╩═══╝: I } def decode_pigpen(cipher): return .join([pigpen_map.get(symbol, ?) for symbol in cipher.split()])2.2 培根密码Bacons Cipher识别特征由5位一组的A/B或a/b字符串组成常见变体使用不同字体或大小写作为区分示例AABBA ABBAA ABBAB AAABB AABAA破解步骤确认编码版本标准版或扩展版使用分组转换工具# 使用CyberChef的Bacon Cipher模块 echo AABBA ABBAA ABBAB AAABB AABAA | cyberchef -r Bacon Cipher手动对照表编码字母编码字母AAAAAAAAAABBAAABACAAABBD......BBBBAZ2.3 JSFuck与BrainFuckJSFuck特征仅由[ ] ( ) ! 六个字符组成通常以[][(![][])[[]]...形式开头长度极长且难以阅读破解方案// 直接执行JSFuck代码 const jsfuckCode [][(![][])[[]]...; console.log(eval(jsfuckCode)); // 输出解密结果BrainFuck特征仅包含-.,[]八种字符形如[-].在线解码使用dCode.fr的BrainFuck解释器或本地安装brainfuck-interpreter包3. 替换类密码实战3.1 凯撒密码Caesar Cipher识别特征字母被统一位移替换词频分析显示类似正常语言分布题目提示可能包含shift或rotation自动化破解def caesar_brute(text): for shift in range(26): decoded [] for char in text: if char.isalpha(): base ord(A) if char.isupper() else ord(a) decoded.append(chr((ord(char) - base - shift) % 26 base)) else: decoded.append(char) print(fShift {shift}: {.join(decoded)}) caesar_brute(Khoor Zruog)3.2 键盘替换密码QWE类型特征字母被键盘上相邻键位替换明文HELLO→密文ITSSG九宫格数字型数字重复出现如6 666 22 444对应手机键盘布局解码脚本qwe_map str.maketrans( qwertyuiopasdfghjklzxcvbnm, abcdefghijklmnopqrstuvwxyz ) print(itssg.translate(qwe_map)) # 输出hello4. 进阶密码破解技巧4.1 栅栏密码Rail Fence识别特征传统型字符按固定间隔重组W型可见波浪形字母分布模式Python解码def rail_fence_decode(cipher, rails): pattern [[] for _ in range(rails)] down True row 0 # 重建栅栏模式 for _ in cipher: pattern[row].append(None) row 1 if down else -1 if row 0 or row rails-1: down not down # 填充字符 idx 0 for r in range(rails): for c in range(len(pattern[r])): pattern[r][c] cipher[idx] idx 1 # 按行读取 result [] down True row 0 for _ in range(len(cipher)): result.append(pattern[row].pop(0)) row 1 if down else -1 if row 0 or row rails-1: down not down return .join(result)4.2 维吉尼亚密码Vigenère识别特征字母替换规则不固定词频分析显示多套字母分布可能提供密钥提示如题目名含key破解流程使用Kasiski测试确定密钥长度对每组字母进行频率分析尝试常见密钥CTF、FLAG等from pycryptodome.Cipher import Vigenere def vigenere_break(cipher, max_key_len10): # 实现Kasiski测试 # ...省略具体实现... return probable_key key vigenere_break(VHVWWXWFAX) print(Vigenere.new(key).decrypt(cipher))5. 实战案例解析CTF题目示例题目描述A message from the past: 密文.... . .-.. .-.. --- ..--.- .-- --- .-. .-.. -..解题步骤观察特征由点和横线组成空格分隔识别类型摩斯电码选择工具morse_dict { .-: A, -...: B, -.-.: C, # ...完整摩斯码表... ..--.-: _ } def decode_morse(code): return .join([morse_dict.get(c, ?) for c in code.split()]) print(decode_morse(.... . .-.. .-.. --- ..--.- .-- --- .-. .-.. -..)) # 输出HELLO_WORLD进阶挑战题目名称[CISCN2021]crypto_rabbit 密文U2FsdGVkX13n1g2tYXm7J3v8iN4kZq7L9wC0yJbPc解题思路观察特征Base64编码格式常见加密模式Rabbit、AES等尝试Rabbit解密题目提示echo U2FsdGVkX13n1g2tYXm7J3v8iN4kZq7L9wC0yJbPc | openssl enc -d -rabbit -md md5 -a在CTF比赛中古典密码题目往往是最容易得分的突破口。掌握这些密码的特征识别方法和工具链能让你在比赛中快速拿下基础分。建议读者在本地搭建一个密码破解工具箱包含本文提到的所有脚本和工具快捷方式。当遇到新密码类型时先分析其与已知密码的相似性再针对性调整破解策略——这正是密码学挑战的乐趣所在。

更多文章