資源描述:
《RSA加密算法的編程實(shí)現(xiàn)論文》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、RSA加密算法的編程實(shí)現(xiàn)論文RSA算法是在1978年由美國麻省理工學(xué)院三位密碼學(xué)專家RonRivest、AdiShamir和LeonardAdleman發(fā)明的。RSA算法是一種典型的公開密鑰體制算法,它的發(fā)明是對密碼學(xué)的一個杰出貢獻(xiàn)。RSA算法得到了世界上最廣泛的應(yīng)用,并在1992年被ISO國際標(biāo)準(zhǔn)化組織正式納入國際標(biāo)準(zhǔn)[1][3]。與傳統(tǒng)的對稱密碼算法相比,RSA算法最大貢獻(xiàn)是為實(shí)現(xiàn)數(shù)字簽名和數(shù)字證實(shí)提供了手段,為現(xiàn)代網(wǎng)絡(luò)安全技術(shù)、電子商務(wù)、電子政務(wù)等打下了堅(jiān)實(shí)的基礎(chǔ)。RSA算法實(shí)現(xiàn)(1)在產(chǎn)生公開密鑰
2、前先要選擇兩個不同的素?cái)?shù)p、q,判斷素?cái)?shù)的方法很多,本程序判斷素?cái)?shù)的方法是:設(shè)n從3開始,每次增加2(排除偶數(shù)),除以≤的所有素?cái)?shù),如不存在被整除的數(shù),則n為素?cái)?shù)。(2)有了p、q值,就可以根據(jù)ψ(r)的值選擇一個公開密鑰pk,一般來說密鑰長度越長安全性越好,但密鑰的值應(yīng)小于ψ(r)的值,否則不能正確求出私人密鑰sk。程序中使用了歐幾里德算法求出最大公約數(shù):設(shè)有整數(shù)a、b,a>b>0,先令b為余數(shù),a為除數(shù),用每次余數(shù)為除數(shù),去除以上次的除數(shù),直到余數(shù)為0時,則上次的余數(shù)就是最大公約數(shù)。(3)已知整數(shù)a、
3、r,如果a·b≡1modr成立,也就是a·b的乘積被r除所得的余數(shù)等于1,用歐幾里德擴(kuò)展算法可以求出b。先令a作為余數(shù),r作為上次除數(shù),根據(jù)歐幾里德算法,由數(shù)學(xué)歸納法可以證明出求a的乘逆b的遞推公式如下:b-1=0,b=1b=
4、bj
5、其中j為整數(shù),從1開始,qj是rj/aj的整數(shù)部分,當(dāng)rj/aj的余數(shù)為1時,則a的乘逆b=
6、bj
7、。(4)加密、解密時,由于P=123456789值巨大,直接計(jì)算mamodr的值是很不方便的,使用“平方-乘算法”將極大地提高計(jì)算mamodr的速度。先將a轉(zhuǎn)換為二進(jìn)制數(shù)b,令
8、L為b的二進(jìn)制位數(shù),c=1,“平方-乘算法”偽碼如下:FORI=L-1TO0DO{c=c·cmodr;IFbi=1THENc=c·mmodr;}則c就是mamodr的值,其中bi是b的第i位值。RAS算法舉例下面我們舉一個例子說明RAS加密和解密過程:(1)選素?cái)?shù),如選p=47,q=61。(2)計(jì)算公開模數(shù)r=p×q=4×61=2867。(3)計(jì)算歐拉函數(shù)k。(4)利用求最大公約數(shù)算法等,選擇一個與ψ(r)互質(zhì)的量k,可以選k=167,并令sk=k=167。(5)根據(jù)sk·pk≡1modψ(r),用求乘逆
9、算法求出pk=1223。這樣我們就求出RSA算法3個關(guān)鍵值:r=2876,pk=1223,sk=167(6)加密時,假如明文P=123456789,可以將明文分成3組,即P1=123,P2=456,P3=789。用私人密鑰sk加密時:C1=P1167modr=1770C2=P2167modr=1321C3=P3167modr=1297所以密文C=177013211297。(7)解密時,如用公開密鑰pk解密時,只要計(jì)算:P1=C11223modr=123P2=C21223modr=456P3=C31223m
10、odr=789P=123456789這樣,就將明文還原出來了。以下程序是java編寫的實(shí)現(xiàn)RSA加密及解密的算法importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.NoSuchAlgorithmException;importjava.security.SecureRandom;importjava.security.interfaces.RSAPrivateKey;importjava.
11、security.interfaces.RSAPublicKey;importjavax.crypto.Cipher;//RSATest類即為測試類publicclassRSATest{//主函數(shù)publicstaticvoidmain(String[]args){try{RSATestencrypt=newRSATest();StringencryptText="encryptText";//輸入的明文KeyPairkeyPair=encrypt.generateKey();//調(diào)用函數(shù)生成密鑰對,函數(shù)
12、見下RSAPrivateKeyprivateKey=(RSAPrivateKey)keyPair.getPrivate();RSAPublicKeypublicKey=(RSAPublicKey)keyPair.getPublic();byte[]e=encrypt.encrypt(publicKey,encryptText.getBytes());//調(diào)用自己編寫的encrypt函數(shù)實(shí)現(xiàn)加密,byte[]de=encrypt