1、在RSA算法生成私鑰的過程中涉及到了擴展歐幾里得算法(簡稱exgcd),用來求解模的逆元。
2、首先引入逆元的概念:
逆元是模運算中的一個概念,我們通常說 A 是 B 模 C 的逆元,實際上是指 A * B = 1 mod C,也就是說 A 與 B 的乘積模 C 的余數為 1。可表示為 A = B^(-1) mod C。
打個比方,7 模 11 的逆元,即:7^(-1) mod 11 = 8,這是因為 7 × 8 = 5 × 11 + 1,所以說 7 模 11 的逆元是 8。
3、在RSA算法中求私鑰中的整數d時,需要使得 (e * d ) % m = 1,該方程等價於 e * d = 1 + y * m (y為整數),也等價於 e * d - y * m = 1。
因此求解d的過程就是求解該二元一次方程組(e和m已知,求解d),即求e模m的逆元。
4、在使用擴展歐幾里德算法求解e模m的逆元前,首先通過證明擴展歐幾里得算法來對該算法有一個簡單的理解:
引理:存在 x , y 使得 gcd(a,b)=ax+by
證明:
當 b=0 時,gcd(a,b)=a,此時 x=1 , y=0
當 b!=0 時,
設 ax1+by1=gcd(a,b)=gcd(b,a%b)=bx2+(a%b)y2
又因 a%b=a-a/b*b
則 ax1+by1=bx2+(a-a/b*b)y2
ax1+by1=bx2+ay2-a/b*by2
ax1+by1=ay2+bx2-b*a/b*y2
ax1+by1=ay2+b(x2-a/b*y2)
解得 x1=y2 , y1=x2-a/b*y2
因為當 b=0 時存在 x , y 為最后一組解
而每一組的解可根據后一組得到
所以第一組的解 x , y 必然存在
得證
根據上面的證明,在實現的時候采用遞歸做法
先遞歸進入下一層,等到到達最后一層即 b=0 時就返回x=1 , y=0
再根據 x1=y2 , y1=x2-a/b*y2 ( x2 與 y2 為下一層的 x 與 y ) 得到當層的解
不斷算出當層的解並返回,最終返回至第一層,得到原解
5、使用擴展歐幾里德算法的過程如下:
求exgcd(e, m)—>利用歐幾里得算法不斷遞歸直到x=1,y=0—>反向遞歸求出第一層的x和y,x即為e模m的逆元。
參考文檔:
1)https://www.jianshu.com/p/fbb8bf7baa97
2)https://www.cnblogs.com/shuaihui520/p/8954788.html
