当前位置: 首页 > news >正文

Coppersmith 学习笔记

我咋到现在了才会这玩意

Coppersmith:求解 \(f(x) \equiv 0 \pmod p\),其中 \(p | N\) 是 N 的某个因子。

我们可以构造若干新的多项式,使得它的根与原多项式是相同的。例如,可以构造 \(f(x)^2, x f(x)\) 等,他们具有原多项式的根。

然后,我们通过这些多项式的线性组合,可以尝试得到一个系数较小的多项式 \(g(x)\)。这一步可以很容易地通过 LLL 实现。

那么,如果这个系数足够小,并且预期的解也足够小,小到使得 \(|g(x_0)| < p\),那么显然 \(g(x) = 0\) 的解就与 \(g(x) \equiv 0 \pmod p\) 相同了。这样,我们只需要解 \(g(x) = 0\) 就可以得到 \(g(x) \equiv 0 \pmod p\) 的解了,而这意味着我们可以在不知道 \(p\) 的情况下求解方程。

Coppersmith 算法中存在两个参数 \(\beta, \epsilon\),前者表示 \(p \ge N^\beta\),后者越小运行速度越慢,但越可能出解。

根据 Coppersmith 的理论,我们需要零点 \(x_0 \le N^{\frac{\beta^2}{\delta} - \epsilon}\),其中 \(\delta\) 是多项式的次数。可以通过下面的代码计算合适的 \(\epsilon\)

from math import log
N = ...
beta = ... # p >= N^beta
X = ... # 零点的上界
delta = 1
print(beta ** 2 / delta - log(X) / log(N))

例子:如果知道 RSA 中 \(p\) 的高位,我们可以将已知作为 \(p'\),未知部分设为 \(x_0\),则 \(p = p' + x_0\),令 \(f(x) = p' + x\),我们知道 \(f(x_0) \equiv 0 \pmod p\),于是就可以用上述算法求解了。

简单估计一下,\(p \approx N^{0.5}\),所以 \(\beta = 0.5\),则 \(X \le N^{\beta^2-\epsilon} \approx N^{0.25}\),所以需要未知位数小于 \(1/4\),或者说至少知道 \(p\) 的位数的一半以上。

from sage.all import *
from Crypto.Util.number import long_to_bytesn = ...
msb = ...
c = ...
e = 65537
shift = 245p_high = msb << shift
x, = PolynomialRing(Zmod(n), 'x').gens()
f = p_high + xbeta = 0.499
for epsilon in [0.009, 0.008, 0.007, 0.006, 0.005, 0.004, 0.003, 0.002, 0.001]:print(f"Trying beta={beta}, epsilon={epsilon}...")try:roots = f.small_roots(X=2**shift, beta=beta, epsilon=epsilon)except Exception as e:print(f"Error with epsilon={epsilon}: {e}")continue if roots:print(roots)x0 = roots[0]p = p_high + int(x0)if n % p == 0:print(f"Found p: {p}")q = n // pphi = (p - 1) * (q - 1)d = inverse_mod(e, phi)m = pow(c, d, n)print(f"Flag: {long_to_bytes(m)}")else:print("Root found but not a factor?")else:print("No roots found.")

还有很多其它的用途,比如 \(e\) 很小(\(e=3\))而 \(m\) 很小(未知部分很小),那么我们就是要解 \(f(x) = (m+x)^e - c \equiv 0 \pmod n\),同样可以 Coppersmith 做。

http://www.zskr.cn/news/81764.html

相关文章:

  • 【SQL技术】不同数据库引擎 SQL 优化方案剖析 - 详解
  • Python list all files in dir recursivelly
  • python —— 树的遍历 —— 深度优先遍历(先序、中序、后序)
  • 恰好被k个区间覆盖的点的数量
  • windriver 第5章:USB 概述
  • Airflow - from airflow import DAG and from airflow.sdk import DAG, which one is better?
  • 货代邮件自动化处理系统设计文档
  • DSU on array
  • 吐血整理!新房全包装修,性价比之王大盘点 - 品牌测评鉴赏家
  • Resources资源同步加载、异步加载、卸载
  • windriver 第6章:使用DriverWizard
  • MATLAB R2025a免费下载安装教程与激活教程超详细图文步骤(附安装包)
  • 新房装修公司大揭秘!一文教你避坑选好公司 - 品牌测评鉴赏家
  • 2025整装公司排行榜发布:十大整装品牌引领行业新趋势 - 速递信息
  • 头歌MySQL——单表查询 - 详解
  • 2025年整装公司口碑推荐实力TOP榜|十大装修公司对比 - 速递信息
  • Maven 用户的 Gradle 迁移与精通手册 - 指南
  • AI元人文构想:论当代论文与LLM
  • 引脚定义
  • 任意地址写format_string_level1题后感basectf
  • scheme区间算术
  • HashMap
  • CDQ 分治
  • day3 Java基础2
  • 2025年12月成都软件开发公司最新推荐,crm系统定制,管理系统,物联网,运维管理系统软件开发公司选择指南 - 品牌鉴赏师
  • PPT: Pre-trained Prompt Tuning - 预训练提示调优详解 - 教程
  • 某中心在EMNLP 2024的50余篇AI论文技术纵览
  • 常见八大排序算法介绍(冒泡排序、插入排序、归并排序、计数排序、选择排序、快速排序、堆排序、希尔排序)
  • 你的接口很好,但在使用者眼里,它可能只是个打不开的黑盒
  • 完整教程:Prefix-Tuning:大语言模型的高效微调新范式