从凯撒到RSA给CTF萌新的密码学入门实战指南第一次参加CTF比赛时面对那些看似天书般的密码学题目我完全摸不着头脑。直到后来系统性地梳理了密码学的发展脉络和解题思路才发现原来每个加密算法背后都有其独特的逻辑和破解方法。本文将带你从零开始构建一套完整的CTF密码学解题框架。1. 古典密码密码学的起源与基础古典密码是理解现代加密技术的基石。这些看似简单的加密方法却蕴含着密码学最核心的思想。1.1 凯撒密码与移位加密凯撒密码是最著名的替换密码之一其核心思想是将字母表中的每个字母按固定位数进行移位。例如当移位数为3时明文A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 密文D E F G H I J K L M N O P Q R S T U V W X Y Z A B C破解凯撒密码的Python实现def caesar_decrypt(ciphertext, shift): result for char in ciphertext: if char.isalpha(): ascii_offset ord(a) if char.islower() else ord(A) decrypted_char chr((ord(char) - ascii_offset - shift) % 26 ascii_offset) result decrypted_char else: result char return result # 示例解密khoor zruog print(caesar_decrypt(khoor zruog, 3)) # 输出: hello world常见变种与解题技巧尝试0-25所有可能的移位暴力破解通过频率分析确定最可能的移位值注意非字母字符通常保持不变1.2 替换密码与频率分析简单替换密码将每个明文字母映射到唯一的密文字母比凯撒密码更安全但仍有规律可循。英语字母的典型频率分布如下字母频率(%)字母频率(%)E12.70T9.06A8.17O7.51I6.97N6.75S6.33H6.09使用频率分析破解替换密码的步骤统计密文中各字母出现频率对照英语字母频率表进行初步匹配根据常见单词如the、and进一步验证逐步调整直到获得可读明文2. 现代对称加密从XOR到AES对称加密使用相同密钥进行加密和解密是现代密码学的重要组成部分。2.1 XOR加密原理与应用XOR异或是最基础的加密操作之一其特性包括可逆性A XOR B XOR B A比特级操作逐位进行运算简单高效计算速度快单字节XOR加密的Python实现def xor_decrypt(ciphertext, key): return .join(chr(ord(c) ^ key) for c in ciphertext) # 示例解密二进制密文1010011ASCII表示 binary_cipher 1010011 key 0b0101010 # 十进制42 plaintext chr(int(binary_cipher, 2) ^ key) print(plaintext) # 输出: 1 (ASCII 49)CTF常见题型已知明文部分内容推断密钥使用频率分析破解单字节XOR多字节XOR需要更复杂的破解技术2.2 块加密与AES实战AESAdvanced Encryption Standard是最常用的对称加密算法其特点包括固定128位块大小支持128、192、256位密钥长度多轮加密确保安全性使用PyCryptodome进行AES解密的示例from Crypto.Cipher import AES from Crypto.Util.Padding import unpad def aes_decrypt(ciphertext, key, iv): cipher AES.new(key, AES.MODE_CBC, iv) plaintext unpad(cipher.decrypt(ciphertext), AES.block_size) return plaintext.decode() # 示例数据实际CTF题目会提供具体参数 key bSixteen byte key iv bInitialization V ciphertext b\x9a\x82...\xd6 # 实际密文 print(aes_decrypt(ciphertext, key, iv))解题要点确认加密模式ECB、CBC等检查是否提供初始向量IV注意填充方式通常PKCS#73. 非对称加密RSA与椭圆曲线非对称加密使用公钥和私钥对解决了密钥分发问题。3.1 RSA算法原理与CTF应用RSA基于大数分解难题其加密过程为选择两个大素数p和q计算n p * q计算φ(n) (p-1)*(q-1)选择e使得1 e φ(n)且gcd(e, φ(n)) 1计算d ≡ e⁻¹ mod φ(n)RSA加密/解密公式加密c ≡ mᵉ mod n解密m ≡ cᵈ mod nCTF中常见的RSA题型解题脚本from Crypto.Util.number import inverse, long_to_bytes # 已知参数 n 55 e 3 c 4 # 分解n得到p5, q11 p, q 5, 11 phi (p-1)*(q-1) d inverse(e, phi) m pow(c, d, n) print(long_to_bytes(m)) # 输出: b\x04 (原始消息为4)进阶技巧Wiener攻击当d较小时共模攻击相同n不同e小指数攻击e3且明文很小3.2 椭圆曲线密码学入门椭圆曲线密码ECC在相同安全强度下使用更短的密钥其基本运算包括点加法P Q R标量乘法kP P P ... Pk次ECC参数通常包括曲线方程y² x³ ax b基点G阶n余因子h使用sage数学软件进行ECC计算的示例# 定义椭圆曲线 E EllipticCurve(GF(p), [a, b]) G E.gen(0) # 基点 n G.order() # 阶 # 标量乘法 k 12345 Q k * G4. 综合实战30道CTF密码学题目精解现在我们将各类密码学知识应用到实际CTF题目中建立系统的解题思路。4.1 编码与古典密码题目Base64变种识别技巧标准Base64字符集A-Z, a-z, 0-9, , /常见变种URL安全的Base64用-和_替换/识别特征末尾可能有1-2个号自动识别解码的Python代码import base64 def try_base64(data): try: return base64.b64decode(data).decode() except: try: return base64.urlsafe_b64decode(data).decode() except: return Not a valid Base64 print(try_base64(SGVsbG8gQ1RGIQ)) # 输出: Hello CTF!栅栏密码解题步骤确定轨道数通常尝试2-5按之字形排列密文按行读取得到明文例如解密TEITAOERHMNTSGDDY轨道数3T A H G Y E I T O R M T D D I E N S按行读取THEYARESENDINGDUCKS4.2 现代密码综合题目混合加密系统分析识别各部分加密方式按正确顺序解密注意可能的编码转换典型解题流程Base64 → AES解密 → XOR → 凯撒解密隐写术与密码结合使用工具如steghide、binwalk检查文件元数据exiftool分析最低有效位LSB# 使用binwalk分析文件 binwalk -e suspicious_image.jpg # 检查LSB隐写 stegolsb stegano -i image.png -s 100 -n 14.3 非对称密码挑战RSA多参数攻击场景已知n和e尝试分解nfactordb.com相同n不同e的共模攻击广播攻击相同明文用不同n加密共模攻击Python实现from math import gcd from Crypto.Util.number import inverse, long_to_bytes def common_modulus_attack(c1, c2, e1, e2, n): g, a, b extended_gcd(e1, e2) if g ! 1: return None if a 0: c1 inverse(c1, n) a -a if b 0: c2 inverse(c2, n) b -b m (pow(c1, a, n) * pow(c2, b, n)) % n return long_to_bytes(m)5. 工具链与资源推荐高效的密码学解题离不开合适的工具以下是我的实战工具箱。5.1 必备在线工具CyberChef全能密码学工具箱支持200多种操作可组合多种转换直观的图形界面经典组合配方From Hex → XOR Brute Force → Frequency analysis Base64 → Gunzip → File analysis其他实用网站dCode.fr密码识别器Boxentriq密码分析工具Cryptool教育用密码软件5.2 本地脚本开发高效的Python密码学库# 加密相关 from Crypto.Cipher import AES, DES, ChaCha20 from Crypto.PublicKey import RSA, ECC from Crypto.Protocol.KDF import scrypt # 实用功能 from Crypto.Util.number import bytes_to_long, long_to_bytes from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytes # 哈希函数 import hashlib hashlib.sha256(bdata).hexdigest()自动化解题框架结构class CTFSolver: def __init__(self, ciphertext): self.ciphertext ciphertext self.plaintext None def detect_encoding(self): # 自动检测Base64/Hex/Binary等 pass def try_common_ciphers(self): # 尝试常见加密方式 pass def frequency_analysis(self): # 字母频率统计 pass5.3 系统化学习路径推荐学习顺序古典密码凯撒、替换、转置编码系统Base64、Hex、ASCII对称加密XOR、AES、DES非对称加密RSA、ECC哈希函数MD5、SHA综合挑战实践建议从CTFtime.org找简单密码学题目参加picoCTF等新手友好比赛建立自己的解题代码库