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)2)
擴充套件歐幾里得演算法
includeusing namespace std typedef struct nodenode node t node extend euclid int a,int b else extend euclid b,a b int tmp t.x t.x t.y t.y tmp a b t.y ...
擴充套件歐幾里得演算法筆記
在學習擴歐之前,我們首先要了解下面這兩個部分的知識。給定數 a,b 求 gcd a,b 也就是說,對於數 a,b gcd a,b gcd b,a b 對於歐幾里得演算法,也比較好用遞迴實現。c 如下 int gcd int a,int b 若 a,b 是整數,且 gcd a,b d 那麼對於任意的整...
擴充套件歐幾里得演算法分析詳細
如果a,b兩數是整數,那麼一定存在整數x,y 使得 ax by bcd a,b int bcd int a,int b 這個演算法很好理解,如果實在看不懂,用筆紙帶入兩個數相信你能懂 代入數字加深理解 求 50,35 50 1 35 15 15 50 1 35 35 15 2 5 5 35 15 2...