RSA是第一個也是使用的最廣發的公鑰加密算法,在1978年由R.Rivest、AdiShamir和Adleman三人發明,並以他們的名字命名。RSA算法的安全性基於大數因子分解的困難性,下面介紹一下它的基本原理:
1、生成公鑰和私鑰
(1) 選取兩個大素數:p和q;
(2)計算n=p*q;
(3)計算小於n並且與n互質的整數的個數,即歐拉函數o(n) = (p - 1) * (q - 1);
(4)隨機選擇加密密鑰e, 使1<e<o(n), 且與o(n)互質;
(5)最後,利用歐幾里得算法計算解密密鑰,使其滿足ed = 1(mod o(n));
然後將(e, n)公開,即爲公鑰PK,私人保存好d,即爲私鑰SK;
2、加密
將明文m分解成等長數據塊m1,m2, ……,mi。加密時,按如下公式進行計算即可:
ci=(mi)^ e(mod n),密文c則由c1,c2,……ci組成。
3、解密
與加密一樣,按如下公式進行計算:
mi=(ci)^d(mod n),明文m則由m1,m2,……,mi組成。
以上就是RSA算法的公私鑰產生、加密和解密的過程。整個過程中,最難理解的部分應是1.5中的求私鑰d,很多課本提到的都是歐幾里德算法,但並未具體的計算過程,下面本人就通過一個實例向大家介紹歐幾里德算法在RSA中的應用。
例:令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;
那麼這個式子(4)如何解呢?這裏就要用到歐幾里得算法(又稱輾轉相除法),解法如下:
(a)式子(4)可以表示成79*d-3220*k=1(其中k爲正整數);
(b)將3220對79取模得到的餘數60代替3220,則變爲79*d-60*k=1;
(c)同理,將79對60取模得到的餘數19代替79,則變爲19*d-60*k=1;
(d)同理,將60對19取模得到的餘數3代替60,則變爲19*d-3*k=1;
(e)同理,將19對3取模得到的餘數1代替19,則變爲d-3*k=1;
當d的係數最後化爲1時,
令k=0,代入(e)式中,得d=1;
將d=1代入(d)式,得k=6;
將k=6代入(c)式,得d=19;
將d=19代入(b)式,得k=25;
將k=25代入(a)式,得d=1019,這個值即我們要求的私鑰d的最終值。
此時,我們即可得到公鑰PK=(e,n)={79,3337},私鑰SK={1019,3337},後面的加密和解密直接套相應公式即可。
現在給個字符"C",我們再來演繹如何加解密。
取質數13和7
(1) n = 13*7 = 91
(2)o(n) = 12 * 6 = 72
(3)取72互質的數:5
(4)則私鑰應該滿足:5*d mod72=1
即:5 * d - 72 * K = 1 ---------------@2
將72 % 5得2替代72,則5*d - 2 * k = 1 -------------- @1
將5 % 2得1替代5,則d - 2 * k = 1
令k = 0, 得d = 1
將d = 1 代入@1中,則k = 2
將k = 2代入@2中, 則d = 29
此時,我們即可得到公鑰PK=(e,n)={5, 91},私鑰SK={29, 91}
字符“C”對應的ascii碼錶值爲67
67 * 67 mode 91= 30
30 * 67 mode 91= 8
8 * 67 mode 91 = 81
81 * 67 mod 91 = 58
以此方式連續乘次數爲5次(公鑰),最後得到加密數值 58
若要解密這個數值58,以上述相同方式連續乘以自己29次,即可得到解密數值 67。
參考文章:
http://8btc.com/thread-1240-1-1.html
http://blog.sina.com.cn/s/blog_4fcd1ea30100yh3a.html