跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

从蓝桥杯CTF选拔赛看新手入门:手把手教你用Python脚本破解图片隐写与RSA

从零到一: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 # 通常

相关文章