NSSCTF_crypto_[SWPU 2020]happy

1. 题目分析

本题是一个RSA加密的破解题目,给出了以下已知信息:

  • 密文 c(十六进制)

  • 公钥指数 e(十六进制)

  • 两个提示值 hint1 和 hint2,它们与RSA的私钥参数 p 和 q 相关

2. 信息整理

首先将给定的数值转换为十进制以便后续计算:

复制代码
c = 0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9e
e = 0x872a335
hint1 = 1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586
hint2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594

根据题目注释,两个提示值与RSA的素数 p 和 q 有以下关系:

  • hint1 = q + q * p^3

  • hint2 = q * p + q * p^2

3. 数学推导

3.1 提取公因子

从两个提示的表达式中提取公因子:

复制代码
hint1 = q(1 + p^3)
hint2 = qp(1 + p)

3.2 寻找p和q

我们可以通过求两个提示的最大公约数来提取部分信息:

复制代码
t = gmpy2.gcd(hint1, hint2)

由于:

  • hint1 = q(1 + p^3) = q(1 + p)(1 - p + p^2)

  • hint2 = qp(1 + p)

因此:

复制代码
t = gcd(q(1 + p)(1 - p + p^2), qp(1 + p))
  = q(1 + p) * gcd(1 - p + p^2, p)

但更简单的方法是,我们可以从 hint2 = qp(1 + p) 直接得到:

复制代码
q = hint2 // (p(1 + p))

实际上,代码中的做法是先计算:

复制代码
q = hint2 // t

然后从 t = q(1 + p) 得到:

复制代码
p = t // q - 1

但在给出的代码中,写法是:

python 复制代码
p = t // (q + 1)

这是因为:

python 复制代码
t = q(1 + p) = q + qp
所以 t // (q + 1) = (q + qp) // (q + 1) = p
当(q+1)整除t时成立

完整代码

python 复制代码
from Crypto.Util.number import *
import gmpy2

# 已知信息
c = 0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9e  # 密文
e = 0x872a335  # 公钥指数
# 两个与p、q相关的提示值
hint1 = 1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586
hint2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594

# 第一步:计算两个提示值的最大公约数
# hint1 = q + q*p^3 = q(1 + p^3) = q(1 + p)(1 - p + p^2)
# hint2 = qp + q*p^2 = qp(1 + p)
# 两者的最大公约数包含q(1+p)因子
t = gmpy2.gcd(hint1, hint2)
print("t =", t)

# 第二步:从hint2推导q
# hint2 = qp(1 + p) = t * p
# 所以 q = hint2 // t
q = hint2 // t 
print("q =", q)

# 第三步:从t推导p
# t = q(1 + p) = q + qp
# 所以 p = t // (q + 1)
p = t // (q + 1)
print("p =", p)

# 第四步:计算RSA模数n
n = p * q
print("n =", n)

# 第五步:计算欧拉函数φ(n)
phi = (p - 1) * (q - 1)

# 第六步:计算私钥指数d
d = inverse(e, phi)

# 第七步:解密密文
m = long_to_bytes(pow(c, d, n))

# 第八步:输出明文
print("flag =", m)

4. 总结

本题的关键在于通过两个提示值的数学关系推导出RSA的私钥参数p和q:

  1. 利用 hint1 = q + qp^3 和 hint2 = qp + qp^2 的关系

  2. 通过求最大公约数提取公因子

  3. 通过简单的代数运算分离出p和q

  4. 使用标准的RSA解密流程恢复明文

相关推荐
一隅论数智3 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
上海广测检测科技有限公司3 天前
智能平板出口巴西合规详解:Anatel射频、Inmetro电源/电池与LGPD数据合规叠加
经验分享
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习