利用拓展欧几里得公式求逆元——以RSA算法为例

算法推导

在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=pq,同时产生欧拉函数 φ ( n ) = ( p − 1 ) ∗ ( q − 1 ) \varphi(n)=(p-1)*(q-1) φ(n)=(p1)(q1),根据式子 e ∗ d ≡ 1 ( m o d      φ ( n ) ) e*d\equiv 1(\mod \space \varphi(n) ) ed1(mod φ(n))可以得到密钥中的 d d d

为使用Exgcd,写出如下方程:
1 = e ∗ d − b ∗ k , b = φ ( n ) 1 = e*d-b*k,\qquad b=\varphi(n) 1=edbk,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)=ed1+bk1gcd(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)k2emodb=e[e/b]bed1+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)=610=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计算过程
1e = 7, b = 60[-17, 2][-17, 2 - 7/60 * (-17)]
2e = 60, b = 7[2, -17][2, -1 - 60/7 * 2]
3e = 7, b = 4[-1, 2][-1, 1 - 7/4 * (-1)]
4e = 4, b = 3[1, -1][1, 0 - 4/3 * 1]
5e = 3, b = 1[0, 1][0, 1 - 3/1 * 0 = 1]
6e = 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。最后一直自底向上,求到第一层就可以结束了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值