天天看點

利用DES加密算法保護Java源代碼

作者:李琴 李家明   出處:計算機與資訊技術

 摘 要:本文首先分析了Java源代碼需要加密的原因,簡要介紹了DES算法及Java密碼體系和Java密碼擴充,最後說明了利用DES加密算法保護Java源代碼的方法及步驟。

  關鍵詞 Java 加密 DES算法

  Java語言是一種非常适用于網絡程式設計的語言,它的基本結構與C++極為相似,但抛棄了C/C++中指針等内容,同時它吸收了Smalltalk、C++面向對象的程式設計思想。它具有簡單性、魯棒性、可移植性、動态性等特點。這些特點使得Java成為跨平台應用開發的一種規範,在世界範圍内廣泛流傳。

  加密Java源碼的原因

  Java源代碼經過編譯以後在JVM中執行。由于JVM界面是完全透明的,Java類檔案能夠很容易通過反編譯器重新轉換成源代碼。是以,所有的算法、類檔案等都可以以源代碼的形式被公開,使得軟體不能受到保護,為了保護産權,一般可以有以下幾種方法:

  (1)"模糊"類檔案,加大反編譯器反編譯源代碼檔案的難度。然而,可以修改反編譯器,使之能夠處理這些模糊類檔案。是以僅僅依賴"模糊類檔案"來保證代碼的安全是不夠的。

  (2)流行的加密工具對源檔案進行加密,比如PGP(Pretty Good Privacy)或GPG(GNU Privacy Guard)。這時,最終使用者在運作應用之前必須先進行解密。但解密之後,最終使用者就有了一份不加密的類檔案,這和事先不進行加密沒有什麼差别。

  (3)加密類檔案,在運作中JVM用定制的類裝載器(Class Loader)解密類檔案。Java運作時裝入位元組碼的機制隐含地意味着可以對位元組碼進行修改。JVM每次裝入類檔案時都需要一個稱為ClassLoader的對象,這個對象負責把新的類裝入正在運作的JVM。JVM給ClassLoader一個包含了待裝入類(例如java.lang.Object)名字的字元串,然後由ClassLoader負責找到類檔案,裝入原始資料,并把它轉換成一個Class對象。

  使用者下載下傳的是加密過的類檔案,在加密類檔案裝入之時進行解密,是以可以看成是一種即時解密器。由于解密後的位元組碼檔案永遠不會儲存到檔案系統,是以竊密者很難得到解密後的代碼。

  由于把原始位元組碼轉換成Class對象的過程完全由系統負責,是以建立定制ClassLoader對象其實并不困難,隻需先獲得原始資料,接着就可以進行包含解密在内的任何轉換。

  Java密碼體系和Java密碼擴充

  Java密碼體系(JCA)和Java密碼擴充(JCE)的設計目的是為Java提供與實作無關的加密函數API。它們都用factory方法來建立類的例程,然後把實際的加密函數委托給提供者指定的底層引擎,引擎中為類提供了服務提供者接口在Java中實作資料的加密/解密,是使用其内置的JCE(Java加密擴充)來實作的。Java開發工具集1.1為實作包括數字簽名和資訊摘要在内的加密功能,推出了一種基于供應商的新型靈活應用程式設計接口。Java密碼體系結構支援供應商的互操作,同時支援硬體和軟體實作。

  Java密碼學結構設計遵循兩個原則:

  (1)算法的獨立性和可靠性。

  (2)實作的獨立性和互相作用性。

  算法的獨立性是通過定義密碼服務類來獲得。使用者隻需了解密碼算法的概念,而不用去關心如何實作這些概念。實作的獨立性和互相作用性通過密碼服務提供器來實作。密碼服務提供器是實作一個或多個密碼服務的一個或多個程式包。軟體開發商根據一定接口,将各種算法實作後,打包成一個提供器,使用者可以安裝不同的提供器。安裝和配置提供器,可将包含提供器的ZIP和JAR檔案放在CLASSPATH下,再編輯Java安全屬性檔案來設定定義一個提供器。Java運作環境Sun版本時, 提供一個預設的提供器Sun。

  下面介紹DES算法及如何利用DES算法加密和解密類檔案的步驟。

  DES算法簡介

  DES(Data Encryption Standard)是發明最早的最廣泛使用的分組對稱加密算法。DES算法的入口參數有三個:Key、Data、Mode。其中Key為8個位元組共64位,是DES算法的工作密鑰;Data也為8個位元組64位,是要被加密或被解密的資料;Mode為DES的工作方式,有兩種:加密或解密。

  DES算法工作流程如下:若Mode為加密模式,則利用Key 對資料Data進行加密, 生成Data的密碼形式(64位)作為DES的輸出結果;如Mode為解密模式,則利用Key對密碼形式的資料Data進行解密,還原為Data的明碼形式(64位)作為DES的輸出結果。在通信網絡的兩端,雙方約定一緻的Key,在通信的源點用Key對核心資料進行DES加密,然後以密碼形式在公共通信網(如電話網)中傳輸到通信網絡的終點,資料到達目的地後,用同樣的Key對密碼資料進行解密,便再現了明碼形式的核心資料。這樣,便保證了核心資料在公共通信網中傳輸的安全性和可靠性。

  也可以通過定期在通信網絡的源端和目的端同時改用新的Key,便能更進一步提高資料的保密性。

