CTF Crypto模块系列分享(三):异或加密实战!破解密码学“万能钥匙”
上期我们吃透了古典密码全系列技巧,今天咱们就如约进入Crypto的核心进阶环节——异或(XOR)加密与破解。
异或是CTF Crypto中“最灵活、最高频”的算法之一,没有之一——它既可以单独出题,也能作为复杂加密流程的核心环节,甚至常和Misc的编码、隐写结合嵌套。很多新手觉得异或难,其实它的底层逻辑极其简单,全程只靠一个运算规则,而且破解有固定套路,只要掌握“密钥定位+可逆性”两大核心,新手也能轻松上手!
一、先明确:本期核心目标(新手必掌握)
今天我们不搞复杂数学,聚焦“落地实操”,新手学会这4点,就能应对80%的异或题型:
- 掌握异或核心逻辑:理解运算规则和可逆性(破解的关键);
- 识别两大高频场景:固定密钥异或、重复密钥异或(比赛主力题型);
- 落地两种破解方式:在线工具(快速验证)+ Python脚本(应对复杂场景);
- 搞定嵌套题型:异或密文+编码(Base64/十六进制)的组合拆解。
提示:异或的核心是“密钥”,所有破解思路都围绕“找到密钥”展开,记住这句话就能抓住重点!
二、先吃透:异或(XOR)的核心逻辑(1分钟懂原理)
异或是一种二进制运算,符号为“^”,规则极其简单,无需数学基础,记住这3点就行:
运算规则:两个二进制位进行异或,相同为0,不同为1(口诀:同0异1);
示例:00=0、01=1、10=1、11=0字符运算逻辑:CTF中异或多针对字符,本质是“字符ASCII码 → 二进制 → 异或运算 → 还原为字符/十六进制”;
示例:明文‘f’(ASCII码102,二进制01100110)^ 密钥‘k’(ASCII码107,二进制01101011)= 密文(二进制00001101,对应十六进制0xD)。可逆性(破解核心):异或运算满足“明文 ^ 密钥 = 密文 → 密文 ^ 密钥 = 明文”,只要拿到密钥,就能反向还原所有内容——这是异或破解的底层逻辑!
关键提醒:异或的密钥长度有两种情况——① 固定密钥(密钥长度=1,即单字符密钥);② 重复密钥(密钥长度>1,循环与明文异或),两种场景破解方法不同,需区分处理。
三、异或高频场景实战:从识别到破解
我们按“出现频率从高到低”拆解两大场景,每类都先讲“特征识别”(快速定场景),再给“工具+脚本”破解方案,新手优先用工具练手,熟练后用脚本应对复杂场景。
场景1:固定密钥异或(单字符密钥,基础高频)
固定密钥异或是最基础的异或题型,密钥为单个字符(或单个字节),破解核心是“遍历可能密钥,验证明文合理性”。
- 特征识别
密文常以十六进制(最常见)、二进制或乱码形式呈现,无明显字母规律(区别于古典密码);
题目提示“XOR”“异或”“固定密钥”“单字节密钥”,或密文长度较短(适合遍历破解);
若密文是十六进制,长度为偶数(每个字符对应1字节)。
- 破解逻辑
ASCII可打印字符范围是32(空格)-126(~),遍历这个区间的所有字符作为密钥,分别与密文异或,若结果出现“flag{”“CTF{”等特征字符串,即为正确密钥和明文。
- 工具破解(最快方式)
① 推荐工具:CTF在线工具集(异或破解)、CryptoTool;
② 操作步骤:粘贴密文→选择“十六进制/二进制”格式→设置密钥范围(32-126)→点击破解→筛选含Flag格式的结果。
- Python脚本破解(自动遍历密钥)
适合密文格式特殊(工具无法识别)的场景,脚本带注释,新手可直接复制修改:
import binascii def xor_fixed_key(ciphertext_hex, key): """固定密钥异或解密:密文为十六进制字符串,密钥为单个字符""" # 十六进制密文转二进制字节流 ciphertext_bytes = binascii.unhexlify(ciphertext_hex) # 逐字节异或,还原明文 plaintext_bytes = bytes([b ^ ord(key) for b in ciphertext_bytes]) return plaintext_bytes.decode('utf-8', errors='ignore') # 忽略不可打印字符 def find_fixed_xor_key(ciphertext_hex): """遍历32-126ASCII字符,找到正确密钥和Flag""" for key_ascii in range(32, 127): key = chr(key_ascii) plaintext = xor_fixed_key(ciphertext_hex, key) if 'flag{' in plaintext: return plaintext, key return "未找到Flag", "" # 测试案例 if __name__ == "__main__": ciphertext_hex = "66436a7d6b5f306e3a7b2d3f6c406e7d" # 异或密文(十六进制) flag, key = find_fixed_xor_key(ciphertext_hex) print(f"正确密钥:{key}") print(f"解密结果:{flag}") # 示例输出:flag{xor_fixed_key_123}场景2:重复密钥异或(多字符密钥,进阶高频)
重复密钥异或是固定密钥的进阶版,密钥为多字符(如“key123”),循环与明文异或(密钥长度为n,明文第n+1字节与密钥第1字节异或),破解核心是“确定密钥长度”。
- 特征识别
密文多为十六进制/二进制,长度较长,无固定字符规律;
题目提示“重复密钥”“循环密钥”“XOR with repeated key”,或密文无法用固定密钥破解;
密文字母/字节分布较均匀(区别于固定密钥异或)。
- 破解步骤(核心:确定密钥长度)
确定密钥长度:用“汉明距离法”(两个字符串对应位不同的数量),计算密文分段后的平均汉明距离,距离最小的分段长度即为可能密钥长度;
分段破解:按密钥长度将密文分成n组(n为密钥长度),每组按“固定密钥异或”破解,得到密钥每一位;
拼接密钥:组合各组密钥,循环与密文异或,还原完整明文。
- 工具破解(高效落地)
① 推荐工具:CTF在线工具集(重复密钥异或破解)、CyberChef;
② 操作步骤:粘贴密文→工具自动计算可能密钥长度→选择最优长度→工具分段破解→验证结果是否含Flag。
- Python脚本(辅助确定密钥长度)
核心实现汉明距离计算,辅助定位密钥长度:
import binascii def hamming_distance(bytes1, bytes2): """计算两个字节流的汉明距离""" distance = 0 for b1, b2 in zip(bytes1, bytes2): # 异或后统计1的个数(不同位的数量) distance += bin(b1 ^ b2).count('1') return distance def find_xor_key_length(ciphertext_hex, max_length=32): """计算可能的密钥长度(1-max_length),返回距离最小的前3个长度""" ciphertext_bytes = binascii.unhexlify(ciphertext_hex) distances = [] for length in range(1, max_length+1): # 按长度分段,取前两段计算距离 if len(ciphertext_bytes) < 2*length: continue block1 = ciphertext_bytes[:length] block2 = ciphertext_bytes[length:2*length] # 计算平均距离(归一化,消除长度影响) avg_distance = hamming_distance(block1, block2) / length distances.append((length, avg_distance)) # 按距离从小到大排序,返回前3个可能长度 distances.sort(key=lambda x: x[1]) return [length for length, _ in distances[:3]] # 测试案例 if __name__ == "__main__": ciphertext_hex = "73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d" possible_lengths = find_xor_key_length(ciphertext_hex) print(f"可能的密钥长度:{possible_lengths}") # 示例输出:[4, 3, 6]四、实战小任务:异或+编码嵌套题(接近比赛真题)
比赛中异或常和编码结合嵌套,我们用一道真题简化版练习完整流程,串联前两期知识点:
- 题目:解码以下内容,得到Flag
密文:“Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5V1JteDBWMjFHVmpGYVJsWmlhMlJ0VjJ0U1ExWkdXbFpPYjNFeVJtOTFWVkpzV0ZKc2NtRkhhRk5pVjJWd1ZtMTBWMnhXVmxadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxwV1IzaGhXVEpPYjFKR1NsaFhiR2hTYXpWdlZGVm9RMlJzV0ZKcmFGWkhhMk5yVmpCV1YwZDBVWGhTYXpWd1ZHVmtNRlZ0TVc5V1YxWnRlRWRHYUdFeFdWZ3pNRlZ0TVc5V1YxWnRlRWRH"(提示:先Base64,再异或)
解题步骤(新手跟着做)
第一步:Base64解码——用在线工具解码密文,得到十六进制字符串:“66436a7d6b5f306e3a7b2d3f6c406e7d694f7624662065622127234f726927756d…”;
第二步:判断异或类型——尝试固定密钥破解,遍历32-126ASCII字符;
第三步:找到密钥——当密钥为“k”(ASCII码107)时,异或后得到明文:“flag{xor_plus_base64_789}”,成功拿到Flag。
嵌套题核心:先破解外层编码(Base64/十六进制),还原为异或密文格式,再按对应异或场景破解,每一步验证结果特征。
五、新手避坑:异或加密最容易踩的6个坑
坑1:混淆密文格式——把十六进制密文当字符串直接异或,需先转二进制字节流(用binascii.unhexlify);
坑2:忽略密钥范围——遍历密钥时只查字母数字,遗漏空格、符号等ASCII字符(32-126全范围才稳妥);
坑3:重复密钥长度判断错——只选汉明距离最小的长度,建议验证前3个可能长度,避免遗漏;
坑4:异或后乱码直接放弃——乱码可能是未解码外层编码,先尝试Base64/十六进制解码再异或;
坑5:编码格式错误——Base64解码后若不是十六进制,检查密文是否有多余空格/换行;
坑6:脚本编码报错——异或后解码用“errors=‘ignore’”,忽略不可打印字符,避免脚本中断。
六、下期预告&福利时间
今天我们搞定了异或加密的两大高频场景,还学会了应对嵌套题型——这是Crypto进阶的核心,掌握后能稳步拿下比赛中的进阶分!下期我们将进入加密算法的另一大核心:哈希与对称加密基础,拆解MD5/SHA哈希查询、AES加密解密入门,教大家应对哈希验证、对称加密类题型!
福利时间到!获取3份新手必备资料:
- 本期异或脚本模板(固定/重复密钥整合版,含注释可直接运行);
- 异或题型特征+破解流程对照表(打印版,快速定位场景);
- 异或+编码嵌套实战题合集(15道真题简化版,含详细步骤)。
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
如果今天的内容对你有帮助,别忘了点赞、在看,转发给一起学CTF的小伙伴~
网安学习资源
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我们和网安大厂360共同研发的的网安视频教程,内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识,而且包含了中级的各种渗透技术,并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频,100多本网安电子书,最新学习路线图和工具安装包都有,不用担心学不全。
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源