格初步(五)

Coppersmith 定理
我们证明 \(\mathrm{Coppersmith}\) 定理的“完整版本” [Cop96b],其表述如下。
定理 1
设 ( N ) 为给定正整数,( f(x) \in \mathbb{Z}[x] ) 为给定的首一的次数为 ( d ) 的多项式。存在一个算法在多项式时间内找到所有满足 ( f(x_0) \equiv 0 \mod N ) 且 ( |x_0| \leq B \approx N^{1/d} ) 的整数 ( x_0 )。
在定理的表述及后续内容中,为了简化,我们使用 ( \approx ) 来隐去关于 ( d ) 的多项式因子以及 ( N^\epsilon )(其中 ( \epsilon > 0 ) 可以取得任意小的常数)。
这实际上给出了 ( B = N^{1/d - \epsilon} ) 的界,尽管通过更复杂的推导,可以证明定理对于 ( B = N^{1/d} ) 仍然成立。
本节的其余部分将致力于证明该定理。
在上一次讨论中,我们考虑了向 ( f(x) ) 添加 ( N \cdot x^i ) 的倍数,这不会改变 ( f(x) ) 在模 ( N ) 下的根。然而,这样的方法仅能得到 ( B \approx N{2/d2} ) 的界。为了取得更好的结果,我们考虑模 ( N ) 的更高次幂(模 \(2\) 相同的数模 \(4\) 不一定相同,模 \(4\) 给出比模 \(2\) 更精细的信息)。具体而言,我们的策略是利用 \(\mathrm{LLL}\) 算法高效地找到一个非零多项式 ( h(x) = \sum_i h_i x^i \in \mathbb{Z}[x] ),其次数至多为 ( n = d(m+1) ),其中 ( m ) 是待定的正整数,使得:
\(1\). ( f ) 在模 ( N ) 下的任何根在模 ( N^m ) 下也是 ( h ) 的根,即如果 ( f(x_0) \equiv 0 \mod N ),那么 ( h(x_0) \equiv 0 \mod N^m );
\(2\). 多项式 ( h(Bx) ) 是“短的”,即其系数满足 ( |h_i B^i| < N^m / (n+1) )。
由第二个性质可知,如果 ( |x_0| \leq B ),那么
[
\left|h\left(x_0\right)\right| \leq \sum_{i=0}^n |h_i B^i| < N^m
]
因此,再根据第一个性质,( f(x) ) 在模 ( N ) 下的任何小根 ( x_0 ) 也是 ( h(x) ) 在整数环上的根(而不仅仅是模 ( N^m ) 的根)。因此,找到 ( h(x) ) 后,我们可以高效地在整数环上分解它,并检查其小根是否确实是 ( f(x) ) 在模 ( N ) 下的根。
第一个重要的观察是,若 ( f(x_0) \equiv 0 \mod N ),则对于任意正整数 ( k ),均有 ( f(x_0)^k \equiv 0 \mod N^k )。因此,我们可以定义 ( n = d(m+1) ) 个多项式 ( g_{u,v}(x) ),使其在模 ( N^m ) 下的根包含 ( f(x) ) 在模 ( N ) 下的所有根,其定义如下:
[
g_{u, v}(x) = N^{m-v} \cdot x^u \cdot f(x)^v, \quad \text{其中 } u \in{0, \ldots, d-1}, \quad v \in{0, \ldots, m} .
]
我们利用关于这些多项式的两个重要事实:
- 首先,( g_{u, v}(x) ) 的首项系数为 ( N^{m-v} ),并且其次数恰为 ( u + v d ),因为 ( f(x) ) 是首一的且次数为 ( d )。
- 其次,如果 ( x_0 ) 是 ( f(x) ) 在模 ( N ) 意义下的根,那么 ( x_0 ) 也是所有 ( g_{u, v}(x) ) 在模 ( N^m ) 意义下的根,因为 ( N^m ) 整除 ( N^{m-v} f(x_0)^v )。
我们的格基由 ( g_{u, v}(B x) ) 的系数向量组成,其中 ( B ) 是我们要寻找的根的最大幅度界。换句话说,格基为
[
\mathbf{B} = \left[\mathbf{b}0, \ldots, \mathbf{b}\right]
]
其中 ( \mathbf{b}{u+v d} ) 是 ( g(B x) ) 作为 ( x ) 的多项式的系数向量。由于 ( g_{u, v}(x) ) 的次数为 ( u + v d ),其首项系数为 ( N^{m-v} ),且当 ( u, v ) 在各自的范围内遍历时,( u+v d ) 覆盖了集合 ( {0, \ldots, n-1} ),因此格基是上三角的(先遍历 \(u\),再遍历 \(v\)),对角线元素为 ( N^{m-v} B^{u+v d} )。通过直接计算可以得到
[
\operatorname{det}(\mathbf{B}) = B^{n(n-1) / 2} \cdot N^{d m(m+1) / 2}
]
运行 \(\mathrm{LLL}\) 算法于 ( \mathbf{B} ) 上,可以得到一个非零向量 ( \mathbf{v} \in \mathcal{L}(\mathbf{B}) ),其长度满足
[
\begin{aligned}
|\mathbf{v}| &\leq 2^{(n-1) / 2} \operatorname{det}(\mathbf{B})^{1 / n} \
&= 2^{(n-1) / 2}\left(B^{n(n-1) / 2} \cdot N^{d m(m+1) / 2}\right)^{1 / n} \
&\leq (2 B)^{n / 2} \cdot N^{m / 2}
\end{aligned}
]
设 ( B \approx \left(N^{1 / d}\right)^{m /(m+1)} ),对于足够大的 ( m ),这相当于 ( N^{1 / d-\epsilon} )。这样我们可以确保 ( (2 B)^{n / 2} < N^{m / 2} /(n+1) ),从而得到 ( |\mathbf{v}| < N^m /(n+1) ),满足我们的要求。将 ( \mathbf{v} ) 的各个分量读作 ( h(Bx) ) 的系数,即可得到一个合适的多项式 ( h(x) )。
注意,我们引入了一个额外的参数 \(m\),并且这个参数的大小也会影响计算的复杂度,所以要求 \(m\) 充分大但仍然是多项式有界的。
RSA 变种的密码分析
\(\mathrm{Coppersmith}\) 算法最有趣的应用之一是攻击 \(\mathrm{RSA}\) 的变种。
RSA 复习
\(\mathrm{RSA}\) 函数和加密系统 [RSA78](以其发明者 Rivest、Shamir 和 Adleman 命名)是实践中最广泛使用的公钥加密和数字签名方案之一。
需要区分 \(\mathrm{RSA}\) 函数和基于 \(\mathrm{RSA}\) 的密码系统。\(\mathrm{RSA}\) 函数的定义如下:设 ( N = pq ),其中 ( p ) 和 ( q ) 是两个不同的非常大的素数(按照当前的安全建议,它们应至少为 \(1000\) 位)。设 ( e ) 为公用的“加密指数”,满足 ( \gcd(e, \varphi(N)) = 1 ),其中 ( \varphi(N) = |\mathbb{Z}N^*| = (p-1)(q-1) ) 是欧拉函数。\(\mathrm{RSA}\) 函数 ( f: \mathbb{Z}_N^* \to \mathbb{Z}_N^* ) 由公用参数 ( (N, e) ) 定义如下:
[
f_{e,N}(x) := x^e \bmod N
]
人们普遍认为,仅给定 ( N, e ) 以及 ( y = f_{e,N}(x) )(其中 ( x ) 为均匀随机选取的 ( \mathbb{Z}_N^* ) 元素),在计算上难以找到 ( x )。然而,若掌握一些额外的“陷门”信息,则可以高效地计算 \(\mathrm{RSA}\) 函数的逆:设 ( d ) 为“解密指数”,满足 ( e \cdot d \equiv 1 \pmod{\varphi(N)} ),该指数在已知 ( N ) 的素因子分解时可高效计算。那么 \(\mathrm{RSA}\) 函数的逆为
[
f_{e,N}^{-1}(y) := y^d \bmod N
]
这的确是其逆函数,因为对于 ( y = f_{e,N}(x) = x^e \bmod N ),我们有
[
y^d = \left(xe\right)d = x^{e \cdot d \bmod \varphi(N)} = x \bmod N,
]
其中最后一个等式成立的原因是群 ( \mathbb{Z}N^* ) 的阶为 ( \varphi(N) ),且根据欧拉定理,( x^{\varphi(N)} \equiv 1 \pmod{N} )。因此,( f ) 在 ( \mathbb{Z}_N^* ) 上是一个双射(也称为置换)。
低指数攻击
由于对大整数取模的指数运算在计算上相对昂贵,许多早期方案主张在 \(\mathrm{RSA}\) 中使用尽可能小的加密指数,例如 ( e = 3 ),以获得显著的效率提升。
注意,不能使用 ( e = 2 )(或任何其他偶数 ( e )),因为它永远不会与偶数 ( \varphi(N) ) 互素。
例如,若采用形如 ( e = 2^k + 1 ) 的加密指数,则可以通过标准的“重复平方”方法仅使用 ( k+1 ) 次模乘运算来计算 ( x^e )。此外,即使对于小 ( e ),基本的 \(\mathrm{RSA}\) 函数在均匀随机的 ( y \in \mathbb{Z}_N^* ) 上仍然看起来难以逆向求解。
与其他任何确定性公钥加密方案一样,\(\mathrm{RSA}\) 函数本身并不是一个安全的密码系统。这是因为,如果攻击者对某个密文 ( c ) 中的消息有猜测(例如可能的消息数量很少),它可以通过对该消息进行加密并检查生成的密文是否与 ( c ) 匹配来轻松验证猜测是否正确(选择性明文攻击)(这种情况下要想防范攻击,可以采用流密码加密的思想或者随机化,不过相应的解密成本也会提高)。因此,必须使用随机化加密算法。最明显的随机化 \(\mathrm{RSA}\) 函数的方法是,在加密之前向消息的末尾附加一些随机的“填充”位。然而,设计一个安全的填充方案是相当困难且微妙的,因为存在使用 \(\mathrm{LLL}\) 等工具的巧妙攻击。
这里我们描述其中的一种攻击:当 ( e ) 很小且填充长度不足时,该攻击能够仅凭两个不同填充下的加密消息高效恢复原始消息 ( M )。
在实际应用中,同一条消息被多次加密的情况相当常见,例如常见的协议头部或重传机制(网络通信中因丢包或错误触发的数据包重新发送过程)。
我们首先介绍 [CFPR96] 提出的一个简单的“相关消息攻击”(related-message attack)(一种唯密文攻击但是要求知道或猜测出待解密明文间的线性关系),它本身就很有趣,同时也是填充攻击的关键组成部分。需要注意的是,该攻击针对的是确定性 \(\mathrm{RSA}\) 函数。
引理 2
令 ( e = 3 ),设 ( M_1, M_2 \in \mathbb{Z}_N^* ) 满足 ( M_1 \equiv \ell(M_2) \bmod N ),其中 ( \ell(M) = a M + b ) 为某个已知的线性函数(因为我们要对 \(g_1,g_2\) 实施欧几里得算法,所以必须知道 \(a,b\)),且 ( a, b \neq 0 )。则可以从 ( C_1 = M_1^e \bmod N ) 和 ( C_2 = M_2^e \bmod N )(以及其他公开信息 ( N, e, a, b ))高效恢复 ( M_1, M_2 )。
事实证明,该定理在 ( e > 3 ) 时“通常”仍然成立,但确实存在极少数例外情况。
证明: 定义多项式
[
g_1(x) = \ell(x)^e - C_1, \quad g_2(x) = x^e - C_2 \in \mathbb{Z}_N[x]
]
注意到 ( M_2 ) 是 ( g_1 ) 和 ( g_2 ) 的公共根,因此 ( (x - M_2) ) 是它们的一个公因子(这里要求 ( a \neq 0 ))。如果它实际上是最大公因子(即次数最高的公因子),则可以使用欧几里得算法求得。 接下来我们证明 ( (x - M_2) ) 确实是最大公因子。
严格来说,欧几里得算法通常要求 ( \mathbb{Z}_N ) 是一个域,而它实际上并不是域。然而,如果在此情况下欧几里得算法失败,那么它会作为副作用暴露出 ( N ) 的因子分解,从而使我们能够计算解密指数并恢复消息。
在环 \(\mathbb{Z}_N[x]\) 上执行欧几里得算法时,若遇到需对某个不可逆的系数进行除法操作,则此系数与 \(N\) 的最大公约数 \(d>1\) 即为 \(N\) 的非平凡因子。
首先观察,对于任意 ( C \in \mathbb{Z}_N^* ),多项式 ( x^3 - C ) 在模 ( N ) 意义下仅有一个根,因为 \(\mathrm{RSA}\) 函数是双射。因此,我们可以写出
[
g_2(x) = x^3 - C_2 = (x - M_2)(x^2 + \beta_1 x + \beta_0),
]
也有可能是三重根,但此时容易推理出 \(M_2 \equiv 0 \bmod N\),这与 \(M_2\in Z_N^*\) 矛盾。
其中二次项不可约,因此 ( \gcd(g_1, g_2) ) 只能是 ( (x - M_2) ) 或 ( g_2 ) 本身。显然我们有 ( g_2(x) \nmid g_1(x) ),因此最大公因子确实是 ( x - M_2 )。\(\square\)
假设 \(g_2(x) \mid g_1(x)\) ,则 \(g_1(x)\) 需为 \(g_2(x)\) 的常数倍。展开 \(g_1(x)=(a x+b)^3-C_1\) 和 \(g_2(x)=x^3-C_2\) ,比较系数可得:三次项系数:\(a^3=k \cdot 1\) ,即 \(a^3 \equiv k \bmod N\) ;二次项系数: \(3 a^2 b=0 \bmod N\) ;一次项系数: \(3 a b^2=0 \bmod N\) ;常数项:\(b^3-C_1 \equiv-k C_2 \bmod N\) 。由于 \(a, b \neq 0\) ,条件 \(3 a^2 b \equiv 0\) 和 \(3 a b^2 \equiv 0\) 要求 \(N\) 整除 \(3 a^2 b\) 与 \(3 a b^2\) 。又 \(N\) 为标准 \(\mathrm{RSA}\) 模数(两素数乘积且不含小因子),矛盾。
现在我们考虑一种可能的填充方法:对消息 ( M ) 进行加密时,附加 ( m ) 个均匀随机比特 ( r \in{0,1}^m )(其中 ( m ) 是一个公开已知的值),然后应用 \(\mathrm{RSA}\) 函数:
[
C = f_{N, e}(M | r)
]
(解密时忽略填充比特。)数学上,这相当于将 ( M ) 转换为 ( 2^m \cdot M + r ),其中 ( r ) 是均匀随机选取的 ( r \in {0, \dots, 2^m - 1} )。需要注意的是,( M ) 必须足够短,且 ( m ) 必须足够小,以确保结果可以作为 ( \mathbb{Z}_N^* ) 的一个元素,并且能够明确地表示 ( M )。
[Coppersmith 1997] 的下述定理表明,如果填充长度过短(由 ( e ) 的大小决定),那么可以高效地从两个不同的加密结果中恢复消息 ( M )。注意,对于 ( e=3 ) 而言,填充长度 ( n / 9 \approx 2,000 / 9 \approx 222 ) 已足够大,以至于几乎不会出现重复的填充值,但它仍然基本无法提供安全性。
定理 3
设 ( N ) 的比特长度为 ( n ),令 ( e = 3 ),填充长度(以比特计)满足 ( m \leq \lfloor n / e^2 \rfloor )。若给定同一消息 ( M ) 的两个不同加密结果 ( C_1, C_2 ),其中填充值 ( r_1, r_2 ) 是任意不同的 ( r_1, r_2 \in {0, \dots, 2^m -1} ),则可以高效地恢复 ( M )。
证明: 设 ( M_1 = 2^m \cdot M + r_1 ) 和 ( M_2 = 2^m \cdot M + r_2 ),其中 ( r_1, r_2 ) 是两个不同的随机填充值,满足 ( r_1, r_2 \in {0, \dots, 2^m-1} )。我们定义两个二元多项式 ( g_1(x, y), g_2(x, y) \in \mathbb{Z}_N[x] ) 如下:
[
\begin{aligned}
& g_1(x, y) = x^e - C_1 = x^e - M_1^e, \
& g_2(x, y) = (x+y)^e - C_2 = (x+y)^e - M_2^e.
\end{aligned}
]
在这里,( x ) 表示未知的消息,而 ( y ) 表示未知的填充。由于 ( g_1 ) 与 ( y ) 无关,我们知道 ( (x = M_1, y = \star) ) 是 ( g_1 ) 的一个根,对任意的 ( y ) 都成立。同样地,( (x = M_1, y = r_2 - r_1) ) 是 ( g_2 ) 的一个根。
接下来,我们引入多项式的结式的概念。给定关于变量 ( x ) 的两个多项式,其结式定义为它们所有根的差的乘积:
更多结式的性质参见附录,注意到 \(g_1,g_2\) 都是关于 \(x\) 首一的,所以这里的结式定义和标准定义是吻合的。
[
\operatorname{res}x(p(x), q(x)) = \prod (x_0 - x_1).
]
此处我们将二元多项式 ( g_i(x, y) ) 视为关于 ( x ) 的多项式,其系数是关于 ( y ) 的多项式(即属于 ( \mathbb{Z}_N[y] ))。因此,( \operatorname{res}_x(g_1, g_2) ) 是关于 ( y ) 的一个多项式。
我们使用结式的一些重要性质:
首先,当 ( p, q ) 具有公共根时,显然 ( \operatorname{res}_x(p(x), q(x)) = 0 )。
其次,( \operatorname{res}_x(p, q) ) 可以通过行列式计算,即:
[
\operatorname{res}x(p, q) = \det(\mathbf{S}),
]
其中 ( \mathbf{S}_{p, q} ) 是一个维度为 ( \operatorname{deg} p + \operatorname{deg} q ) 的方阵,称为 \(\mathrm{Sylvester}\) 矩阵,其元素由 ( p ) 和 ( q ) 的系数向量的不同移位构成。因此,结式可以高效计算。
最后,在我们的场景中,( g_1 ) 的 ( x ) 系数是关于 ( y ) 的常数(即 ( y ) 的 \(0\) 次多项式),而 ( g_2 ) 的 ( x ) 系数是至多 ( e ) 次的 ( y ) 的多项式。根据 \(\mathrm{Sylvester}\) 矩阵的定义,结式 ( h(y) = \operatorname{res}_x(g_1, g_2) ) 是一个关于 ( y ) 的至多 ( e^2 ) 次的多项式。
我们声称 ( \Delta = r_2 - r_1 \neq 0 ) 是 ( h(y) ) 的一个根,并且它的绝对值满足
[
|\Delta| \leq 2^m < N^{1 / e^2}.
]
这成立的原因是,一元多项式 ( g_1(x, \Delta) ) 和 ( g_2(x, \Delta) ) 具有公共根 ( x = M_1 ) \(\Rightarrow \operatorname{res}_x(g_1(x,\Delta),g_2(x,\Delta))=0\)。
有了这些信息,我们的攻击步骤如下:
\(1\). 构造多项式 ( g_1, g_2 ),并计算结式 ( h(y) = \operatorname{res}_x(g_1, g_2) )。
\(2\). 由于 ( \deg h(y) \leq e^2 ),且我们知道 ( h(y) ) 在模 ( N ) 意义下具有根 ( \Delta = r_2 - r_1 \neq 0 ),我们可以对 ( h(y) ) 运行 \(\mathrm{Coppersmith}\) 算法。
\(3\). 由于 ( |\Delta| \leq 2^m < N^{1 / e^2} ),我们可以在多项式时间内得到一个短根列表,其中包含 ( \Delta )。
\(4\). 将列表中的每个元素尝试作为 ( \Delta ) 的候选值,我们知道一个已知的(候选)线性函数 ( \ell(M) = M - \Delta ),其中 ( M_1 = \ell(M_2) ),因此可以使用引理 \(2\) 中的相关消息攻击(related-message attack)。
\(5\). 其中某一次尝试涉及到正确的 ( \Delta ),从而揭示 ( M_1, M_2 )。我们可以通过重新加密并检查是否匹配 ( C_1, C_2 ) 来验证哪一次尝试是正确的(\(\mathrm{RSA}\) 函数加密是确定性的双射)。
附录 结式
引理 1
设 \(d(x)\) 是 \(f(x)\) 与 \(g(x)\) 的最大公因式,则 \(d(x) \neq 1\) 的充分必要条件是存在 \(\mathbb{K}\) 上的非零多项式 \(u(x), v(x)\) ,使
且 \(\operatorname{deg} u(x)<\operatorname{deg} g(x), \operatorname{deg} v(x)<\operatorname{deg} f(x)\) .
证明:若 \(d(x) \neq 1\) ,令 \(f(x)=d(x) v(x), g(x)=d(x) u(x)\) ,则
且 \(\operatorname{deg} u(x)<\operatorname{deg} g(x), \operatorname{deg} v(x)<\operatorname{deg} f(x)\) .
反过来,若 \(d(x)=1\) ,则由 \((1)\) 式知 \(f(x) \mid g(x) v(x)\) .但 \(f(x)\) 与 \(g(x)\) 互素,因此 \(f(x) \mid v(x)\) ,与 \(\operatorname{deg} f(x)>\operatorname{deg} v(x)\) 矛盾.\(\square\)
现设
其中 \(x_0, \cdots, x_{m-1} ; y_0, \cdots, y_{n-1}\) 为待定未知数.将上面 \(4\) 个式子代入 \((1)\) 式,比较系数得
我们把上述 \(m+n\) 个等式看成是 \(m+n\) 个未知数 \(x_0, x_1, \cdots, x_{m-1} ; y_0, y_1, \cdots, y_{n-1}\) 的线性方程组.不难算出这个线性方程组系数矩阵的转置为
若上述 \(m+n\) 方阵的行列式不等于零,则 \(x_i, y_j\) 都只能全为零,这时 \(f(x), g(x)\) 互素,即没有公根.反之,若上述方阵的行列式等于零,则 \(f(x), g(x)\) 有公因子,即有公根.于是我们给出如下定义:
定义 2
设
定义下列 \(m+n\) 阶行列式:
为 \(f(x)\) 与 \(g(x)\) 的结式或称 \(\mathrm{Sylvester}\) 行列式.
显然我们可以有下列判断两个多项式存在公根的定理.
定理 3
多项式 \(f(x)\) 与 \(g(x)\) 有公根(在复数域中)的充分必要条件是它们的结式 \(R(f, g)=0\) .
推论 4
多项式 \(f(x)\) 与 \(g(x)\) 互素(在某个特征 \(0\) 数域上)的充分必要条件是 \(R(f, g) \neq 0\) .
特征 \(0\) 的数域上多项式互素 \(\Leftrightarrow\) 在复数域上仍互素
多项式的结式也可以用它们的根来表示.
定理 5
设
\(f(x)\) 的根为 \(x_1, x_2, \cdots, x_n, g(x)\) 的根为 \(y_1, y_2, \cdots, y_m\) ,则 \(f(x)\) 与 \(g(x)\) 的结式为
证明:将 \(\mathrm{Sylvester}\) 行列式视作关于 \(x_1,\cdots,x_n,y_1,\cdots,y_m\) 的多项式。
我们有 \(a_1=a_0(-x_1-\cdots-x_n),a_2=a_0(x_1x_2+\cdots +x_{n-1}x_n),a_i(1\leq i \leq n)=(-1)^ia_0s_i(x_1,\cdots,x_n)\),其中 \(s_i\) 是第 \(i\) 个初等对称多项式,\(b_j\) 同理。
观察到该行列式的每一项都是 \(a^mb^n\) (下标可能不一致),所以关于 \(x_i,y_j\) 的最高次项也是 \(mn\) 次。
由定理 \(3\) 可知 \(R(f, g)=c \prod_{i=1}^n \prod_{j=1}^m\left(x_i-y_j\right)\),比较最高次项系数可知 \(c\) 为常数,显然 \(c=a_0^mb_0^n\).\(\square\)
附录 2 \(\mathbb{Z}[x]\) 上的互素性
命题 1
在 \(\mathbb{Z}[x]\) 上,多项式互素 \(\Rightarrow\) 没有公共根,没有公共根 \(\nRightarrow\) 互素。
证明:
前者由 \(\mathrm{Bezout}\) 等式可知,后者由反例 \(f_1(x)=2,f_2(x)=4\) 可知。\(\square\)

浙公网安备 33010602011771号