理解RSA演算法
本文是看完阮一峰的"RSA演算法原理"後所做的筆記,有興趣的同學可以移步至: RSA演算法原理--阮一峰
一.簡介
1.乙方生成兩把金鑰(公鑰和私鑰).公鑰是公開的,任何人都可以獲得,私鑰是保密的
2.甲方獲取乙方的公鑰,然後用它對資訊加密
3.乙方得到加密後的資訊,用私鑰解密
如果公鑰加密的資訊只有私鑰解得開,只要私鑰不洩露,通訊就是安全的.
二.尤拉函式
尤拉函式 ,在數論中,對正整數n,尤拉函式φ(n)是小於或等於n的正整數中與n互質的數的數目.例如:φ(8) = 4,因為1,3,5,7均與8互質.
通式:

尤拉函式公式(1)
其中p1,p2....pn為x的所有質因數,x為不為0的整數.注意: 每種質因數只一個 。
比如:12 = 2×2×3 那麼 φ(12)=12 (1-1/2)(1-1/3)=4
第一種情況
如果n=1,則 φ(1) = 1 。因為1與任何數(包括自身)都構成互質關係。
第二種情況
如果n是質數,則 φ(n)=n-1 。因為質數與小於它的每一個數,都構成互質關係。比如5與1、2、3、4都構成互質關係。
第三種情況
如果n是質數的某一個次方,即 n = p^k (p為質數,k為大於等於1的整數),則

尤拉函式公式(2)
(k-1)個,即1×p、2×p、3×p、...、p
(k-1)×p,把它們去除,剩下的就是與n互質的數。
第四種情況
如果n可以分解成兩個互質的整數之積
n = p1 × p2則 φ(n) = φ(p1p2) = φ(p1)φ(p2)
三.尤拉定理
如果兩個正整數a和n互質,則n的尤拉函式 φ(n) 可以讓下面的等式成立:

尤拉定理
也就是說,a的φ(n)次方被n除的餘數為1。或者說,a的φ(n)次方減去1,可以被n整除。比如,3和7互質,而7的尤拉函式φ(7)等於6,所以3的6次方(729)減去1,可以被7整除(728/7=104)。
尤拉定理有一個特殊情況。
假設正整數a與質數p互質,因為質數p的φ(p)等於p-1,則尤拉定理可以寫成

尤拉定理
四.模反元素
如果兩個正整數a和n互質,那麼一定可以找到整數b,使得 ab-1 被n整除,或者說ab被n除的餘數是1。
ab ≡ 1( mod n )
這時,b就叫做a的"模反元素"。
比如,3和11互質,那麼3的模反元素就是4,因為 (3 × 4)-1 可以被11整除。顯然,模反元素不止一個, 4加減11的整數倍都是3的模反元素 {...,-18,-7,4,15,26,...},即如果b是a的模反元素,則 b+kn 都是a的模反元素。
五.RSA演算法原理
1.金鑰生成步驟
比如,老張和老王是兩名地下工作者,老張要向老王傳達一個機密的檔案.這時老張想到了RSA演算法.
(1) 隨機選擇兩個不相等的質數p,q.這時,老張選擇了61和53.
(2) 計算p和q的乘積n.
n = p * q = 61 * 53 = 3233.
n的長度就是金鑰長度。3233寫成二進位制是110010100001,一共有12位,所以這個金鑰就是12位。實際應用中,RSA金鑰一般是1024位,重要場合則為2048位。
(3) 計算n的尤拉函式φ(n).根據上面所介紹的尤拉定理第四種情況:
φ(n) = φ(3233) = φ(61) * φ(53) = 60 * 52 = 3120;
這時,老張從1-3120之間,隨機選擇了17.(實際應用中,常常選擇65537).
(5) 計算e對於φ(n)的模反元素d所謂"模反元素"就是指有一個整數d,可以使得ed被φ(n)除的餘數為1。
ed ≡ 1 (mod φ(n))
這個公式等價於
ed - 1 = kφ(n)
於是,找到模反元素d,實質上就是對下面這個二元一次方程求解。
ex - φ(n)y = 1
那麼,已知e = 17,φ(n) = 3120 ,求x的值
17x - 3120y = 1
這個方程可以用"擴充套件歐幾里得演算法"求解,此處省略具體過程。總之,老張算出一組整數解為 (x,y)=(2753,15),即 d=2753。
(6) 將n和e封裝成公鑰,n和d封裝成私鑰n=3233,e=17,d=2753,所以公鑰就是 (3233,17),私鑰就是(3233, 2753),即公鑰為( n,e ),私鑰為( n,d )。
實際應用中,公鑰和私鑰的資料都採用 ASN.1 格式表達。
2.RSA演算法的可靠性
老張進行了這些計算後,整理了下上面所提到的數字:
隨機選擇的兩個質數:p 61 , q 53 質數的乘積:n n的尤拉函式φ(n):3120 隨機選擇的整數e:17 e的模反元素d:2753
這六個數字之中,公鑰用到了兩個(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加密的資訊實際上是不能被解破的。"
3.加密和解密
有了公鑰和金鑰,就能進行加密和解密了。
1.加密要用公鑰 (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) 進行解密。可以證明,下面的等式一定成立:(證明過程略,有興趣可以看阮一峰的部落格)
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金鑰。