算法推导
在RSA中,定义公钥为 ( e , n ) (e,n) (e,n),密钥为 ( d , n ) (d,n) (d,n)。
此时选定一个 e e e,用 拓展欧几里得(Exgcd) 法求 e e e的逆元 d d d,也就是密钥。
根据RSA的知识(这里不细讲了),我们选两个素数 p p p和 q q q,令 n = p ∗ q n=p*q n=p∗q,同时产生欧拉函数 φ ( n ) = ( p − 1 ) ∗ ( q − 1 ) \varphi(n)=(p-1)*(q-1) φ(n)=(p−1)∗(q−1),根据式子 e ∗ d ≡ 1 ( m o d φ ( n ) ) e*d\equiv 1(\mod \space \varphi(n) ) e∗d≡1(mod φ(n))可以得到密钥中的 d d d。
为使用Exgcd,写出如下方程:
1
=
e
∗
d
−
b
∗
k
,
b
=
φ
(
n
)
1 = e*d-b*k,\qquad b=\varphi(n)
1=e∗d−b∗k,b=φ(n)
对于上式, e e e和 k k k是作为未知量来求解的。
接着使用Exgcd进行如下推导:
{
g
c
d
(
e
,
b
)
=
e
∗
d
1
+
b
∗
k
1
g
c
d
(
b
,
e
m
o
d
b
)
=
b
d
2
+
(
e
m
o
d
b
)
k
2
\left\{\begin{matrix} gcd(e,b) = e*d_1+b*k_1 \\ g c d(b, e\mod b)=b d_{2}+(e\mod b) k_{2}\\ \end{matrix}\right.
{gcd(e,b)=e∗d1+b∗k1gcd(b,emodb)=bd2+(emodb)k2
接着,
∵
g
c
d
(
e
,
b
)
=
g
c
d
(
b
,
e
m
o
d
b
)
∴
e
d
1
+
b
k
1
=
b
d
2
+
(
e
m
o
d
b
)
k
2
∵
e
m
o
d
b
=
e
−
[
e
/
b
]
∗
b
∴
e
d
1
+
b
k
1
=
b
d
2
+
(
e
−
[
e
/
b
]
∗
b
)
k
2
\begin{array}{l} \because g c d(e, b)=g c d(b, e\mod b) \\ \therefore e d_{1}+b k_{1}=b d_{2}+(e\mod b) k_{2} \\ \because e { \mod b }=e-[e / b] * b \\ \therefore e d_{1}+b k_{1}=b d_{2}+(e-[e / b] * b) k_{2} \\ \end{array}
∵gcd(e,b)=gcd(b,emodb)∴ed1+bk1=bd2+(emodb)k2∵emodb=e−[e/b]∗b∴ed1+bk1=bd2+(e−[e/b]∗b)k2
对齐
e
e
e和
b
b
b,有
e
d
1
+
b
k
1
=
e
k
2
+
b
(
d
2
−
[
e
/
b
]
k
2
)
e d_{1}+b k_{1}=e k_{2}+b\left(d_{2}-[e / b] k_{2}\right)
ed1+bk1=ek2+b(d2−[e/b]k2)
由多项式恒等定理可得, d 1 = k 2 , k 1 = d 2 − [ e / b ] ∗ k 2 d_1=k_{2},\quad k_1=d_{2} - [e/b] * k_2 d1=k2,k1=d2−[e/b]∗k2。可以看出这是递归的式子,由后一组解推导出前一组解,递归基为 d = 1 , k = 0 d=1,k=0 d=1,k=0,反推即可得到乘法逆元 d 1 d_1 d1。需要注意的是 d 1 d_1 d1才是我们要寻找的解,也即密钥中的 d d d。
根据上面的推导可知,我们需要先进行递归,直到出现 b = 0 b=0 b=0的情况才结束递归,这时候初始化递归基,随后程序会自动自底向上地算出 d 1 d_1 d1。
举例
取 n = 77 , φ ( n ) = 6 ∗ 10 = 60 , e = 7 n=77,\varphi(n)=6*10=60,e=7 n=77,φ(n)=6∗10=60,e=7
第 i i i层递归 | e e e和 φ ( n ) ( b ) \varphi(n) \quad(b) φ(n)(b) | d i d_i di和 k i k_i ki | 计算过程 |
---|---|---|---|
1 | e = 7, b = 60 | [-17, 2] | [-17, 2 - 7/60 * (-17)] |
2 | e = 60, b = 7 | [2, -17] | [2, -1 - 60/7 * 2] |
3 | e = 7, b = 4 | [-1, 2] | [-1, 1 - 7/4 * (-1)] |
4 | e = 4, b = 3 | [1, -1] | [1, 0 - 4/3 * 1] |
5 | e = 3, b = 1 | [0, 1] | [0, 1 - 3/1 * 0 = 1] |
6 | e = 1, b = 0 | [1, 0] (递归基 d d d和 k k k) | 无 |
密钥中的 d = − 17 m o d 60 = 43 d=-17 \mod 60=43 d=−17mod60=43
笔算方法总结
在考试笔算的时候,先不要管 d d d和 k k k,一股脑地往下求出 b = 0 b=0 b=0的情况,随后初始化递归基。
接着在第 i i i层递归处使用公式 d i = k i + 1 , k i = d i + 1 − [ e / b ] ∗ k i + 1 d_i=k_{i+1},\quad k_i=d_{i+1} - [e/b] * k_{i+1} di=ki+1,ki=di+1−[e/b]∗ki+1解出 d i d_i di和 k i k_i ki。最后一直自底向上,求到第一层就可以结束了。