目录概览
本教程共分十一章及附录。第一章介绍密码学基础与CTF概述,建立必备基础;第二章 讲解编码与基础变换;第三章 系统梳理古典密码学;第四章 深入现代对称加密及其攻击方法;第五章全面解析RSA非对称加密及各类攻击;第六章 介绍椭圆曲线等其他非对称加密;第七章 讨论哈希函数与攻击;第八章 涵盖数字签名攻击;第九章 讲解伪随机数生成器攻击;第十章 总结常见陷阱与实用技巧;第十一章提供五道从入门到高级的综合实战演练。附录收录推荐学习资源、数学公式速查表及Python环境搭建指南。
第一章:密码学基础与CTF概述
1.1 什么是CTF密码学
CTF(Capture The Flag)是网络安全领域最重要的竞赛形式之一。在CTF竞赛中,Crypto (密码学) 是核心题型之一,与Pwn、Reverse、Web、Misc并列为五大主要方向。
Crypto 题型的定位与重要性: 密码学题目考察选手对加密算法原理的理解、数学基础的扎实程度以及编程实现攻击的能力。密码学题目通常有明确的数学基础,解题过程严谨,是最能体现"硬实力"的方向之一。
Crypto 题目的一般形式:
- 给定密文(ciphertext)和部分参数,要求恢复明文(plaintext),明文中包含flag
- 给定加密脚本(通常是Python),分析其中的漏洞并编写解密脚本
- 与远程服务交互(nc连接),通过多次查询获取信息并破解
题目常见来源:
- 古典密码: 凯撒密码、维吉尼亚密码、栅栏密码等的变种
- 现代加密算法的误用: RSA参数选取不当、AES工作模式错误、随机数生成器可预测等
- 数学漏洞: 利用数论、代数结构中的特殊性质进行攻击
1.2 密码学核心概念
基本术语:
- 明文( Plaintext ): 需要被保护的原始信息
- 密文( Ciphertext ): 经过加密后的信息
- 密钥( Key ): 控制加密和解密过程的参数
- 加密算法( Encryption Algorithm ): 将明文转换为密文的算法
- 解密算法( Decryption Algorithm ): 将密文恢复为明文的算法
Kerckhoffs 原则: 一个密码系统的安全性不应依赖于算法的保密,而应仅依赖于密钥的保密。即使攻击者完全知道加密算法的细节,只要不知道密钥,就不应该能破解密文。这是现代密码学设计的基本原则。
三大密码学原语的区别:
| 特征 | 对称加密 | 非对称加密 | 哈希函数 |
|---|---|---|---|
| 密钥 | 加密解密使用同一密钥 | 公钥加密,私钥解密 | 无密钥 |
| 可逆性 | 可逆(需要密钥) | 可逆(需要私钥) | 不可逆(单向函数) |
| 速度 | 快 | 慢 | 快 |
| 典型算法 | AES, DES, ChaCha20 | RSA, ECC, ElGamal | SHA-256, MD5 |
| 用途 | 数据加密 | 密钥交换、数字签名 | 完整性校验、密码存储 |
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ⚠ 重要辨析 编码( Encoding ) ≠ 加密( Encryption ) ≠ 哈希( Hashing ) • 编码 是数据的表示方式转换(如Base64),无安全性可言,任何人都可以解码 • 加密 是使用密钥将数据变为不可读形式,只有持有密钥者才能解密 • 哈希 是将任意长度的数据映射为固定长度的摘要,不可逆 |
1.3 CTF解题工具箱
| 工具名称 | 用途 | 说明 |
|---|---|---|
| Python 3 + pycryptodome | 编写攻击脚本、实现加解密 | CTF密码学解题的核心工具,几乎所有题目都需要 |
| SageMath | 数论与代数计算 | 强大的数学计算系统,处理大整数、多项式、椭圆曲线等 |
| CyberChef | 在线编解码/加解密 | 被称为"瑞士军刀",支持各种编码转换和简单加解密 |
| dcode.fr | 古典密码识别与解密 | 自动识别密码类型并提供解密,古典密码题首选 |
| RsaCtfTool | RSA自动化攻击 | 集成多种RSA攻击方法,可自动尝试多种攻击路径 |
| hashcat / John the Ripper | 哈希破解 | 支持GPU加速的密码/哈希暴力破解工具 |
| factordb.com | 大整数分解查询 | 在线数据库,可查询已知的大整数分解结果 |
1.4 环境搭建与库的使用
这一部分是读者动手实操的第一步,如果缺失,读者在第二章看到代码时会无从下手。
- Python 环境配置:
- 推荐版本: Python 3.8+(强调不要使用Python 2,因为字符串处理差异巨大)。
- 虚拟环境: 建议使用
venv或conda隔离依赖,避免环境污染。
- 核心库安装与速查:
你需要详细列出pycryptodome和gmpy2的安装命令,并给出最常用的函数速查表,因为CTF选手需要频繁查阅这些API。
| 库名称 | 安装命令 | 核心用途 | 常用函数示例 |
|---|---|---|---|
| pycryptodome | pip install pycryptodome |
对称/非对称加密实现 | AES.new(), PKCS1_v1_5.new(), long_to_bytes() |
| gmpy2 | pip install gmpy2 |
高性能大数运算 | gcd(), invert(), is_prime() |
| libnum | pip install libnum |
CTF专用数学工具 | s2n() (字符串转数字), n2s() (数字转字符串) |
| requests | pip install requests |
网络交互 | requests.get(), requests.post() |
- 代码风格提示: 提醒读者注意字节(bytes)与字符串(string)的转换,这是新手最容易踩的坑(例如:
b'flag'vs'flag')。
1.5 CTF密码学解题通用流程
在介绍完"是什么"之后,需要教读者"怎么做"。提供一个标准化的解题思维框架,能极大降低读者的畏难情绪。
Step 1: 信息收集(Read the Source)
- 给定脚本: 仔细阅读加密代码,寻找逻辑漏洞(如密钥重用、IV固定、随机数种子可预测)。
- 给定文件: 检查文件头(Magic Number),识别文件类型(如PKCS#1格式的RSA密钥)。
- 网络交互: 确定交互协议(Socket、HTTP),分析发送和接收的数据格式。
Step 2: 算法识别
- 参数分析: 如果是RSA,检查 NN 的大小、 ee 的取值(是否为3或65537)。
- 密文特征: 密文的长度、是否包含特定字符(如Base64编码后的
=号)。
Step 3: 漏洞利用(Attack)
- 查表法: 利用
factordb.com查询 NN 是否已被分解(正如你工具表中提到的)。 - 工具法: 尝试使用
RsaCtfTool自动化攻击。 - 手搓法: 当自动化工具失效时,根据数学原理编写针对性脚本。
Step 4: 结果处理
- 将得到的数字转换回字符串(注意字节序和填充方式)。
1.6 典型题目实战:Hello, Crypto!
为了不让第一章全是文字,建议增加一个简单的"Hello World"级别的实战演示。这能让读者立刻获得成就感。
题目背景:
服务器端运行了一个简单的脚本,将 flag 进行了异或(XOR)加密,你需要连接服务器获取密文并解密。
解题演示:
-
连接服务器: 使用
nc命令或 Python 的pwntools库连接。 -
获取密文: 服务器返回一串十六进制字符串。
-
分析: 题目提示密钥是单字节(Single-byte XOR)。
-
攻击脚本编写:
from pwn import xor import binascii # 假设获取到的密文 ciphertext_hex = "1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736" ciphertext = binascii.unhexlify(ciphertext_hex) # 暴力破解单字节密钥 for key in range(256): plaintext = xor(ciphertext, key) try: # 尝试解码为ASCII,如果包含可打印字符则打印 decoded = plaintext.decode('ascii') if decoded.isprintable(): print(f"Key: {key}, Plaintext: {decoded}") except: pass预期结果: 当密钥为
88时,输出Cooking MC's like a pound of bacon(这是CryptoPals挑战中的经典句子)。
1.7 进阶数学基础预览
CTF密码学的核心是数学。在第一章末尾,可以列出后续章节会用到的数学概念,让读者心里有底,如果发现自己基础薄弱,可以提前去补课。
- 数论基础: 模运算、最大公约数(GCD)、扩展欧几里得算法(ExGCD)、费马小定理、欧拉函数。
- 代数基础: 群、环、域的概念(特别是有限域 GF(p)GF(p) )。
- 概率论基础: 随机数的统计特性(用于分析PRNG)。
一句话总结: 数学是密码学的基石,但请放心,本教程会尽量用直观的代码和例子来解释这些数学概念,而非枯燥的公式推导。