先亮劍,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 的...