周君
摘要:隨著計(jì)算機(jī)技術(shù)迅速發(fā)展,人們已然步入數(shù)字化的時(shí)代,網(wǎng)絡(luò)拉進(jìn)了人與人之間的距離,愈發(fā)成熟的網(wǎng)絡(luò)技術(shù)支持使得信息的處理與交流變得迅速且普遍,同時(shí)信息的存儲(chǔ)與傳遞安全也一直為人們所追求,Java致力于開發(fā)網(wǎng)絡(luò)應(yīng)用程序,對(duì)于網(wǎng)絡(luò)處理能力非常出色,不僅如此,因其對(duì)于安全性本身就具有很高要求的特性,加上RSA算法這種加密算法具有優(yōu)越性,所以在Java語言的環(huán)境下來實(shí)現(xiàn)RSA算法可謂兩全其美。
關(guān)鍵詞:Java;RSA算法;公開秘鑰密碼
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)32-0040-03
由于Java語言應(yīng)用于網(wǎng)絡(luò)時(shí)的安全特性和RSA算法獨(dú)具優(yōu)越性,通過Java編程去實(shí)現(xiàn)RSA公鑰密碼算法,需要分析RSA公鑰密碼這一體制概念和相應(yīng)所需數(shù)學(xué)算法的原理,在數(shù)學(xué)算法基礎(chǔ)上去研究可行性。公開密鑰密碼是指使用一對(duì)不同的密鑰,一個(gè)密鑰是公開的,另一個(gè)是私密的,這種體制是為了驗(yàn)證在知道加密密鑰前提時(shí),推算出解密密鑰在計(jì)算上很難真正實(shí)行。RSA算法是就目前來說,針對(duì)公鑰密碼十分安全,廣泛應(yīng)用于信息通訊和數(shù)字簽名方面。
1 Java編程語言
1.1 Java語言由來
Java是由Sun公司根據(jù)嵌入式軟件的需求,將C++語言進(jìn)行了更改,開發(fā)出的命名為Oak的面向?qū)ο笳Z言更名而來,在1995年Sun正式發(fā)布了Java和HotJava瀏覽器后,IBM,Apple,微軟等各大公司,都爭(zhēng)相購買Java的使用許可證,并建立了相應(yīng)新的Java平臺(tái)來研發(fā)自己的產(chǎn)品。在2006年,Sun公司宣布要將Java技術(shù)免費(fèi)讓外界使用,在2007年Java的源代碼已可以讓任何開發(fā)人員使用并修改,為Java語言的發(fā)展和其他語言的誕生奠定了良好的基礎(chǔ)。
1.2 Java語言的特點(diǎn)
Java由C++衍生而來,屬于計(jì)算機(jī)高級(jí)語言之一,剔除了C++一些不會(huì)經(jīng)常使用的語句,比C++更加簡(jiǎn)單占用內(nèi)存也變得比較少,更容易讓人熟悉,與底層硬件無關(guān),只需要一次編寫就能完成在各個(gè)不同平臺(tái)環(huán)境下運(yùn)行,這是Java語言與生俱來的優(yōu)勢(shì)。隨著Java語言的發(fā)展,其程序的編寫難度是不斷降低的,程序員也把重心放在為Java語言編寫與框架設(shè)計(jì),Java變得更具規(guī)模化且實(shí)用性得到提升。
1.3 Java語言當(dāng)前發(fā)展情況
就目前的發(fā)展情況來看,Java編程語言深受程序云喜愛,各大知名企業(yè)都很熱衷于購買Java的許可證,進(jìn)而深入對(duì)Java語言的開發(fā)研究,開發(fā)與應(yīng)用系統(tǒng)不斷增多使得Java語言也在不斷地完善與被創(chuàng)新,無形中對(duì)各個(gè)領(lǐng)域的蓬勃發(fā)展注入了生機(jī)與活力。
1.3.1 常用環(huán)境
Java經(jīng)過幾十年的不斷發(fā)展,擁有了一些較為清晰的框架,進(jìn)而發(fā)展為多種分支,如根據(jù)Java2為中心可以分成企業(yè)版的J2EE平臺(tái),標(biāo)準(zhǔn)版J2SE平臺(tái)及微型版的J2ME,每個(gè)平臺(tái)具有不同的特點(diǎn),在長(zhǎng)期實(shí)踐下發(fā)現(xiàn)還是標(biāo)準(zhǔn)版J2SE廣為大眾所接受,在企業(yè)中的應(yīng)用也很廣泛?;贘ava語言使用是自由的前提下,更多用于企業(yè)環(huán)境,隨著科技水平日新月異,IT產(chǎn)業(yè)得到順利發(fā)展,許多企業(yè)也在不斷地轉(zhuǎn)型中,企業(yè)版本中的J2SE平臺(tái)促使Java編程顯著提升,使得計(jì)算機(jī)的變成占用內(nèi)存更小,服務(wù)器增大。
1.3.2 促進(jìn)PC時(shí)代到來
計(jì)算機(jī)是IT領(lǐng)域發(fā)展的基礎(chǔ),然而計(jì)算機(jī)現(xiàn)在已經(jīng)不是訪問互聯(lián)網(wǎng)的唯一方式,目前各種電子產(chǎn)品已經(jīng)涌入了IT領(lǐng)域,大大推動(dòng)了IT領(lǐng)域發(fā)展與創(chuàng)新,由于傳統(tǒng)的客戶機(jī)已經(jīng)不能很好地滿足系統(tǒng)的要求,PC比較傳統(tǒng)客戶機(jī)卻具有更大的優(yōu)勢(shì),另外Java語言應(yīng)對(duì)PC的要求都能一一滿足,且降低了內(nèi)存直接可以在不同終端運(yùn)行,其被識(shí)別范圍也是非常之廣,所以最終PC時(shí)代極大可能會(huì)成為將來的主流。
2 RSA算法研究
2.1 RSA算法簡(jiǎn)析及信息交換過程
2.1.1算法簡(jiǎn)析
RSA算法屬于公鑰密碼體制,是目前使用最為廣泛的,在經(jīng)過各種各樣攻擊的影響下,RSA算法的安全性受到了比較大的沖擊,但同時(shí)其算法也在一直進(jìn)行改進(jìn),模在持續(xù)增多,由于RSA算法一般都是大整數(shù)間進(jìn)行模的冪計(jì)算與模的相乘計(jì)算,造成其運(yùn)行速度比較慢。RSA的體制在理論上是安全的,但在實(shí)際運(yùn)用中發(fā)生的情況都是不一定的,由于不同的系統(tǒng)對(duì)于速度與安全性等有不同的要求,造成攻擊者可以根據(jù)系統(tǒng)特性去攻擊RSA密碼體制,從而成功破譯,所以需要不斷改進(jìn)RSA算法來提高其安全性。
2.1.2 實(shí)現(xiàn)信息交換過程
當(dāng)雙方進(jìn)行信息交換時(shí),一方生成出一對(duì)密鑰后需要將其中一把密鑰作為公開密鑰提供給另一方,另一方需要使用已知公鑰再加密信息后發(fā)送給對(duì)方,之后在進(jìn)行一系列加密措施,這樣的好處在于無須讓用戶交換密鑰,這樣的運(yùn)作是為了讓密鑰不那么容易被解密,但是同時(shí)也有一些不足,即加密與解密所花時(shí)間也會(huì)相應(yīng)增長(zhǎng),由于這個(gè)因素導(dǎo)致只適合于對(duì)少量數(shù)據(jù)加密保證實(shí)施進(jìn)度。
2.2 RSA算法基礎(chǔ)計(jì)算
RSA算法體制需要數(shù)學(xué)基本知識(shí)作為基礎(chǔ),涉及素?cái)?shù)、模運(yùn)算、單向函數(shù)等大量數(shù)學(xué)知識(shí),這些即為其算法的本質(zhì)。下面是RSA算法的基本流程圖
2.2.1 素?cái)?shù)
定義是一個(gè)大于1的整數(shù),如果這個(gè)數(shù)它的整因數(shù)只有1與本身,那么這個(gè)數(shù)就稱為素?cái)?shù)(或者質(zhì)數(shù)),不然就是合數(shù),例如2,3,5等等這樣的數(shù)即為素?cái)?shù)。
2.2.2 模數(shù)計(jì)算
這里假設(shè)一個(gè)正整數(shù)N,如果用N去分別除以a,b兩個(gè)整數(shù),計(jì)算出的結(jié)果的余數(shù)相同,就可稱a,b對(duì)于模數(shù)N來說同余數(shù),記作a=b(modm),如果不一樣就說a,b對(duì)模數(shù)N來說不同余,則記作a≠b(modm)
2.2.3 單向函數(shù)計(jì)算
將f設(shè)為一個(gè)函數(shù),在任意給定x情況下,輕易可以計(jì)算出y使y= f(x),但相反任意給定y,
2.3 針對(duì)RSA密碼體制的解析
從現(xiàn)有理論分析,RSA密碼的安全性是取決于大模數(shù)因數(shù)分解結(jié)果,越困難越難破解,在實(shí)際中從技術(shù)分析來說這是不一定的,因?yàn)闆]有任何數(shù)據(jù)證明分解大模數(shù)就可以保證一定能攻擊破解RSA密碼,實(shí)際上大模數(shù)的因數(shù)分解一直難以找到有效解決方法,對(duì)業(yè)界專家來說是十分頭疼的問題,但是在廣泛應(yīng)用中證明了RSA算法安全性是十分可靠的,但是在一些情況下如果密鑰的設(shè)置不當(dāng)則會(huì)帶來相應(yīng)安全問題,通過分析可以發(fā)現(xiàn)RSA存在目前幾種缺陷。
2.3.1 運(yùn)行速度較慢
在大數(shù)分解過程中,模數(shù)的大小造成分析是否困難,大數(shù)的模冪運(yùn)算是算法的核心,通常來說,RSA安全系數(shù)與模數(shù)長(zhǎng)度成正比,模數(shù)越大影響造就算法安全性提升,同時(shí)也會(huì)造成解析時(shí)間變長(zhǎng),所以運(yùn)行的速度受到影響就會(huì)大大減慢了。應(yīng)對(duì)這樣的問題,技術(shù)人員找出了一些應(yīng)對(duì)方法,如使用專門的硬件去實(shí)現(xiàn)其算法,以及適當(dāng)選擇實(shí)現(xiàn)算法參數(shù)也能加快運(yùn)行速度。
2.3.2 素?cái)?shù)問題
早在2000多年前,就有古希臘學(xué)者給出了證明素?cái)?shù)是無窮無盡的,而且因?yàn)樗財(cái)?shù)毫無規(guī)律可循的原因,導(dǎo)致根本無法找到一個(gè)可以代表全體素?cái)?shù)的公式,現(xiàn)在素?cái)?shù)產(chǎn)生都是隨機(jī)生成的,然后通過素?cái)?shù)判別法來判斷是否是素?cái)?shù),可以通過確定性素?cái)?shù)判定法和概率性素?cái)?shù)判定法來判定。
2.3.3 安全性面臨新考驗(yàn)
3 用Java語言實(shí)現(xiàn)RSA算法
3.1編程中算法的描述
RSA加密算法屬于非對(duì)稱加密算法的一種,與對(duì)成加密不同的就是需要兩個(gè)密鑰,已知RSA公鑰體制是以數(shù)論的尋求兩個(gè)大素?cái)?shù)當(dāng)它們相乘的乘積足夠大的情況下,按照現(xiàn)今條件很難將它們的乘積分解,在這樣的體制中,每個(gè)用戶擁有一對(duì)密鑰,公開密鑰與私密密鑰,公開密鑰知道的,但是私密密鑰是保密的,加密算法公開但是私密密鑰由公開密鑰決定,但由于大素?cái)?shù)相乘結(jié)果來分解非常困難,所以難以根據(jù)公鑰計(jì)算出私鑰。
RSA的構(gòu)造過程即根據(jù)用戶所輸入的p(公開)與q(私密)的bits隨機(jī)產(chǎn)生的大素?cái)?shù),公式是:n = p*q選擇Java語言作為編程語言是因?yàn)橛捎诎踩?,n的位數(shù)要盡可能大一些,甚至達(dá)到1024b以上,Java則可以很方便地處理大數(shù)據(jù)。隨機(jī)選擇密鑰e,e的要求是和(p-1)*(q-1)相互為質(zhì)數(shù)。解密密鑰d要滿足n與d互質(zhì),最后e和n作為公鑰,d是私鑰。加密信息的密文為: ci = mi^e(mod n)解密密文為:mi = ci^d(mod n)。
3.2 秘鑰對(duì)的產(chǎn)生與源程序
實(shí)現(xiàn)RSA算法的重要技術(shù)就是產(chǎn)生隨機(jī)數(shù),密碼的安全性也是建立在隨機(jī)數(shù)基礎(chǔ)上的,因而大素?cái)?shù)都是由隨機(jī)數(shù)產(chǎn)生而來,大素?cái)?shù)直接影響著密碼是否安全,另一個(gè)技術(shù)方面體現(xiàn)在素?cái)?shù)檢測(cè)方面,當(dāng)產(chǎn)生了兩個(gè)隨機(jī)大素?cái)?shù)后,要檢測(cè)兩個(gè)大素?cái)?shù)是否是由隨機(jī)序列構(gòu)成的整數(shù),避免被重復(fù)會(huì)造成的安全性降低。在程序中根據(jù)輸入的p,q位數(shù)值Bit,用BigInteger(Bit,10,rand)方法隨機(jī)產(chǎn)生素?cái)?shù)p,q,e,t = (p-1)*(q-1),因?yàn)閑的位數(shù)和p,q相同,則一定滿足e Do{ P = new bigInteger(Bit,10,rand); q = new bigInteger(Bit,10,rand); e = new bigInteger(Bit,10,rand); t = (p.substract.multiply); } while(?。╡.gcd(t).equal)); n = p. multiply(q); bigInteger tmp[] = Euclid(E.T); D = tmp[0]; } 由于在Java語言中大數(shù)bigInteger具有應(yīng)對(duì)大數(shù)處理和將大數(shù)進(jìn)行運(yùn)算等功能,用Java編程就可以很輕易地獲取大數(shù)數(shù)據(jù)并且編寫RSA公鑰算法的程序, 4總結(jié) 由于Java語言具有平臺(tái)無關(guān)性特點(diǎn),若是不對(duì)編寫后的語言進(jìn)行加密很容易使用戶經(jīng)過一些手段獲取源碼使信息發(fā)生泄漏,運(yùn)用RSA加密算法對(duì)文件進(jìn)行加密,從而可以達(dá)到防止盜用、保護(hù)版權(quán)等目的。使用Java編程實(shí)現(xiàn)RSA旨在將技術(shù)應(yīng)用于各個(gè)不同系統(tǒng)平臺(tái), RSA公鑰算法從提出到現(xiàn)在已經(jīng)差不多有25年,經(jīng)歷了種種考驗(yàn)也,被認(rèn)為是目前最優(yōu)秀的公鑰之一,不僅如此,RSA公鑰算法還是第一個(gè)能同時(shí)應(yīng)用于密碼簽名和數(shù)字簽名的算法,大大簡(jiǎn)化了其操作流程,容易讓人理解,由于Java語言其可被自由在不同平臺(tái)使用且都能很好地兼容的特點(diǎn),所以可以在不同的平臺(tái)上用Java編程來實(shí)現(xiàn)RSA算法,保證了其可操作性和安全性強(qiáng)的優(yōu)勢(shì)。 參考文獻(xiàn): [1] 王惠玲.基于Java的IDEA加密算法探討[J].中國科技信息,2010(22). [2] 張萍萍.基于RSA的公鑰密碼理論分析[J].信息科學(xué),2011(2). [3] 邵麗萍.Java語言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2012(10). [4] 凌捷.計(jì)算機(jī)數(shù)據(jù)安全技術(shù)[M].北京:科學(xué)出版社,2013(3). [5] 王昆.RSA算法研究及其抗攻擊風(fēng)險(xiǎn)量化分析[J].計(jì)算機(jī)與信息技術(shù),2014(12).