利用DES算法加密的步驟

  (1)生成一個安全密鑰。在加密或解密任何資料之前需要有一個密鑰。密鑰是随同被加密的應用程式一起釋出的一段資料,密鑰代碼如下所示。

  【生成一個密鑰代碼】

利用DES加密算法保護Java源代碼

//  生成一個可信任的随機數源

利用DES加密算法保護Java源代碼

Secure Random sr  =   new  SecureRandom();

利用DES加密算法保護Java源代碼

//  為我們選擇的DES算法生成一個KeyGenerator對象

利用DES加密算法保護Java源代碼

KeyGenerator kg  =  KeyGenerator.getInstance ( " DES "  );

利用DES加密算法保護Java源代碼

Kg.init (sr);

利用DES加密算法保護Java源代碼

//  生成密鑰

利用DES加密算法保護Java源代碼

Secret Key key  =  kg.generateKey();

利用DES加密算法保護Java源代碼

//  将密鑰資料儲存為檔案供以後使用,其中key Filename為儲存的檔案名

利用DES加密算法保護Java源代碼

Util.writeFile (key Filename, key.getEncoded () );

2)加密資料。得到密鑰之後,接下來就可以用它加密資料。如下所示。

  【用密鑰加密原始資料】

利用DES加密算法保護Java源代碼

//  産生一個可信任的随機數源

利用DES加密算法保護Java源代碼

SecureRandom sr  =   new  SecureRandom();

利用DES加密算法保護Java源代碼

// 從密鑰檔案key Filename中得到密鑰資料

利用DES加密算法保護Java源代碼

Byte rawKeyData []  =  Util.readFile (key Filename);

利用DES加密算法保護Java源代碼

//  從原始密鑰資料建立DESKeySpec對象

利用DES加密算法保護Java源代碼

DESKeySpec dks  =   new  DESKeySpec (rawKeyData);

利用DES加密算法保護Java源代碼

//  建立一個密鑰工廠,然後用它把DESKeySpec轉換成Secret Key對象

利用DES加密算法保護Java源代碼

SecretKeyFactory key Factory  =  SecretKeyFactory.getInstance( " DES "  );

利用DES加密算法保護Java源代碼

Secret Key key  =  keyFactory.generateSecret( dks );

利用DES加密算法保護Java源代碼

//  Cipher對象實際完成加密操作

利用DES加密算法保護Java源代碼

Cipher cipher  =  Cipher.getInstance(  " DES "  );

利用DES加密算法保護Java源代碼

//  用密鑰初始化Cipher對象

利用DES加密算法保護Java源代碼

cipher.init( Cipher.ENCRYPT_MODE, key, sr );

利用DES加密算法保護Java源代碼

//  通過讀類檔案擷取需要加密的資料

利用DES加密算法保護Java源代碼

Byte data []  =  Util.readFile (filename);

利用DES加密算法保護Java源代碼

//  執行加密操作

利用DES加密算法保護Java源代碼

Byte encryptedClassData []  =  cipher.doFinal(data );

利用DES加密算法保護Java源代碼

//  儲存加密後的檔案,覆寫原有的類檔案。 

利用DES加密算法保護Java源代碼

Util.writeFile( filename, encryptedClassData ); (3)解密資料。運作經過加密的程式時,ClassLoader分析并解密類檔案。操作步驟如下所示。

  【用密鑰解密資料】

利用DES加密算法保護Java源代碼

//  生成一個可信任的随機數源

利用DES加密算法保護Java源代碼

SecureRandom sr  =   new  SecureRandom();

利用DES加密算法保護Java源代碼

//  從密鑰檔案中擷取原始密鑰資料

利用DES加密算法保護Java源代碼

Byte rawKeyData[]  =  Util.readFile( keyFilename );

利用DES加密算法保護Java源代碼

//  建立一個DESKeySpec對象

利用DES加密算法保護Java源代碼

DESKeySpec dks  =   new  DESKeySpec (rawKeyData);

利用DES加密算法保護Java源代碼

//  建立一個密鑰工廠,然後用它把DESKeySpec對象轉換成Secret Key對象 

利用DES加密算法保護Java源代碼

SecretKeyFactory key Factory  =  SecretKeyFactory.getInstance(  " DES "  );

利用DES加密算法保護Java源代碼

SecretKey key  =  keyFactory.generateSecret( dks );

利用DES加密算法保護Java源代碼

//  Cipher對象實際完成解密操作

利用DES加密算法保護Java源代碼

Cipher cipher  =  Cipher.getInstance(  " DES "  );

利用DES加密算法保護Java源代碼

//  用密鑰初始化Cipher對象

利用DES加密算法保護Java源代碼

Cipher.init( Cipher.DECRYPT_MODE, key, sr );

利用DES加密算法保護Java源代碼

//  獲得經過加密的資料

利用DES加密算法保護Java源代碼

Byte encrypted Data []  =  Util.readFile (Filename);

利用DES加密算法保護Java源代碼

// 執行解密操作

利用DES加密算法保護Java源代碼

Byte decryptedData []  =  cipher.doFinal( encryptedData );

利用DES加密算法保護Java源代碼

//  然後将解密後的資料轉化成原來的類檔案。 将上述代碼與自定義的類裝載器結合就可以做到邊解密邊運作,進而起到保護源代碼的作用。

   結束語

  加密/解密是資料傳輸中保證資料安全性和完整性的常用方法,Java語言因其平台無關性,在Internet上的應用非常之廣泛。使用DES算法加密Java源碼在一定程度上能保護軟體的産權。