从零到一:Python实战CTF图片隐写与RSA解密全攻略 初识CTF竞赛中的密码学挑战 第一次参加CTF比赛时,面对那些看似神秘的题目,我完全摸不着头脑。
直到亲手解出一道图片隐写题,才明白这种"寻宝游戏"的魅力所在。
CTF竞赛中的密码学题目往往将关键信息隐藏在看似普通的载体中,比如图片、音频或文本文件。
作为新手,掌握基础的Python脚本编写能力和密码学工具使用技巧,就能解开大部分入门级题目。
图片隐写术(Steganography)是CTF中的常客,它通过修改图片像素、频域系数或文件结构来隐藏信息。
常见的隐写方式包括: LSB隐写 :修改像素最低有效位 频域隐写 :利用DCT/DWT变换后的系数隐藏数据 文件结构隐写 :在PNG的IDAT块或JPEG的DQT表中嵌入信息 而RSA作为非对称加密的代表,在CTF中通常考察对算法原理的理解和漏洞利用能力。
新手需要掌握以下核心概念:
# RSA基本公式
n = p * q # 模数
φ(n) = (p-1)*(q-1) # 欧拉函数
e * d ≡ 1 mod φ(n) # 密钥关系
c = m^e mod n # 加密
m = c^d mod n # 解密
实战图片隐写:从二进制到Flag 让我们从一个真实的CTF题目入手,学习如何用Python提取隐藏在图片中的信息。
假设我们获得了一张看似普通的图片a.png,怀疑其中藏有flag。
第一步:基础分析 使用Python的Pillow库进行初步检查:
from PIL import Image
img = Image.open('a.png')
print(f"图片格式: {img.format}")
print(f"图片大小: {img.size}")
print(f"图片模式: {img.mode}")
# 检查文件末尾附加数据
with open('a.png', 'rb') as f:
data = f.read()
if b'flag' in data[-1000:]:
print("发现文件尾可能有隐藏数据")
第二步:频域分析 当简单的文件分析无果时,可能需要考虑频域隐写。
小波变换(DWT)是常用的方法:
import cv2
import numpy as np
import pywt
# 读取图像并转换为灰度
img = cv2.imread('a.png', cv2.IMREAD_GRAYSCALE)
# 三级小波分解
coeffs = pywt.wavedec2(img, 'db2', level=3)
cA3, (cH3, cV3, cD3), (cH2, cV2, cD2), (cH1, cV1, cD1) = coeffs
# 可视化各子带
cv2.imwrite('LL3.png', np.uint8(cA3))
cv2.imwrite('HH3.png', np.uint8(cH3))
提示:频域隐写常在高频子带(HH)隐藏信息,因为这些区域人眼不敏感 第三步:Arnold变换解密 有些题目会使用Arnold变换对隐藏信息进行置乱,需要逆向变换:
def dearnold(img, key):
r, c = img.shape
p = np.zeros((r, c), np.uint8)
a, b = 1, 1 # 通常
