摘要:本文介紹了在JAVA環境下如何?IDEA對稱式加密演算法。由於電子商務和電子政務的普及,安全加密技術在其中應用非常廣泛,對安全加密技術的要求也很高。目前在JAVA環境下實現IDEA加密具有很多的優勢,因為JAVA是基於物件導向的程式設計語言,並且由於它的平台無關效能被大量應用於Internet的開發。
關鍵字:IDEA(Internation Data Encryption Algorithm) JCA JCE 密鑰 獨立性 可靠性
隨著Internet的迅速發展,電子商務的浪潮勢不可擋,日常工作和資料轉送都放在Internet網上進行傳輸,大大提高了效率,降低了成本,創造了良好的效益。但是,由於Internet網路通訊協定本身存在著重要的安全問題(IP包本身並不繼承任何安全特性,很容易偽造出IP包的地址、修改其內容、重播以前的包以及在傳輸途中攔截並查看包的內容),使網上的資訊傳輸存在巨大的安全風險電子商務的安全問題也越來越突出。加密是電子商務中最主要的安全技術,加密方法的選取直接影響電子商務活動中資訊的安全程度,在電子商務系統中,主要的安全問題都可以通過加密來解決。資料的保密性可通過不同的密碼編譯演算法對資料加密來實現。
對我國來講,雖然可以引進很多的外國裝置,但加密裝置不能依靠引進,因為它涉及到網路安全、國家機密資訊的安全,所以必須自己研製。當前國際上有許多密碼編譯演算法,其中DES(Data Encryption Standard)是發明最早的用得最廣泛的分組對稱式加密演算法,DES用56位蜜鑰加密64位明文,輸出64位密文,DES的56位密鑰共有256 種可能的密鑰,但曆史上曾利用窮舉攻擊破解過DES密鑰,1998年電子邊境基金會(EFF)用25萬美元製造的專用電腦,用56小時破解了DES的密鑰,1999年,EFF用22小時完成了破解工作,使DES演算法受到了嚴重打擊,使它的安全性受到嚴重威脅。因為JAVA語言的安全性和網路處理能力較強,本文主要介紹使用IDEA(Internation Data Encryption Algorithm )資料加密演算法在Java環境下實現資料的安全傳輸。
一、IDEA資料加密演算法
IDEA資料加密演算法是由中國學者來學嘉博士和著名的密碼專家 James L. Massey 於1990年聯合提出的。它的明文和密文都是64位元,但密鑰長為128位元。IDEA 是作為迭代的分組密碼實現的,使用 128 位的密鑰和 8 個迴圈。這比 DES 提供了更多的 安全性,但是在選擇用於 IDEA 的密鑰時,應該排除那些稱為“弱密鑰”的密鑰。DES 只有四個弱密鑰和 12 個次弱密鑰,而 IDEA 中的弱密鑰數相當可觀,有 2 的 51 次方個。但是,如果密鑰的總數非常大,達到 2 的 128 次方個,那麼仍有 2 的 77 次方個密鑰可供選擇。IDEA 被認為是極為安全的。使用 128 位的密鑰,蠻力攻擊中需要進行的測試次數與 DES 相比會明顯增大,甚至允許對弱密鑰測試。而且,它本身 也顯示了它尤其能抵抗專業形式的分析性攻擊。
二、Java密碼體系和Java密碼擴充
Java是Sun公司開發的一種物件導向的程式設計語言,並且由於它的平台無關性被大量應用於Internet的開發。Java密碼體系(JCA)和Java密碼擴充(JCE)的設計目的是為Java提供與實現無關的加密函數API。它們都用factory方法來建立類的常式,然後把實際的加密函數委託給提供者指定的底層引擎,引擎中為類提供了服務提供者介面在Java中實現資料的加密/解密,是使用其內建的JCE(Java加密擴充)來實現的。Java開發工具集1.1為實現包括數位簽章和資訊摘要在內的加密功能,推出了一種基於供應商的新型靈活應用編程介面。Java密碼體繫結構支援供應商的互操作,同時支援硬體和軟體實現。Java密碼學結構設計遵循兩個原則:(1)演算法的獨立性和可靠性。(2)實現的獨立性和相互作用性。演算法的獨立性是通過定義密碼服務類來獲得。使用者只需瞭解密碼演算法的概念,而不用去關心如何?這些概念。實現的獨立性和相互作用性通過密碼服務提供器來實現。密碼服務提供器是實現一個或多個密碼服務的一個或多個程式包。軟體開發商根據一定介面,將各種演算法實現後,打包成一個提供器,使用者可以安裝不同的提供器。安裝和配置提供器,可將包含提供器的ZIP和JAR檔案放在CLASSPATH下,再編輯Java安全屬性檔案來設定定義一個提供器。Java運行環境Sun版本時,提供一個預設的提供器Sun。
三、Java環境下的實現
1.加密過程的實現
void idea_enc( int data11[], /*待加密的64位元據首地址*/ int key1[]){
int i ;
int tmp,x;
int zz[]=new int[6];
for ( i = 0 ; i < 48 ; i += 6) { /*進行8輪迴圈*/
for(int j=0,box=i;j<6;j++,box++){
zz[j]=key1[box];
}
x = handle_data(data11,zz);
tmp = data11[1]; /*交換中間兩個*/
data11[1] = data11[2];
data11[2] = tmp;
}
tmp = data11[1]; /*最後一輪不交換*/
data11[1] = data11[2];
data11[2] = tmp;
data11[0] = MUL(data11[0],key1[48]);
data11[1] =(char)((data11[1] + key1[49])%0x10000);
data11[2] =(char)((data11[2] + key1[50])%0x10000);
data11[3] = MUL(data11[3],key1[51]);
}
2.解密過程的實現
void key_decryExp(int outkey[])/*解密密鑰的變逆處理*/
{ int tmpkey[] = new int[52] ;
int i;
for ( i = 0 ; i < 52 ; i++) {
tmpkey[i] = outkey[ wz_spkey[i] ] ;/*換位*/
}
for ( i = 0 ; i < 52 ; i++) {
outkey[i] = tmpkey[i];
}
for ( i = 0 ; i < 18 ; i++) {
outkey[wz_spaddrever[i]] = (char)(65536-outkey[wz_spaddrever[i]]) ;/*替換成加法逆*/
}
for ( i = 0 ; i < 18 ; i++){
outkey[wz_spmulrevr[i]] =(char)(mulInv(outkey[wz_spmulrevr[i]] ));/*替換成乘法逆*/
}
}
四、總結
在實際應用中,我們可以使用Java開發套件(JDK)中內建的對Socket通訊的支援,通過JCE中的Java流和鏈表,加密基於Socket的網路通訊.我們知道,加密/解密是資料轉送中保證資料完整性的常用方法,Java語言因其平台無關性,在Internet上的應用非常之廣泛.使用Java實現基於IDEA的資料加密傳輸可以在不同的平台上實現並具有實現簡潔、安全性強等優點。