引言
hello!欢迎回到咪猫魔法世界~ 🐾✨
前面啃完数论基础和CryptoHack入门题,这篇聚焦RSA核心——它是1977年由Ron Rivest、Adi Shamir和Leonard Adleman提出的非对称加密算法,本质是数论知识点(欧拉函数、模逆元、大质数判断)的拼接。另外我在这篇文章中还对 RSA安全基石、更多CTF攻击类型、实际应用场景和实战工具等进行了整合,让大家通过这一篇文章就能够大概了解多种 RSA 的“原理+实战+拓展”实际应用~
一、RSA加密算法基础
1.1 核心定义与安全基石
RSA是非对称加密算法的经典代表,加密和解密使用不同密钥,安全性完全建立在“大数分解难题”之上。
- 正向计算容易:两个大质数p、q相乘得到n,操作简单高效;
- 逆向推导极难:已知n,想分解出p和q,以当前经典计算能力需数百年甚至更久,这构成了RSA的安全防线。
1.2 RSA 的核心流程
1.2.1 密钥生成
- 选两个不相等大质数p、q(CTF中常见1024/2048位,实际推荐2048位以上);
- 算模数$n = p \times q$(公钥/私钥共用核心模数);
- 算欧拉函数$\phi(n) = (p-1)(q-1)$(若n为多素数乘积,$\phi(n)$为各素数减1的乘积);
- 选公钥e:满足$1 < e < \phi(n)$且$\gcd(e,\phi(n))=1$,常用65537(费马素数),避免用3/17等小指数;
- 算私钥d:d是e的模逆元,即$e \times d \equiv 1 \pmod{\phi(n)}$,可通过多种方法求解(如下文方法)。
✅ 最终:公钥$(e,n)$公开(用于加密/验签),私钥$(d,n)$保密(用于解密/签名)。
1.2.2 加密&解密
- 加密(公钥):$c = m^e \pmod{n}$(m为明文,需满足$m < n$,否则需分组或填充);
- 解密(私钥):$m = c^d \pmod{n}$;
- 原理支撑:欧拉定理($\gcd(m,n)=1$时,$m^{\phi(n)} \equiv 1 \pmod{n}$),因$e \times d = k \times \phi(n) + 1$,故$m^{e \times d} \equiv m \pmod{n}$。
1.2.3 核心特性与应用场景
- 非对称性:公钥加密只能私钥解密,私钥签名只能公钥验签,是应用核心;
- 典型用途:
- 密钥分发:HTTPS/SSL中,浏览器用服务器公钥加密临时会话密钥,后续用对称加密通信;
- 身份验证:SSH免密登录,本地私钥应答服务器公钥挑战;
- 数字签名:软件发布者用私钥签名哈希值,用户用公钥验签,确保软件未篡改。
1.2.4 模逆元的三种求解方法
除了扩展欧几里得算法,模逆元还有两种常用求法,适配不同场景:
- 扩展欧几里得算法(通用):适用于任意互素的a和mod,时间复杂度$O(\log n)$,是RSA求逆元的主流方法(代码见下文);
- 费马小定理/欧拉定理(模为素数时):若mod是素数,逆元$=\text{pow}(a, \text{mod}-2, \text{mod})$;若a与mod互素,逆元$=\text{pow}(a, \phi(\text{mod})-1, \text{mod})$;
- 递推法(批量求逆元):适用于mod为小素数且需多次调用,公式为$\text{inv}(i) = -(\text{mod}//i) \times \text{inv}(\text{mod}\%i) \pmod{\text{mod}}$。
3. 踩坑提醒⭐
- ❌ e与$\phi(n)$不互素:无逆元d,密钥生成失败;
- ❌ 明文$m \ge n$:加密丢失信息,解密无法恢复;
- ❌ 小指数e=3且无填充:易遭低指数攻击或广播攻击;
- ❌ 密钥长度过短:1024位已不安全,推荐2048位及以上;
- ❌ 多用户共用模数n:易遭共模攻击;
- ❌ 私钥d过短:易被Wiener攻击破解。
二、CTF中的RSA高频考点
2.1 基础解密(已知p/q/e/c)
核心是“套公式+求逆元”,支持三种逆元求解方式,代码如下:
|
|
2.2 大数分解(Pollard Rho算法+工具辅助)
当未知p/q时,用Pollard Rho算法分解n,搭配米勒-拉宾素性测试,同时可借助工具提升效率:
|
|
工具辅助:
2.3 低加密指数攻击(e=3)
当e=3且n较大无法分解时,通过爆破k使$c - k \times n$为完全立方数,代码如下:
|
|
2.4 小指数广播攻击(e=3+多组n,c)
同一明文m用e=3加密到多个不同n,截获≥3组(n,c)后,用中国剩余定理重构$m^3$,再开方得m:
|
|
2.5 共模攻击(多用户共用n)
多个用户用相同n、不同e(e1与e2互素)加密同一m,截获(c1,e1)和(c2,e2)即可恢复m:
|
|
2.6 Wiener攻击(私钥d过短)
当$d < n^{1/4}$时,用连分数逼近求解d,可直接调用owiener库:
|
|
2.7 公因数攻击(多组n共享因子)
当多组(n,c)共享同一素因子p时,用gcd求p,再分解n:
|
|
三、RSA拓展知识
3.1 RSA变体
- 多素数RSA:n是三个及以上素数的乘积,效率更高,适用于资源受限场景;
- 双模数RSA(DM-RSA):用两个独立模数n1、n2加密,需结合CRT解密,抗侧信道攻击能力更强;
- CRT-RSA:解密时用中国剩余定理优化,先算$m1=c^d \pmod{p}$、$m2=c^d \pmod{q}$,再合并m,速度更快。
3.2 安全威胁与防护
- 量子计算威胁:Shor算法可多项式时间分解大数,威胁RSA安全,未来需转向后量子密码学(NIST);
- 侧信道攻击:通过计时、功耗信息泄露密钥,可采用双模数RSA或随机化加密防护;
- 填充机制:未填充的RSA易遭攻击,推荐使用PKCS#1 v1.5或OAEP填充。
3.3 CTF真题案例参考
- BUUCTF (WUSTCTF2020) babyrsa:n较小,直接用yafu分解p/q后解密;
- NCTF2019 babyRSA:小指数广播攻击,截获3组(n,c)用CRT重构$m^3$;
- 鹏城杯2025 babyrsa:高精度浮点数泄露私钥参数,反向推算d;
- BJDCTF2020 rsa_output:共模攻击,多组(e,c)共用n求解m。
✨ 咪猫碎碎念
RSA的核心逻辑比较简单——“数论做基础,大数分解保安全”;CTF题本质是“找参数漏洞+套算法模板”。后面补充的攻击类型和拓展知识都是实战中高频遇到的场景,结合工具和真题练习,很快就能上手~
记住:RSA不算难,难的是遗漏参数漏洞和算法选型错误!
四、总结
- 核心公式:$m^{e \times d} \equiv m \pmod{n}$,密钥生成的关键是 $e$ 与 $\phi(n)$ 互素、求逆元;
- 分解工具:Pollard Rho算法(代码实现)、yafu(本地)、factordb(在线);
- 攻击思路:低指数(e=3)、共模(同n多e)、Wiener(d过短)、广播(多n同e同m)、公因数(多n共享p/q);
- 安全要点:密钥长度≥2048位、用65537作e、加填充、避免共用模数;
- 拓展方向:RSA变体、后量子密码防护、侧信道攻击应对。
