CTF密码学挑战beginners-luck:XOR加密的频率分析攻击实战

admin 2026-01-15 14:44:34 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详解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. 加密流程

主程序的加密流程:

  1. 读取原始PNG文件
  2. 对数据进行填充,使长度为24的倍数
  3. 读取24字节的密钥(从key.txt)
  4. 将数据分成每24字节一块
  5. 对每一块使用相同的24字节密钥进行XOR加密
  6. 将所有加密块连接起来,写入新文件

第二步:理解XOR运算的特性

在深入分析攻击方法之前,我们需要理解XOR运算的基本特性。

XOR运算基础

XOR(异或)是一种位运算,其真值表如下:

A   B   A⊕B
0   0    0
0   1    1
1   0    1
1   1    0

简单来说:两个位相同时结果为0,不同时结果为1。

XOR运算的关键特性

XOR运算具有以下重要特性:

  1. 可逆性:如果 C = A ⊕ B,那么 A = C ⊕ B,B = C ⊕ A
  2. 自反性:A ⊕ A = 0
  3. 恒等性: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测试来检测密钥长度。基本原理是:

  1. 在重复密钥XOR加密中,如果明文中有重复的片段,且这些片段的间隔是密钥长度的倍数,那么对应的密文片段也会重复
  2. 通过寻找密文中重复的序列,计算它们之间的距离
  3. 这些距离的最大公约数很可能就是密钥长度

密钥恢复原理

一旦确定了密钥长度为24,xortool会对每个密钥位置进行频率分析:

  1. 将密文按密钥长度(24)分组,提取每个位置的所有字节
  2. 统计每个位置上各字节值的出现频率
  3. 假设明文中最常见的字节是0x00
  4. 密文中每个位置最常见的字节值即为该位置的密钥字节

攻击成功的三个关键因素

这个加密方案之所以能被成功破解,有三个关键因素:

1. 密钥重用

相同的24字节密钥被重复使用约1870次(44KB ÷ 24字节),这使得每个密钥位置都有足够多的样本进行统计分析。

2. 数据量充足

PNG图像文件包含大量数据,为频率统计提供了足够的样本。数据量越大,统计结果越准确。

3. 明文特征明显

PNG图像文件包含大量的0x00字节,使得频率分析假设非常准确。

第七步:安全性分析与防御建议

这个加密方案的安全缺陷

这个加密方案实际上是Vigenere密码的二进制版本,存在严重的安全问题:

  1. 密钥重用导致易受频率分析攻击
  2. 没有使用初始化向量(IV)或随机数
  3. 密文保留了明文的统计特征
  4. 密钥空间相对较小(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防止密钥重用。

总结

解题步骤回顾

本题的完整解题流程:

  1. 分析加密脚本,识别XOR加密算法
  2. 理解XOR运算的可逆性特性
  3. 识别密钥重用的致命弱点
  4. 使用xortool进行自动化攻击
  5. 验证解密结果的正确性
  6. 获取flag

核心知识点

通过这道题目,我们学习到了以下重要的密码学概念:

  1. XOR加密的特性:可逆性、自反性、恒等性
  2. 频率分析攻击:利用明文的统计特征破解密码
  3. Kasiski测试:检测重复密钥长度的经典方法
  4. 文件格式知识:PNG文件头的固定结构
  5. 密码学工具使用:xortool的实战应用

安全启示

这道题目给我们带来了重要的安全启示:

  1. 不要自己实现加密算法:密码学是高度专业的领域,应使用经过验证的标准算法
  2. 密钥不应重复使用:密钥重用会暴露统计特征
  3. 使用现代加密库:如AES-GCM等经过广泛验证的方案

结语

这道”beginners-luck”题目虽然难度不高,但很好地展示了经典密码学攻击的原理。

通过实际操作,我们不仅学会了如何破解XOR加密,更重要的是理解了为什么这种加密方式不安全。

密码学是信息安全的基石,但同时也是一个充满陷阱的领域。即使是看似简单的加密算法,如果实现不当,也会存在严重的安全隐患。

希望通过本文的详细分析,能够帮助读者深入理解XOR加密的弱点和频率分析攻击的原理,在今后的学习和工作中避免类似的安全问题。


Flag: BITSCTF{p_en_gee}


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:破镜安全 破镜安全《CTF密码学挑战beginners-luck:XOR加密的频率分析攻击实战》

企业级攻击面管理平台 网络安全文章

企业级攻击面管理平台

文章总结: 本文档介绍名为网络安全透视镜的企业级攻击面管理平台,集成子域名、端口、指纹及漏洞扫描功能。支持分布式节点部署、定时任务与多渠道通知,提供Docker
评论:0   参与:  0