RSA的金鑰d計算(輾轉相除法) c 演算法實現

2021-10-07 00:23:03 字數 2448 閱讀 5231

先亮劍,c++的**實現:

int calc_d(int e, int n)
rsa演算法規定:

p*q =n

(p-1) * (q-1) = n

e*d ≡(1 mod n)

其中在e和n已知的情況下,求d

例:令p=47,q=71,求用rsa演算法加密的公鑰和私鑰。

計算如下:

(1)n=pq=47*71=3337;

(2)φ(n)=(p-1)*(q-1)=46*70=3220;

(3)隨機選取e=79(滿足與3220互質的條件);

(4)則私鑰d應該滿足:79*d mod 3220 = 1;

d如何解??

79*d mod 3220 = 1等價於存在乙個整數k,使得79*d+3220*k=1

79*d+3220*k=1    拆解為    79*d+(79*40+60)*k=1    化簡為79*(d+40*k)+60*k=1  記為79*d1+60*k=1 且d = d1-40*k

也就是說,我只要計算出79*d1+60*k=1的d1和k,就可以計算出79*d+3220*k=1的d和k,計算出d1,d即為d1-40*k

好,我們繼續碾轉

79*d1+60*k=1      拆解為    (60+19)*d1+60*k=1       化簡為19*d1+60*(k+d1)=1   記為19*d1+60*k1=1 且k=k1-d1

19*d1+60*k1=1    拆解為   19*d1+(3*19+3)*k1=1     化簡為19*(d1+3*k1)+3*k1=1記為19*d2+3*k1=1   且d1=d2-3*k1

19*d2+3*k1=1      拆解為    (3*6+1)*d2+3*k1=1        化簡為d2+3*(k1+6*d2)=1     記為d2+3*k2=1         且k1=k2-6*d2

到此就結束了,最終化為d2+3*k2=1,當k2取0時候,d2其值為1,滿足該式子

因此k2=0,d2=1,將其值帶入,計算易得k1=0-6*1=-6,d1=1-3*-6=19,k=-6-19=-25,d=19-40*-25=1019

驗算下:k=-25,d=1019帶入79*d+3220*k=1,驗算成立

上面的例項是為了入手,現在進行純粹的公式推導

要想計算關於e,n的對應的d,n和e肯定是互質的,因此不會有0或者n=e這些情況的

問題為:存在整數k,使得e*d+n*k=1,求d

記函式f(e,n)是求d函式,所以d=f(e,n)

下面的/是指整數除法,計算的商向下取整

當假設n比e大

e*d+n*k=1拆解為e*d+(n/e*e+n%e)*k=1 化簡為e*(d+n/e*k)+(n%e)*k=1,記為e*d1+(n%e)*k=1,且d=d1-n/e*k

e*d1+(n%e)*k=1用函式表示為d1=f(e,n%e),由於n比e大,可以寫為d1 = f(e%n,n%e),d=d1-n/e*k

因為e*d1+(n%e)*k=1,所以k=(1-e*d1)/(n%e), 所以d=d1-n/e*((1-e*d1)/(n%e))

因此d=d1-n/e*((1-e*d1)/(n%e))           =>    f(e,n)=f(e%n,n%e)-n/e*((1-e*f(e%n,n%e))/(n%e)) 

當假設n比e小:

e*d+n*k=1拆解為(e/n*n+e%n)*d+n*k=1化簡為(e%n)*d+n*(e/n*d+k)=1, 記為(e%n)*d+n*k1=1,且k=k1-e/n*d+k

(e%n)*d+n*k1=1用函式表示為d=f(e%n,n), 由於e比n大,可以寫為d=f(e%n,n%e)

因此d=f(e%n,n%e),因為e比n大,所以n/e為0,即d=f(e%n,n%e)=f(e%n,n%e)-n/e*((1-e*f(e%n,n%e))/(n%e)) 

由此,無論n比e大還是e比n大,其公式都可以用f(e,n)=f(e%n,n%e)-n/e*((1-e*f(e%n,n%e))/(n%e)) 表示

那什麼時候結束呢?

這個就是什麼時候是顯而易見,一眼就可以看出d值的時候,

如e為1時候,k只要取0,e*d+n*k=1,顯然d的值為1

如果n為1時候,d取啥整數值都可以,因為都存在k=1-e*d使公式成立,為了方便,d取1好了

因此因為e和n是互質的,e和n在碾轉相除的時候,比然會出現乙個為1,此時d值取1即可

推導結論:

當n或者e為1時候:d=1

否則d=f(e%n,n%e)-n/e*((1-e*f(e%n,n%e))/(n%e)) ,其中f(e,n)是求d函式,/是除法的商向下取整

輾轉相除法的證明

輾轉相除法的證明 設兩數為a b b a 求它們最大公約數的步驟如下 用b除a,得a bq r 0 r b q是這個除法的商 若r 0,則b是a和b的最大公約數。若r 0,則繼續考慮。首先,應該明白的一點是任何 a 和 b 的公約數都是 r 的公約數。要想證明這一點,就要考慮把 r 寫成 r a b...

輾轉相除法的原理

輾轉相除法又叫歐幾里得輾轉相除法,最早出現在西元前300年古希臘著名數學家歐幾里得的 幾何原本 第vii卷,命題i和ii 中。而在中國則可以追溯至東漢出現的 九章算術 而在現代數學中,這應該是屬於數論的部分的。要想解釋輾轉相除法的原理,需要先知道以下兩點 一 乙個一般定理 如果a是任一整數而b是任一...

奇怪的輾轉相除法

剛剛在網上翻到一套oi題,搞了下來,不過題幹好像被人和諧了一部分,反正只能做,剩下的就不知道了。第一題大意是 有數對 a,b 可以對其進行操作,讓它變為 a b,b 或 a,a b 初始數對為 1,1 給定乙個數p,問最少幾次操作就能變出p來。當時我上場先打bfs,然後迴圈佇列爆了,好像只有30 的...