-
生成密鑰
- 隨機選擇兩個不相等的質數p和q。
例:61和53。(實際應用中,這兩個質數越大,就越難破解。) - 計算p和q的乘積n。
把61和53相乘:
n = 61×53 = 3233
n的長度就是密鑰長度。3233寫成二進制是110010100001,一共有12位,所以這個密鑰就是12位。實際應用中,RSA密鑰一般是1024位,要求較高的時候則為2048位。 - 計算n的歐拉函數φ(n)。
根據公式:
φ(n) = (p-1)(q-1)
算出φ(3233)等于60×52,即3120。 - 隨機選擇一個整數e,條件是1< e < φ(n),且e與φ(n) 互質。
那么在1到3120之間,隨機選擇17。(實際應用中,常常選擇65537。) - 計算e對于φ(n)的模反元素d。
所謂"模反元素"就是指有一個整數d,可以使得ed被φ(n)除的余數為1。
ed ≡ 1 (mod φ(n))
這個式子等價于
ed - 1 = kφ(n)
于是,找到模反元素d,實質上就是對下面這個二元一次方程求解。
ex + φ(n)y = 1
已知 e=17, φ(n)=3120,
17x + 3120y = 1
這個方程可以用"擴展歐幾里得算法"求解,此處省略具體過程??傊瑦埯惤z算出一組整數解為 (x,y)=(2753,-15),即 d=2753。
至此所有計算完成。 - 將n和e封裝成公鑰,n和d封裝成私鑰。
在愛麗絲的例子中,n=3233,e=17,d=2753,所以公鑰就是 (3233,17),私鑰就是(3233, 2753)。
實際應用中,公鑰和私鑰的數據都采用ASN.1格式表達(實例)。
- 隨機選擇兩個不相等的質數p和q。
-
RSA加密算法的可靠性
回顧上面的密鑰生成步驟,一共出現六個數字:p,q,n,φ(n),e,d
這六個數字之中,公鑰用到了兩個(n和e),其余四個數字都是不公開的。其中最關鍵的是d,因為n和d組成了私鑰,一旦d泄漏,就等于私鑰泄漏。
那么,有無可能在已知n和e的情況下,推導出d?
1. ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
2. φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
3. n=pq。只有將n因數分解,才能算出p和q。
結論:如果n可以被因數分解,d就可以算出,也就意味著私鑰被破解。
可是,大整數的因數分解,是一件非常困難的事情。目前,除了暴力破解,還沒有發現別的有效方法。維基百科這樣寫道:
"對極大整數做因數分解的難度決定了RSA算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA算法愈可靠。
假如有人找到一種快速因數分解的算法,那么RSA的可靠性就會極度下降。但找到這樣的算法的可能性是非常小的。今天只有短的RSA密鑰才可能被暴力破解。到2008年為止,世界上還沒有任何可靠的攻擊RSA算法的方式。
只要密鑰長度足夠長,用RSA加密的信息實際上是不能被解破的。"
事實上,人類已經分解的最大整數大概是232個十進制位,768個二進制位。比它更大的因數分解,還沒有被報道過,因此目前被破解的最長RSA密鑰就是768位。
-
加密和解密
- 使用公鑰加密(n,e)
假設要發送加密信息m,就要用公鑰 (n,e) 對m進行加密。這里需要注意,m必須是整數(字符串可以取ascii值或unicode值),且m必須小于n。
所謂"加密",就是算出下式的c:
me ≡ c (mod n)
愛麗絲的公鑰是 (3233, 17),鮑勃的m假設是65,那么可以算出下面的等式:
6517 ≡ 2790 (mod 3233)
于是,c等于2790,鮑勃就把2790發給了愛麗絲。
(2)解密要用私鑰(n,d)
愛麗絲拿到鮑勃發來的2790以后,就用自己的私鑰(3233, 2753) 進行解密??梢宰C明,下面的等式一定成立:
cd ≡ m (mod n)
也就是說,c的d次方除以n的余數為m。現在,c等于2790,私鑰是(3233, 2753),那么,愛麗絲算出
27902753 ≡ 65 (mod 3233)
因此,愛麗絲知道了鮑勃加密前的原文就是65。
至此,"加密--解密"的整個過程全部完成。
我們可以看到,如果不知道d,就沒有辦法從c求出m。而前面已經說過,要知道d就必須分解n,這是極難做到的,所以RSA算法保證了通信安全。
你可能會問,公鑰(n,e) 只能加密小于n的整數m,那么如果要加密大于n的整數,該怎么辦?有兩種解決方法:一種是把長信息分割成若干段短消息,每段分別加密;另一種是先選擇一種"對稱性加密算法"(比如DES),用這種算法的密鑰加密信息,再用RSA公鑰加密DES密鑰。
- 使用公鑰加密(n,e)