基於Java的IDEA加密算法探討分析

一、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的數據加密傳輸可以在不同的平臺上實現並具有實現簡潔、安全性強等優點。

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