資源描述:
《用java編程實(shí)現(xiàn)rsa加密算法new》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、用java編程實(shí)現(xiàn)RSA加密算法RSA加密算法是目前應(yīng)用最廣泛的公鑰加密算法,特別適用于通過Internet傳送的數(shù)據(jù),常用于數(shù)字簽名和密鑰交換。那么我今天就給大家介紹一下如何利用Java編程來實(shí)現(xiàn)RSA加密算法。一、RSA加密算法描述RSA加密算法是1978年提出的。經(jīng)過多年的分析和研究,在眾多的公開密鑰加密算法中,RSA加密算法最受推崇,它也被推薦為公開密鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。由數(shù)論知識可知,若將一個具有大素?cái)?shù)因子的合數(shù)進(jìn)行分解是很困難的,或者說這個問題的計(jì)算量是令人望而生畏的,而RSA加密算法正
2、是建立在這個基礎(chǔ)上的。在RSA加密算法中,—個用戶A可根據(jù)以下步驟來選擇密鑰和進(jìn)行密碼轉(zhuǎn)換:(1)隨機(jī)的選取兩個不同的大素?cái)?shù)p和q(一般為100位以上的十進(jìn)制數(shù)),予以保密;(2)計(jì)算n=p*q,作為用戶A的模數(shù),予以公開;(3)計(jì)算歐拉(Euler)函數(shù)z=(p-1)*(q-1),予以保密;(4)隨機(jī)的選取d與z互質(zhì),作為A的公開密鑰;(5)利用Euclid算法計(jì)算滿足同余方程e*d≡1modz的解d,作為用戶A的保密密鑰;(6)任何向用戶A發(fā)送信息M的用戶,可以用A的公開模數(shù)D和公開密鑰e根
3、據(jù)C=Memodn得到密文C;RSA加密算法的安全性是基于大素?cái)?shù)分解的困難性。攻擊者可以分解已知的n,得到p和q,然后可得到z;最后用Euclid算法,由e和z得到d。然而要分解200位的數(shù),需要大約40億年。二、用Java語言描述RSA加密算法的原理假設(shè)我們需要將信息從機(jī)器A傳到機(jī)器B,首先由機(jī)器B隨機(jī)確定一個private_kcy(我們稱之為密鑰),可將這個private_key始終保存在機(jī)器B中而不發(fā)出來。然后,由這個private_key計(jì)算出public_key(我們稱之為公鑰)。這個
4、public_key的特性是:幾乎不可能通過該public_key計(jì)算生成它的priyate_key。接下來通過網(wǎng)絡(luò)把這個public_key傳給機(jī)器A,機(jī)器A收到public_key后,利用public_key將信息加密,并把加密后的信息通過網(wǎng)絡(luò)發(fā)送到機(jī)器B,最后機(jī)器B利用已知的pri.rate_key,就可以解開加密信息。步驟:(1)首先選擇兩個大素?cái)?shù)p和q,計(jì)算n=p*q;m=(p-1)(q一1);(2)而后隨機(jī)選擇加密密鑰public_key,要求和m互質(zhì)(比如public_key=m-
5、1);(3)利用Euclid算法計(jì)算解密密鑰priyate_key,使private_key滿足public_key*private_key—1(modm),其中public_key,n是作為公鑰已知,priVate_key是密鑰;(4)加密信息text時,利用公式secretWord=texI^Public_key(modn)得到密文8ecretword;(5)解密時利用公式word=text^priVate_key(modn)得到原文word=text。三、用java編程實(shí)現(xiàn)RSA加密算法過
6、程1、產(chǎn)生大素?cái)?shù)實(shí)現(xiàn)RSA加密算法的第一個步驟是產(chǎn)生大素?cái)?shù)p和q,采用的方法是產(chǎn)生隨機(jī)數(shù)而后對其進(jìn)行素性判斷,故實(shí)現(xiàn)RSA加密算法的一個重要技術(shù)是隨機(jī)數(shù)的產(chǎn)生。RSA加密算法中的大素?cái)?shù)的隨機(jī)性直接影響算法的安全性,如果素?cái)?shù)產(chǎn)生時隨機(jī)性差,就很容易被重復(fù),因而也就是不安全的。然而,要人工產(chǎn)生真正的隨機(jī)數(shù)是不可能的,一般情況下計(jì)算機(jī)產(chǎn)生的隨機(jī)數(shù)都足偽隨機(jī)數(shù),但是,用一些算法產(chǎn)生的偽隨機(jī)數(shù)的隨機(jī)性非常接近真正的隨機(jī)數(shù),可以滿足密碼學(xué)的要求。JAVA的標(biāo)準(zhǔn)包java.security中的SecureRa
7、ndom類提供了一個基于SHA-1散列算法的強(qiáng)偽隨機(jī)數(shù)生成器,該生成算法生成的隨機(jī)序列具有比較理想的隨機(jī)性。使用該方法生成隨機(jī)序列后,利用Biglnteger類中的intcertainty方法對產(chǎn)生的隨機(jī)序列進(jìn)行多次素性測試,則通過該測試的隨機(jī)序列為素?cái)?shù)的概率為1-(1/2)m(設(shè)素性判斷的次數(shù)是m次)。不難看出,當(dāng)m取一個比較大的整數(shù)時,該序列為素?cái)?shù)的概率近似為1。生成N位的大素?cái)?shù)p和q的主要代碼如下:SecureRandomrnd=newSecureRandom();//生成隨機(jī)序列Bigl
8、ntegerp=newBiglnteger(m.200,md);//生成pBiglntegerq=newBiglnteger(m,200,md);//生成q2、計(jì)算乘積n和模數(shù)Φ(n)Biglnteger類中已經(jīng)預(yù)先定義了基本的數(shù)學(xué)運(yùn)算方法,如multiply、subtract等,利用這些方法可以非常快捷地計(jì)算n=p*q和Φ(n)=(p—1)(q—1)。具體實(shí)現(xiàn)代碼如下:Biglntegeru=(p.subtract(newBiglnteger(“1”)multiply(q.subtract(n