文章总结: 本文详解CTF密码学题beginners-luck,通过分析脚本发现重复密钥XOR加密漏洞,利用xortool基于频率分析恢复密钥并解密图片获取Flag。文章阐述了XOR特性、Kasiski测试原理及PNG结构,指出自制加密不安全,建议使用AES-GCM等现代标准方案。 综合评分: 91 文章分类: CTF,二进制安全,逆向分析,安全工具
第一步:分析加密脚本
首先,我们需要仔细阅读加密脚本,理解加密算法的实现细节。
cat enc27.py
加密脚本内容如下:
#!/usr/bin/env python
def supa_encryption(s1, s2):
res = [chr(0)]*24
for i in range(len(res)):
q = ord(s1[i])
d = ord(s2[i])
k = q ^ d
res[i] = chr(k)
res = ''.join(res)
return res
def add_pad(msg):
L = 24 - len(msg)%24
msg += chr(L)*L
return msg
with open('fullhd.png','rb') as f:
data = f.read()
data = add_pad(data)
with open('key.txt') as f:
key = f.read()
enc_data = ''
for i in range(0, len(data), 24):
enc = supa_encryption(data[i:i+24], key)
enc_data += enc
with open('BITSCTFfullhd.png', 'wb') as f:
f.write(enc_data)
算法分析
通过阅读代码,我们可以提取出以下关键信息:
1. 核心加密函数 – supa_encryption
这个函数接收两个参数,都是24字节长度:
s1: 明文数据块s2: 密钥
函数的核心操作是第8行的 k = q ^ d,这是一个异或(XOR)运算。
2. 填充函数 – add_pad
这个函数实现了PKCS7风格的填充:
- 计算需要填充的字节数:
L = 24 - len(msg)%24 - 添加L个值为L的字节
例如,如果数据长度为50字节,50 % 24 = 2,需要填充22个字节,每个字节的值都是22。
3. 加密流程
主程序的加密流程:
- 读取原始PNG文件
- 对数据进行填充,使长度为24的倍数
- 读取24字节的密钥(从key.txt)
- 将数据分成每24字节一块
- 对每一块使用相同的24字节密钥进行XOR加密
- 将所有加密块连接起来,写入新文件
第二步:理解XOR运算的特性
在深入分析攻击方法之前,我们需要理解XOR运算的基本特性。
XOR运算基础
XOR(异或)是一种位运算,其真值表如下:
A B A⊕B
0 0 0
0 1 1
1 0 1
1 1 0
简单来说:两个位相同时结果为0,不同时结果为1。
XOR运算的关键特性
XOR运算具有以下重要特性:
- 可逆性:如果 C = A ⊕ B,那么 A = C ⊕ B,B = C ⊕ A
- 自反性:A ⊕ A = 0
- 恒等性:A ⊕ 0 = A
这些特性对于密码分析至关重要。特别是可逆性,意味着:
密文 = 明文 ⊕ 密钥
明文 = 密文 ⊕ 密钥
密钥 = 明文 ⊕ 密文
也就是说,XOR加密和解密使用完全相同的操作!
第三步:识别加密方案的弱点
现在我们已经理解了加密算法,接下来需要找出它的弱点。
关键弱点:密钥重用
观察加密脚本的第58-60行:
for i in range(0, len(data), 24):
enc = supa_encryption(data[i:i+24], key)
enc_data += enc
这段代码揭示了一个致命的弱点:相同的24字节密钥被重复使用。
这意味着:
- 明文的第0、24、48、72…字节都使用key[0]加密
- 明文的第1、25、49、73…字节都使用key[1]加密
- 以此类推
频率分析攻击的可能性
密钥重用使得我们可以进行频率分析。对于二进制文件,某些字节值出现的频率特别高。
特别是PNG图像文件,通常包含大量的0x00字节。如果我们假设明文中最常见的字节是0x00,那么:
密钥字节 = 0x00 ⊕ 密文中最常见的字节
由于 0x00 ⊕ X = X,所以密文中每个位置最常见的字节值,很可能就是密钥的对应字节。
第四步:使用xortool进行自动化攻击
理论分析完成后,我们需要实际执行攻击。xortool是一个专门用于分析和破解XOR加密的工具。
安装xortool
首先安装工具:
pip3 install xortool
安装成功后,我们就可以使用这个工具了。
执行攻击
运行以下命令对加密文件进行分析:
xortool -c 00 BITSCTFfullhd.png
参数说明:
-c 00:指定明文中最常见的字符是0x00(十六进制)BITSCTFfullhd.png:要分析的加密文件
分析输出结果
执行命令后,xortool输出以下信息:
The most probable key lengths:
3: 10.7%
6: 12.4%
8: 12.7%
12: 14.6%
24: 15.8%
工具检测到最可能的密钥长度是24字节,概率为15.8%。这与我们从加密脚本中了解到的信息完全一致!
继续查看输出:
1 possible key(s) of length 24:
rkh%QP4g0&3g46@4*%f(UN#\
xortool成功恢复了24字节的密钥!工具还自动将解密结果保存在xortool_out目录中。
第五步:验证解密结果
现在我们需要验证解密是否成功。
检查输出文件
进入xortool的输出目录:
cd xortool_out
ls -lh
可以看到生成了以下文件:
0.out– 解密后的文件(44KB)filename-key.csv– 密钥信息filename-char_used-perc_valid.csv– 字符使用统计
验证文件类型
使用file命令检查解密文件的类型:
file 0.out
输出结果:
0.out: PNG image data, 1920 x 1080, 8-bit/color RGB, non-interlaced
完美!文件类型显示这是一个有效的PNG图像文件,分辨率为1920×1080。解密成功!
验证解密的正确性
让我们通过十六进制查看来验证解密是否正确。首先查看加密文件的前16字节:
hexdump -C ../BITSCTFfullhd.png | head -n 1
输出:
00000000 fb 3b 26 62 5c 5a 2e 6d 30 26 33 6a 7d 7e 04 66
这些是加密后的数据。现在查看解密文件的前16字节:
hexdump -C 0.out | head -n 1
输出:
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52
这正是标准的PNG文件头!89 50 4E 47 0D 0A 1A 0A是PNG文件的魔术字节。
数学验证
让我们验证XOR解密的正确性。使用Python进行计算:
# 加密数据的前8字节
encrypted = bytes([0xfb, 0x3b, 0x26, 0x62, 0x5c, 0x5a, 0x2e, 0x6d])
# 恢复的密钥前8字节
key = b'rkh%QP4g'
# 解密
decrypted = bytes([encrypted[i] ^ key[i] for i in range(8)])
print(decrypted.hex())
输出结果:89504e470d0a1a0a,正是PNG文件头!这证明了我们的解密是正确的。
获取flag
打开解密后的PNG图像文件,可以看到图像中显示的flag:
BITSCTF{p_en_gee}
flag中的”p_en_gee”是PNG的谐音,呼应了题目使用PNG图像文件的特点。
第六步:技术原理深入分析
现在我们已经成功破解了加密,让我们深入理解xortool的工作原理。
密钥长度检测原理
xortool使用Kasiski测试来检测密钥长度。基本原理是:
- 在重复密钥XOR加密中,如果明文中有重复的片段,且这些片段的间隔是密钥长度的倍数,那么对应的密文片段也会重复
- 通过寻找密文中重复的序列,计算它们之间的距离
- 这些距离的最大公约数很可能就是密钥长度
密钥恢复原理
一旦确定了密钥长度为24,xortool会对每个密钥位置进行频率分析:
- 将密文按密钥长度(24)分组,提取每个位置的所有字节
- 统计每个位置上各字节值的出现频率
- 假设明文中最常见的字节是0x00
- 密文中每个位置最常见的字节值即为该位置的密钥字节
攻击成功的三个关键因素
这个加密方案之所以能被成功破解,有三个关键因素:
1. 密钥重用
相同的24字节密钥被重复使用约1870次(44KB ÷ 24字节),这使得每个密钥位置都有足够多的样本进行统计分析。
2. 数据量充足
PNG图像文件包含大量数据,为频率统计提供了足够的样本。数据量越大,统计结果越准确。
3. 明文特征明显
PNG图像文件包含大量的0x00字节,使得频率分析假设非常准确。
第七步:安全性分析与防御建议
这个加密方案的安全缺陷
这个加密方案实际上是Vigenere密码的二进制版本,存在严重的安全问题:
- 密钥重用导致易受频率分析攻击
- 没有使用初始化向量(IV)或随机数
- 密文保留了明文的统计特征
- 密钥空间相对较小(24字节)
正确的加密方案
在实际应用中,应该使用现代密码学标准,例如AES-256-GCM:
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)
nonce = os.urandom(12)
ciphertext = aesgcm.encrypt(nonce, plaintext, None)
这种方案的优势包括:使用现代分组密码算法、包含认证机制、使用随机nonce防止密钥重用。
总结
解题步骤回顾
本题的完整解题流程:
- 分析加密脚本,识别XOR加密算法
- 理解XOR运算的可逆性特性
- 识别密钥重用的致命弱点
- 使用xortool进行自动化攻击
- 验证解密结果的正确性
- 获取flag
核心知识点
通过这道题目,我们学习到了以下重要的密码学概念:
- XOR加密的特性:可逆性、自反性、恒等性
- 频率分析攻击:利用明文的统计特征破解密码
- Kasiski测试:检测重复密钥长度的经典方法
- 文件格式知识:PNG文件头的固定结构
- 密码学工具使用:xortool的实战应用
安全启示
这道题目给我们带来了重要的安全启示:
- 不要自己实现加密算法:密码学是高度专业的领域,应使用经过验证的标准算法
- 密钥不应重复使用:密钥重用会暴露统计特征
- 使用现代加密库:如AES-GCM等经过广泛验证的方案
结语
这道”beginners-luck”题目虽然难度不高,但很好地展示了经典密码学攻击的原理。
通过实际操作,我们不仅学会了如何破解XOR加密,更重要的是理解了为什么这种加密方式不安全。
密码学是信息安全的基石,但同时也是一个充满陷阱的领域。即使是看似简单的加密算法,如果实现不当,也会存在严重的安全隐患。
希望通过本文的详细分析,能够帮助读者深入理解XOR加密的弱点和频率分析攻击的原理,在今后的学习和工作中避免类似的安全问题。
Flag: BITSCTF{p_en_gee}
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:破镜安全 破镜安全《CTF密码学挑战beginners-luck:XOR加密的频率分析攻击实战》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论