简介:本文面向CTF参赛者与安全学习者,系统梳理密码学赛题中最常考的算法与解题路径。内容涵盖欧拉函数、模运算、扩展欧几里得、中国剩余定理、RSA常见攻击、离散对数与对称加密识别等核心知识点,并给出通用脚本示例、验证方法与排查思路,帮助读者建立可复用的解题框架,显著提升分析效率与正确率。
本教程的目标是帮助读者建立一套可复用的CTF密码学解题框架:面对一道密码学题目时,能够快速判断题目类型、定位涉及的数学结构、选择合适的算法工具,并写出可验证的解题脚本。
适合阅读的人群包括:刚接触CTF的开发者与安全爱好者、需要补齐密码学基础的运维与后端工程师、以及希望系统整理密码学知识体系的技术负责人。阅读本教程不需要深厚的数论背景,但需要具备基础编程能力(Python为宜)和高中水平的模运算概念。
本教程围绕”要做什么、为什么这么做、需要准备什么、具体怎么做、如何验证结果、遇到问题如何排查”六个问题展开,每个知识点都配有通用伪代码或示意性代码,便于直接迁移到实际解题中。
在开始之前,建议准备以下环境与知识:
需要强调的是,CTF密码学题目的核心往往不是”调用某个工具”,而是”识别数学结构并转化为可计算的问题”。因此本教程的重点放在算法原理与适用条件的判断上。
做什么:计算小于等于n且与n互素的正整数个数,记为φ(n)。它是RSA、模逆、阶的计算基础。
为什么这么做:欧拉函数描述了模n乘法群的规模,直接决定了模逆是否存在(gcd(a,n)=1时逆元存在)、RSA中私钥指数的计算方式,以及欧拉定理的适用范围。
怎么做:
示意性代码:
def phi_from_factors(n, factors):# factors 为 [(p1,e1),(p2,e2),...]result = nfor p, e in factors:result = result // p * (p - 1)return result
注意点:实际解题中往往已知n但不知道分解,此时需要先做素因子分解;若n极大无法分解,说明题目另有突破口(如已知高位、共享素因子等)。
做什么:利用 a^φ(n) ≡ 1 (mod n)(当gcd(a,n)=1)化简大指数幂,或求模逆 a^(−1) ≡ a^(φ(n)−1) (mod n)。
为什么这么做:CTF中常见”超大指数模n”的题目,直接计算不可行,需要通过欧拉定理或费马小定理降指数。模逆则是解一次同余方程 ax ≡ b (mod n) 的关键。
怎么做:
示意性代码:
def egcd(a, b):if b == 0: return (a, 1, 0)g, x1, y1 = egcd(b, a % b)return (g, y1, x1 - (a // b) * y1)def mod_inv(a, n):g, x, y = egcd(a, n)if g != 1: raise ValueError("逆元不存在")return x % n
注意点:降幂时若指数本身是模φ(n)后的结果,需注意”指数为0但原指数非0”的歧义,稳妥做法是保留 e mod φ(n) + φ(n) 的形式。
做什么:求解线性同余方程组,例如 x ≡ a1 (mod m1)、x ≡ a2 (mod m2)……这类问题在CTF中常以”多个模数下的密文”形式出现。
为什么这么做:当模数两两互素时,中国剩余定理保证解在模M(各模数乘积)下唯一存在,可将多个小模数问题合并为一个大模数问题,从而恢复明文。
怎么做:
示意性代码:
def crt(remainders, moduli):x, M = 0, 1for a, m in zip(remainders, moduli):g, inv, _ = egcd(M, m)if (a - x) % g != 0: raise ValueError("无解")t = ((a - x) // g * inv) % (m // g)x += M * tM *= m // gx %= Mreturn x, M
注意点:模数不互素时需先判断相容性((a1−a2)是否能被gcd(m1,m2)整除),否则方程组无解;这是常见易错点。
做什么:识别RSA题目的参数弱点并选择对应攻击方式。
为什么这么做:CTF中的RSA题极少是”正常加密让你暴力破解”,绝大多数是参数设置存在缺陷,识别缺陷比硬算更重要。
常见路径与判断方法:
实施步骤:
注意点:不要一上来就写解密脚本,先做参数分析;很多题目卡住是因为漏看了”多组数据”或”提示文件”。
做什么:处理形如 g^x ≡ h (mod p) 的离散对数问题,以及识别题目使用的是异或、AES类分组加密还是流加密。
为什么这么做:离散对数在CTF中常以”小范围p”或”光滑p−1”形式出现,可用 Pohlig-Hellman 或小步大步算法求解;对称加密题目则常因密钥复用、模式误用(如ECB)而可被分析。
怎么做:
注意点:识别加密模式往往比破解算法更关键;观察密文结构、长度、重复性是第一手线索。
解题脚本写完后,必须做结果验证,避免”跑出结果但不可读”:
本教程从欧拉函数出发,串联了模逆、扩展欧几里得、中国剩余定理、RSA常见攻击与离散对数、对称加密识别等CTF密码学核心内容。关键不在于记住某个公式,而在于建立”识别结构—选择算法—编写脚本—反向验证”的闭环流程。建议读者以本文的脚本骨架为起点,逐步补充自己的题型库,并在每次解题后复盘参数特征与判断依据,这样才能真正做到事半功倍。