RSA算法演繹

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章