1. 解题背景与题目概述
最近参加了一场网络安全竞赛,其中一道密码学题目"Try E"引起了我的兴趣。这道题考察的是RSA加密系统中公钥指数e过大时的安全问题,具体来说就是Wiener攻击的应用场景。题目给出了一个非常规的RSA加密实现,要求我们从给定的N、e、c中恢复出明文flag。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 题目代码分析
首先我们来看题目提供的Python代码:
python复制from Crypto.Util.number import getPrime, bytes_to_long
from secret import flag
def get_huge_RSA():
p = getPrime(1024)
q = getPrime(1024)
N = p * q
phi = (p - 1) * (q - 1)
while True:
d = getPrime(256)
e = pow(d, -1, phi)
if e.bit_length() == N.bit_length():
break
return N,e
if __name__ == '__main__':
N, e = get_huge_RSA()
m = bytes_to_long(flag)
c = pow(m, e, N)
print(f'N = {hex(N)}')
print(f'e = {hex(e)}')
print(f'c = {hex(c)}')
这段代码有几个关键特点:
- 生成两个1024位的素数p和q,计算N=p*q
- 生成一个256位的素数d作为私钥
- 计算e作为d关于φ(N)的模逆
- 特别要求e的位长度必须与N相同(即e很大)
- 最后用公钥(N,e)加密flag
3. 密码学原理分析
3.1 RSA基础知识回顾
在标准RSA中:
- 公钥:(N, e)
- 私钥:d
- 加密:c ≡ m^e mod N
- 解密:m ≡ c^d mod N
其中e和d满足:e*d ≡ 1 mod φ(N)
3.2 题目特殊之处
这道题的特殊性
