1. 程式人生 > >非對稱加密之RSA演算法

非對稱加密之RSA演算法

1977年,MIT的三位老師Rivest、Shamir 和 Adleman 設計了一種演算法,可以實現非對稱加密。這種演算法以他們三個人的名字命名為RSA。RSA演算法是使用最為廣泛的非對稱加密演算法。 RSA加密利用了單向函式正向求解很簡單,反向求解很複雜的特性。 具體是利用了:

1.對兩個質數相乘容易,而將其合數分解很難。即n=p1*p2,已知p1、p2求n簡單,已知n求p1、p2困難。

2.(m^e) mod n=c,已知m、e、n求c簡單,已知e、n、c求m很難。

RSA加密,實現了公開金鑰,就是A可以給所有人傳送公鑰,其他人把要加密的資訊用這把公鑰加密後傳送給A,A用私鑰解密就可以獲得加密的資訊了。反過來,A要傳送加密資訊給B,只要知道B的公鑰就可以了,而這個公鑰是公開的。

公鑰n、e的生成:隨機選取兩個質數p1、p2,n=p1*p2,再隨機選取一個整數e,e與φ(n)互質。

加密過程:(m^e) mod n=c,其中m為原資訊,c為密文,n、e為公鑰。 解密過程:(c^d) mod n=m,其中d為解密金鑰。

解密金鑰d的求解:

 (c^d) mod n=(((m^e) mod n)^d) mod n=((m^e)^d) mod n=(m^ed) mod n=m 
 ① 根據費馬定理(m^φ(n)) mod n≡1,又1^k≡1,所以(m^k*φ(n)) mod n≡1,兩邊同乘以m得m*((m^k*φ(n)) mod n)≡1*m,化簡(m^(k*φ(n)+1)) mod n≡m 
 ② 由①、②得ed=(k*φ(n)+1),解得d=(k*φ(n)+1)/e。

費馬定理:

若p是素數,a與p互素,則a^(p-1)≡1 (mod p)

使用RSA演算法進行加密、解密的過程如下:

A:有一個公鑰n、e。例如:3127、3。
B:有一個資訊m。例如:89。 
C:偷聽者  

A: 
第一步:隨機找兩個質數p1、p2,一個奇數e。例如:53、59、3。 
第二步:計算n=p1*p2得到n,計算尤拉函式φ(n)=(p1-1)*(p2-1)得到φ(n),計算鑰匙d=(k*φ(n)+1)/e得到d。
       例如:53*59=3127、(53-1)*(59-1)=3016、(k*φ(n)+1)/e=(2*3016+1)/3=2011。 
第三步:傳送n、e給大家知道 //n、e就是公鑰,d就是金鑰。  

C:獲得n、e 

B: 
第一步:獲得n、e
第二步:加密資訊m,(m^e) mod n=c,獲得加密資訊c。例如:(89^3) mod 3127=1394。 
第三步:傳送c給A  

C: 
第一步:截獲加密資訊c 
第二步:破解資訊c,此時C只有n、e、c,只有把n分解質因數才能破解,而此分解很困難特別是當n很大的時候。  

A: 
第一步:收到加密資訊c
第二步:解密資訊c,(c^d) mod n=m,獲得資訊m。例如:(1394^2011) mod 3127=89。 
完成

為什麼RSA是不會被破解的呢?

為了解密,關鍵是要找出私鑰。如果已知(p-1)(q-1),那麼就很容易算出來私鑰。而為了獲得(p-1)(q-1),就需要知道p和q的值。為了獲得p和q的值,就必須對N進行因式分解。

1874年,William Stanley Jevons就在自己的書《科學的原則》中寫道:

讀者中有人能發現是哪兩個數的乘積為8616460799嗎?我想這個答案只有我自己知道。

書中他描述了單向函式(one-way function)與密碼學的關係,還提出了因子分解問題可以用作建立trapdoor函式。

到目前為止,關於RSA可靠性的描述:

對極大整數做因數分解的難度決定了RSA演算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA演算法愈可靠。 假如有人找到一種快速因數分解的演算法,那麼RSA的可靠性就會極度下降。但找到這樣的演算法的可能性是非常小的。今天只有短的RSA金鑰才可能被暴力破解。到2008年為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。 只要金鑰長度足夠長,用RSA加密的資訊實際上是不能被解破的。

RSA的正確性:

可以使用尤拉函式和尤拉定理來證明。 (這個證明還必須補充一部分就是m和n不互質的情況。尤拉定理只是在m和n互質時才有用。)

如果 m 和 n 不互質,因為 n 是兩個質數 p 和 q 的乘積,所以 m 必然是 p 或 q 的倍數(因為要求 m<n )。假設 m=kp 。

此時 m^{ed}=(kp)^{ed} ; 因為 p、q 互質,所以由費馬小定理可知: (kp)^{ed}\equiv(kp)^{a(p-1)(q-1)+1}\equiv(kp)(mod q)

改寫一下這個式子:

(kp)^{ed}=b*q + kp ;

因為等式左右兩邊都是 p 的倍數,所以等式右邊的一項 b*q 必然也是 p 的倍數。

所以等式可以改寫成

(kp)^{ed}=c*p*q + kp

而 n=p*q ,所以上式左右兩邊同時對 n 求模,可以得到

(kp)^{ed}\equiv kp(mod n)

得證。

RSA的應用:數字簽名

最普遍的應用,網站身份認證。如何證明我們連上的網站就是支付寶alipay呢?如果因為各種原因,如域名汙染,我們的瀏覽器訪問了攻擊者網站,這時一定要進行驗證。

驗證,就是要檢查一個證書。當我們以HTTPS的方式連上一個網站時,網站會首先給我們傳送一個證書。這個證書裡包含有它的域名、公鑰等資訊。同時這個證書是由專門的第三方公信機構CA使用自己的私鑰簽了名的。瀏覽器在拿到這個證書之後,首先用第三方公信機構CA的公鑰對這個證書解密,然後檢視和比對證書裡的域名和瀏覽器位址列的域名,完全匹配才認為是正確的網站。

如果域名被汙染,雖然攻擊者網站可以拷貝一份正常網站的證書,但是因為證書中包括了正常網站的公鑰,如果它不能獲得正常網站的私鑰,那麼它就沒有辦法對加密資訊進行解密。從而不能正常建立連線。