上一篇详细分析了几种分解因子的算法,这是攻击RSA密码最为明显的算法,这一篇中我们考虑是否有不用分解模数n就可以解密RSA的密文的方法,这是因为前面也提到,当n比较大的时候进行分解成素数的乘积是非常困难的。
一、计算$\phi (n)$
首先要说明的是计算$\phi (n)$并不比分解n容易,但是,如果n和$\phi (n)$都已知,通过求解$$n=pq$$ $$\phi (n) = (p-1)(q-1)$$,这就很容易得到一个二元方程完成破解。但实际上,计算$\phi (n)$并不比分解n容易。
二、计算解密指数a
如果解密指数$a$是已知,那么$n$可以通过一个随机算法在多项式时间内分解。但是,计算$a$也是不比分解n容易的。只是它提醒我们,一旦$a$被泄露,Bob重新选择一个加密指数是不够的,还需要重新选择一个模数$n$。
通过已知解密指数$a$分解$n$的算法是一个Las Vegas型的随机算法,它最坏情形成功的概率至少为$1-\epsilon$,因此,对于任何一个问题实例,算法不能给出一个答案的概率至多为$\epsilon$。
如果我们有了这样一个Las Vegas算法,只需要一次又一次运行它,知道找到答案为止,算法连续m次返回“没有答案”的概率为$\epsilon ^{m}$,为了得到一个答案,必须运行算法的平均次数是$\frac {1}{1-\epsilon}$。因此,在给定的值$a,b$和$n$作为输入,以至少$\frac{1}{2}$的概率分解$n$的Las Vegas算法在运行$m$次时,$n$被分解的概率至少为$1-(\frac{1}{2})^{m}$。
算法基于当$n=pq$是两个不同奇素数的乘积时与1模n的平方根相关的一些事实。若$x^{2} \equiv 1 (mod \, p)$,前面的定理告诉我们,一共有4个根,其中两个根为$\pm 1 (mod \, n)$,称为平凡平方根,另外两个根为非平凡的,它们模n互为相反数。
Alg1 RSA-FACTOR(n,a,b)
Comment:假定$ab \equiv 1 (mod \, n)$
记$ab - 1 = 2^{s}r$,r为奇数
随机选择$w$使得$1 \leq w \leq n-1$
$x \leftarrow gcd(w,n)$
if $1 < x < n$
then return(x)
Comment:x是n的一个因子
$v \leftarrow w^{r} (mod \, n)$
if $v \equiv 1 (mod \, n)$
then return("failure")
while $v \neq 1(mod \, n)$
$v_{0} \leftarrow v$
$v \leftarrow v^{2} (mod \, n)$
if $v_{0} \equiv -1(mod \, n)$
then return("failure")
else
$x \leftarrow gcd(v_{0}+1 , n)$(也有可能是 $x \leftarrow gcd(v_{0}-1,n)$)
return(x)
Comment:x是n的一个因子
这个算法分析起来比较的长,逐一来看,下面假定如果$n$可分解,其形式为$n=pq$
算法的第一步计算出$s$和$r$,都是常数,接着开始选取一个$w$,需要计算$w$和$n$的最大公约数。如果我们幸运地选取到$w$为$p$或$q$的倍数,那么可以直接分解$n$,如果$w$与$n$互素,那么可以通过连续的平方运算$w^{r},w^{2r},w^{4r}…$直到某个$t$,有$$w^{2^{t}r} \equiv 1 (mod \, n)$$由于$ab -1 = 2^{s}r \equiv 0 (mod \, \phi (n))$
又因为$w^{2^{s}r} \equiv 1 (mod \, n)$,因此while循环至多运行$s$次就会终止,在while循环结束时,我们可以找到一个值$v_{0}$,使得$(v_{0})^{2} \equiv 1 (mod \, n)$,但有$v_{0} \neq 1 (mod \, n)$,再根据下面的条件语句判断,$v_{0} \neq -1 (mod \, n)$,这说明$v_{0}$是1模$n$的一个非平凡平方根,我们能够分解$n$。
接下来需要证明的是,这个Las Vegas算法的成功概率至少为$\frac {1}{2}$,观察算法,有两种地方使得算法失败,第一处是$w^{r} \equiv 1 (mod \, n)$,第二处是$w^{2^{t}r} \equiv -1 (mod \, n)$,对于某个$t, 0 \leq t \leq s-1$。
我们需要考虑$s+1$个同余方程,如果$w$是这$s+1$个同余方程中至少一个的解,那么它是一个"坏"选择,下面讨论其中每一个同余方程的解的个数。
考虑同余方程$w^{r} \equiv 1 (mod \, n)$,利用中国剩余定理,分析方程的解的方法是分别考虑模p和模q的解,这个同余方程有解当且仅当$w^{r} \equiv 1 (mod \, p)$和$w^{r} \equiv 1 (mod \, q)$。当p为一个素数时,$Z_{p}^{\star}$是一个循环群,设$g$为$Z_{p}^{\star}$的生成元,可以记$w = g^{u}$,其中$0 \leq u \leq p-2$,于是有$$w^{r} \equiv 1 (mod \, p)$$ $$g^{ur} \equiv 1 (mod \, p)$$因此有$(p-1) | ur$。记$p-1 = 2^{i}p_{1}$,其中$p_{1}$是一个奇数,同理记$q-1 = 2^{j}q_{1}$,其中$q_{1}$是一个奇数。由于$$\phi (n) = (p-1)(q-1) | (ab-1) = 2^{s}r$$得到$$2^{i+j}p_{1}q_{1} | 2^{s}r$$
因此$i+j \leq s$,且$p_{1}q_{1} | r$,现在条件$(p-1) | ur$变成了$2^{i}p_{1} | ur$。由于$p_{1} | r$且$r$为奇数,因此充要条件为$2^{i} | u$,得到$u=k2^{i} , 0 \leq k \leq p_{1} -1$,且同余方程$w^{r} \equiv 1 (mod \, p)$的解的个数为$p_{1}$。同理可以得到$w^{r} \equiv 1 (mod \, q)$恰好有$q_{1}$个解,把任一模p的解和模q的解组合起来,利用中国剩余定理,就可以得到模n的解,个数为$p_{1}q_{1}$。
下一步是对固定的$t(0 \leq t \leq s-1)$考虑同余方程$w^{2^{t}r} \equiv -1 (mod \, n)$的解,同理也是考虑模$p$和模$q$的解,类似的也记$w = g^{u}$,有$$g^{u2^{t}r} \equiv -1 (mod \, p)$$由于$g^{\frac {p-1}{2}} \equiv -1 (mod \, p)$有$$u2^{t}r \equiv \frac{p-1}{2} (mod \, p-1)$$ $$(p-1) | (u2^{t}r - \frac{p-1}{2})$$ $$2(p-1) | (u2^{t+1}r - (p-1))$$由于$p-1 = 2^{i}p_{1}$,可以得到$$2^{i+1}p_{1} | (u2^{t+1}r-2^{i}p_{1})$$取出公因子$p_{1}$,上式变为$$2^{i+1} | (\frac{u2^{t+1}r}{p_{1}}-2^{i})$$现在,如果$t \geq i$,因为此时$2^{i+1} | 2^{t+1}$,但$2^{i+1} 不能整除2^{i}$,另一方面,如果$t \leq i-1$,那么$u$是一个解,当且仅当$u$是$2^{i-t-1}$的奇数倍,这种情况下解的个数为$$\frac {p-1}{2^{i-t-1}}× \frac{1}{2} = 2^{t}p_{1}$$
通过类似的推理,同余方程$w^{2^tr} \equiv -1 (mod \, q)$当$t \geq j$时没有解,当$t \geq j$时没有解,当$t \leq j-1$时有$2^{t}q_{1}$个解,利用中国剩余定理,可以知道$w^{2^tr} \equiv -1 (mod \, n)$的解的个数为$$\begin{align} 0 & \quad t \geq min\{ i,j \} \\ 2^{2t}p_{1}q_{1} & \quad t \leq min \{ i,j \}-1 \\ \end{align}$$
现在,$t$可以从$0$到$s-1$取值。不失一般性,假定$i \leq j$;那么当$t \geq i$时解的个数为0,对于$w$的“坏”选择的总数最多为$$\begin{align} p_{1}q_{1}+p_{1}q_{1}(1+2^{2}+2^{4}+…+2^{2i-2}) =& p_{1}q_{1}(1+\frac{2^{2i}-1}{3}) \\ =& p_{1}q_{1}(\frac{2}{3} + \frac{2^{2i}}{3}) \\ \end{align}$$
前面已知$p-1 = 2^{i}p_{1}$,且$q-1 =2^{j}q_{1}$,现在有$j \geq i \geq 1$,所以$p_{1}q_{1} < \frac {n}{4}$,得到$$2^{2i}p_{1}q_{1} \leq 2^{i+j}p_{1}q_{1} \leq (p-1)(q-1) < n$$因此,可以得到$$\begin{align} p_{1}q_{1}(\frac{2}{3} + \frac{2^{2i}}{3})<& \frac{n}{6}+\frac{n}{3}\\ =& \frac{n}{2} \\ \end{align}$$
由于至多$\frac{n-1}{2}$个$w$的选择是“坏”的,容易知道至少有$\frac{n-1}{2}$个选择是“好”的,算法的成功概率至少为\frac{1}{2}。
三、Wiener的低解密指数攻击
和前面一样假定$n=pq$,其中$p$和$q$为素数,那么$\phi (n)=(p-1)(q-1)$。由M.Wiener提出的一种攻击,当满足以下条件时可以成功地计算解密指数a。$$3a<n^{\frac{1}{4}} 且 q<p<2q$$如果$n$的二进制表示有$l$比特,那么当$a$的二进制表示位数小于$\frac{l}{4}-1$,$p$和$q$相距离不太远时有效。
由于$ab \equiv 1 (mod \phi (n))$,可知存在一个整数$t$使得$$ab-t \phi(n) = 1$$
由于$n=pq > q^{2}$,我们有$q < \sqrt{n}$,因此得到$$0 < n-\phi (n) = p+q-1 < 2q+q-1<3q<3 \sqrt{n}$$
现在考虑$$ \begin{align} |\frac{b}{n} - \frac{t}{a}| =& |\frac{ba-tn}{an}| \\ =& |\frac{1+t(\phi (n)-n)}{an}| \\ <& \frac{3t \sqrt{n}}{an} \\ =& \frac{3t}{a \sqrt{n}} \\ \end{align}$$
由于$t<a$,我们有$3t<3a<n^{\frac{1}{4}}$,因此有$$|\frac{b}{n} - \frac{t}{a}| < \frac{1}{an^{\frac{1}{4}}}$$
最后,由于$3a<n^{\frac{1}{4}}$,我们有$$|\frac{b}{n} - \frac{t}{a}| < \frac{1}{3a^{2}}$$
因此,分数$\frac{t}{a}$是分数$\frac{b}{n}$的一个很接近的近似,从连分数理论可知,这样接近的近似值是$\frac{b}{n}$的连分数展开的一个收敛子,这种扩展可以用Euclidean算法得到。
Def2 (有限连分数)一个有限连分数是非负整数的m组,即[$q_{1},…,q_{m}$],它是下面表达式的简写形式:$$q_{1}+\cfrac{1}{q_{2}+\cfrac{1}{q_{3}+\dotsb + \cfrac{1}{q_{m}}}}$$
假定$a$和$b$为满足$gcd(a,b)=1$的正整数,且假定Euclidean算法的输出为m组$(q_{1},…,q_{m})$,容易看到$\frac{a}{b} = [q_{1},…,q_{m}]$,称$[q_{1},…,q_{m}]$是$a/b$在这种情形下的连分数展开。现在,对$1 \leq j \leq m$,定义$C_{j} = [q_{1},…,q_{j}]$,称$C_{j}$为$[q_{1},…,q_{m}]$的第$j$个收敛子。于是每一个$C_{j}$可以写成有理数形式$\frac{c_{j}}{d_{j}}$,其中$c_{j}$和$d_{j}$满足如下的递推关系:$$ c_{j} = \begin{cases} 1 & \quad \text{j=0} \\ q_{1} & \quad \text{j=1} \\ q_{j}c_{j-1}+c_{j-2} & \quad \text {$j \geq 2$} \\ \end{cases}$$ $$d_{j} = \begin{cases} 0 & \quad \text{j=0} \\ 1 & \quad \text{j=1} \\ q_{j}d_{j-1}+d_{j-2} & \quad \text {$j \geq 2$} \\ \end{cases}$$
对于有理数的连分数,它的收敛子满足很多有趣的性质,下面是其中一个定理。
Thm3 假定$gcd(a,b) = gcd(c,d) = 1$且$$|\frac{a}{b} - \frac{c}{d}| < \frac{1}{2d^{2}}$$那么$\frac{c}{d}$是$\frac{a}{b}$连分数展开的一个收敛子。
在前面的数学推导过程中,未知分数$\frac{t}{a}$是$\frac{b}{n}$的一个很接近的近似,上面的定理告诉我们,$\frac{t}{a}$一定是$\frac{b}{n}$的连分数展开的一个收敛子,既然$\frac{b}{n}$是公开信息,很容易计算出它的收敛子,我们所需要的仅仅是测试它们中间哪一个是正确的方法。
这并不难做到,如果$\frac{t}{a}$和$\frac{b}{n}$的一个收敛子,那么就能够计算得$\phi (n) = \frac{ab-1}{t}$,一旦$n$和$\phi (n)$已知,就可以根据二次方程解出$p$值来分解$n$值,但我们事先不知道$\frac{b}{n}$的哪个收敛子能得到$n$的分解,所以要依次试验直到找到$n$的分解为止。否则不能用这种方法分解$n$。
下面我们可以详细看看Wiener算法的伪代码。
Alg4 Wiener Algorithm(n,b)
$(q_{1},…,q_{m};r_{m}) \leftarrow Euclidean Algorithm(n,b)$
$c_{0} \leftarrow 1$
$c_{1} \leftarrow q_{1}$
$d_{0} \leftarrow 0$
$d_{1} \leftarrow 1$
for $j \leftarrow 2 $ to $m$
$c_{j} \leftarrow q_{j}c_{j-1} + c_{j-2}$
$d_{j} \leftarrow q_{j}d_{j-1} + d_{j-2}$
$n^{'} \leftarrow \frac{d_{j}b-1}{c_{j}}$
Comment:$n^{'} = \phi (n)$,如果$\frac{c_{j}}{d_{j}}$是正确的收敛子。
if $n^{'}$是一个整数
设p和q为方程$x^{2}-(n-n^{'}+1)x+n=0$的根
if p和q为小于n的整数
return (p,q)
return ("failure")
最后有趣的一点是,条件$3a<n^{\frac{1}{4}}$可以在算法运行前预先估计解密指数是否满足要求。
本篇到此结束,关于RSA密码体制我应该还会有一篇读书笔记,主要讲述Rabin密码体制以及RSA的语义安全性。