结式与RSA

Crypto中的结式

前几天做题遇见了,记录一下。

结式(resultant)

  • 概念: 在域中,多项式的结式是Sylvester Matrix的行列式。

  • 定义: 有两个多项式

$$ f(x)=\sum_{i=0}^ma_ix^i \\ g(x)=\sum_{j=0}^nb_jx^j $$

构造如下矩阵:

$$ S_{f,g}:= \begin{bmatrix} a_m & a_{m-1} & \cdots & a_1 & a_0 & & \\ \\ & \ddots & \ddots & & \ddots & \ddots\\ & & a_m & a_{m-1} & \dots & a_1 & a_0 & \\ b_n & b_{n-1} & \cdots & b_1 & b_0 & & \\ \\ & \ddots & \ddots & & \ddots & \ddots\\ & & b_n & b_{n-1} & \dots & b_1 & b_0 & \\ \end{bmatrix} $$

其中前$n$行是$f(x)$,后$m$行是$g(x)$

该矩阵称为Sylvester矩阵,它的行列式$res(f,g)$,称为$f,g$的结式

  • 应用:

    • 判断互素: 当且仅当$res(f,g)=0$时,两多项式存在公共根。

    • 消元: 假设有

$$ \begin{cases} F(x,y)=0 \\ G(x,y)=0 \end{cases} $$

将$y$视为常数,此时$f(x),g(x)$有公因子,因此令$res(f,g)=0$可以解出$y$,再代入原方程便可以解出$x$。代码示例:

1
2
3
4
5
6
7
#sage
R = PolynomialRing(ZZ, 'x, y')
f1 =#x,y的表达式1
f2 =#x,y的表达式2
h = f1.sylvester_matrix(f2, y).det()     #利用结式消掉y
roots = h.univariate_polynomial().roots()    #求出x
print(roots)

结合coppersmith方法

1
2
3
4
5
6
7
8
9
10
11
12
13
#sage
n =

R.<x,y> = PolynomialRing(Zmod(n))
f1 =#x,y的表达式1
f2 =#x,y的表达式2

h1 = f1.sylvester_matrix(f2, y).det() #利用结式消掉y
h2 = f2.sylvester_matrix(f1, x).det()
x_roots = h1.univariate_polynomial().monic().small_roots(X=2**128,beta=0.4,epsilon=0.01)#求出x
y_roots = h2.univariate_polynomial().monic().small_roots(X=2**128,beta=0.4,epsilon=0.01)
print(x_roots)
print(y_roots)

参考:结式、伴随矩阵、特征多项式和2023江苏省数据安全竞赛的hardrsa | Tover’s Blog


结式与RSA
http://ramoor.github.io/2025/04/02/结式与RSA/
作者
Ramoor
发布于
2025年4月2日
许可协议