Skip to content

第 8 章:已知私钥怎样随机分解模数 ​

返回目录

8.1 私钥给了我们哪一条额外信息 ​

沿用n=pq,其中p,q为不同奇质数。原对话的私钥关系给出

K=ed-1>0,\qquad\varphi(n)\mid K.

对于任意与n互质的a,欧拉定理保证a^K\equiv1\pmod n。我们知道n,e,d,所以能计算K;这一步并不要求知道p,q。证明中使用p,q解释算法,算法本身不能预先使用它们。

把K中的全部因子2提出,写成K=2^sr,其中r为奇数。由于\varphi(n)是偶数,这里s\ge1。接着构造连续平方序列

x_0=a^r\bmod n,\qquad
x_{j+1}=x_j^2\bmod n.

第j项同余于a^{2^jr},因此终点x_s\equiv a^K\equiv1。我们不是盲目平方;终点已由指数条件保证,现在要研究第一次到1之前的一项。

8.2 为什么“平方为1”能产生因子 ​

若某个x满足x^2\equiv1\pmod n,则n\mid(x-1)(x+1)。模p看,p是质数,所以p必须整除x-1或x+1,即x\equiv1或-1\pmod p。模q同理。

因此x的两个CRT坐标只能是下面四种组合:

模p模q合并后的意义
11x\equiv1\pmod n
-1-1x\equiv-1\pmod n
1-1两边符号不同
-11两边符号不同

CRT保证每种组合对应一个根。因为p,q都为奇数,模各个质数的1与-1不同,所以这四个根也互不相同。

最后两种称为1的非平凡平方根。若x\equiv1\pmod p、x\equiv-1\pmod q,那么p\mid x-1,但q\nmid x-1;否则q会同时整除x-1与x+1,进而整除它们的差2,与q为奇质数矛盾。因此

\gcd(x-1,n)=p,\qquad\gcd(x+1,n)=q.

符号相反时两个因子互换。最大公约数提取因子,是因为两个质因子分别落在x-1和x+1中,不是仅凭“平方为1”就能分解。若x\equiv\pm1\pmod n,得到的只是1或整个n,没有拆出因子。

8.3 第一次到1之前的一项为什么值得检查 ​

假设x_0\ne1,并设x_j是序列第一次出现的1,那么j\ge1。它的前一项x_{j-1}满足x_{j-1}^2\equiv1,但x_{j-1}\not\equiv1,因为这是第一次到1。

所以前一项只剩两种可能:它等于-1,算法这次失败;或者它是非平凡平方根,可以提取因子。初始就为1时也失败,因为没有前一项可检查。

一个简短核对是n=55,e=3,d=27,从而K=80=2^4\cdot5。取a=2,初始项2^5\equiv32,随后平方得到34、1。前一项34不是1或54,所以得到\gcd(33,55)=11。它只是一般算法的一次实例;成功条件来自上一节的四种符号组合。

8.4 完整算法与失败分支 ​

算法可以写成下面的顺序。所有余数均取0至n-1的代表,输入满足上面的指数条件。

  1. 从1,\ldots,n-1均匀选取a,计算g=\gcd(a,n)。若g>1,因a<n,g已是一个真因子,输出g,n/g。
  2. 若g=1,计算x=a^r\bmod n。若x=1,本次失败,重新独立选取底数。
  3. 最多进行s轮:令y=x^2\bmod n。若y\ne1,令x=y继续;若y=1且x=n-1,本次失败;若y=1且x\ne n-1,输出\gcd(x-1,n)及另一个因子。

最后一个分支里的x也不可能是1:初始为1的情况已排除,后续一出现1就终止。因此它确实是非平凡平方根。合法输入下一定能在s轮内到达1,因为x_s=a^K\equiv1。输出因子可以用乘法检查。

8.5 为什么还需要证明概率 ​

我们已经证明:若遇到非平凡平方根,算法会成功;也说明它可能失败。尚未证明的是,随机选择底数会多频繁地产生有用的根。

不能仅凭“四个平方根有两个有用”就断言成功率为一半。连续平方产生四个根的概率未必相同。需要从随机底数a出发,分析算法实际到达哪一个根。接下来的三章完成这一步。

保留每一次追问,认真走完每一步证明。