<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    倉藍

    日記本

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      23 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks

        加密利用:DES加密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)生成一個安全密鑰。在加密或解密任何數據之前需要有一個密鑰。密鑰是隨同被加密的應用程序一起發布的一段數據,密鑰代碼如下所示。

      【生成一個密鑰代碼】

    view plaincopy to clipboardprint?
    // 生成一個可信任的隨機數源
    SecureRandom sr = new SecureRandom();
    // 為我們選擇的DES算法生成一個KeyGenerator對象
    KeyGenerator kg = KeyGenerator.getInstance ("DES" );
    Kg.init (sr);
    // 生成密鑰
    Secret Key key = kg.generateKey();
    // 將密鑰數據保存為文件供以后使用,其中key Filename為保存的文件名
    Util.writeFile (key Filename, key.getEncoded () );
    // 生成一個可信任的隨機數源
    SecureRandom sr = new SecureRandom();
    // 為我們選擇的DES算法生成一個KeyGenerator對象
    KeyGenerator kg = KeyGenerator.getInstance ("DES" );
    Kg.init (sr);
    // 生成密鑰
    Secret Key key = kg.generateKey();
    // 將密鑰數據保存為文件供以后使用,其中key Filename為保存的文件名
    Util.writeFile (key Filename, key.getEncoded () );

      (2)加密數據。得到密鑰之后,接下來就可以用它加密數據。如下所示。

      【用密鑰加密原始數據】

     

    view plaincopy to clipboardprint?
    // 產生一個可信任的隨機數源
    SecureRandom sr = new SecureRandom();
    //從密鑰文件key Filename中得到密鑰數據
    Byte rawKeyData = Util.readFile (key Filename);
    // 從原始密鑰數據創建DESKeySpec對象
    DESKeySpec dks = new DESKeySpec (rawKeyData);
    // 創建一個密鑰工廠,然后用它把DESKeySpec轉換成Secret Key對象
    SecretKeyFactory key Factory = SecretKeyFactory.getInstance("DES" );
    Secret Key key = keyFactory.generateSecret( dks );
    // Cipher對象實際完成加密操作
    Cipher cipher = Cipher.getInstance( "DES" );
    // 用密鑰初始化Cipher對象
    cipher.init( Cipher.ENCRYPT_MODE, key, sr );
    // 通過讀類文件獲取需要加密的數據
    Byte data = Util.readFile (filename);
    // 執行加密操作
    Byte encryptedClassData = cipher.doFinal(data );
    // 保存加密后的文件,覆蓋原有的類文件。
    Util.writeFile( filename, encryptedClassData );
    // 產生一個可信任的隨機數源
    SecureRandom sr = new SecureRandom();
    //從密鑰文件key Filename中得到密鑰數據
    Byte rawKeyData = Util.readFile (key Filename);
    // 從原始密鑰數據創建DESKeySpec對象
    DESKeySpec dks = new DESKeySpec (rawKeyData);
    // 創建一個密鑰工廠,然后用它把DESKeySpec轉換成Secret Key對象
    SecretKeyFactory key Factory = SecretKeyFactory.getInstance("DES" );
    Secret Key key = keyFactory.generateSecret( dks );
    // Cipher對象實際完成加密操作
    Cipher cipher = Cipher.getInstance( "DES" );
    // 用密鑰初始化Cipher對象
    cipher.init( Cipher.ENCRYPT_MODE, key, sr );
    // 通過讀類文件獲取需要加密的數據
    Byte data = Util.readFile (filename);
    // 執行加密操作
    Byte encryptedClassData = cipher.doFinal(data );
    // 保存加密后的文件,覆蓋原有的類文件。
    Util.writeFile( filename, encryptedClassData );

     

      (3)解密數據。運行經過加密的程序時,ClassLoader分析并解密類文件。操作步驟如下所示。

      【用密鑰解密數據】

    view plaincopy to clipboardprint?
    // 生成一個可信任的隨機數源
    SecureRandom sr = new SecureRandom();
    // 從密鑰文件中獲取原始密鑰數據
    Byte rawKeyData = Util.readFile( keyFilename );
    // 創建一個DESKeySpec對象
    DESKeySpec dks = new DESKeySpec (rawKeyData);
    // 創建一個密鑰工廠,然后用它把DESKeySpec對象轉換成Secret Key對象
    SecretKeyFactory key Factory = SecretKeyFactory.getInstance( "DES" );
    SecretKey key = keyFactory.generateSecret( dks );
    // Cipher對象實際完成解密操作
    Cipher cipher = Cipher.getInstance( "DES" );
    // 用密鑰初始化Cipher對象
    Cipher.init( Cipher.DECRYPT_MODE, key, sr );
    // 獲得經過加密的數據
    Byte encrypted Data = Util.readFile (Filename);
    //執行解密操作
    Byte decryptedData = cipher.doFinal( encryptedData );
    // 然后將解密后的數據轉化成原來的類文件。
    // 生成一個可信任的隨機數源
    SecureRandom sr = new SecureRandom();
    // 從密鑰文件中獲取原始密鑰數據
    Byte rawKeyData = Util.readFile( keyFilename );
    // 創建一個DESKeySpec對象
    DESKeySpec dks = new DESKeySpec (rawKeyData);
    // 創建一個密鑰工廠,然后用它把DESKeySpec對象轉換成Secret Key對象
    SecretKeyFactory key Factory = SecretKeyFactory.getInstance( "DES" );
    SecretKey key = keyFactory.generateSecret( dks );
    // Cipher對象實際完成解密操作
    Cipher cipher = Cipher.getInstance( "DES" );
    // 用密鑰初始化Cipher對象
    Cipher.init( Cipher.DECRYPT_MODE, key, sr );
    // 獲得經過加密的數據
    Byte encrypted Data = Util.readFile (Filename);
    //執行解密操作
    Byte decryptedData = cipher.doFinal( encryptedData );
    // 然后將解密后的數據轉化成原來的類文件。

      將上述代碼與自定義的類裝載器結合就可以做到邊解密邊運行,從而起到保護源代碼的作用。

      結束語

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

     

    posted on 2012-02-09 13:34 cangshi 閱讀(507) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 成人免费午间影院在线观看| 好湿好大好紧好爽免费视频| 亚洲免费观看在线视频| 亚洲av永久无码精品表情包| 伊人久久大香线蕉亚洲五月天| 亚洲av再在线观看| 亚洲精品成人久久久| 免费一级大黄特色大片| 亚洲第一页日韩专区| 亚洲国产精品人人做人人爱| 亚洲精品国产综合久久一线| 亚洲黄黄黄网站在线观看| 国外亚洲成AV人片在线观看| 亚洲日韩中文字幕在线播放| 久久国产亚洲观看| 亚洲自偷自偷精品| 亚洲中字慕日产2021| 亚洲国产日韩精品| 春暖花开亚洲性无区一区二区| 国产精品亚洲一区二区无码| 香蕉国产在线观看免费| 狠狠躁狠狠爱免费视频无码| 免费一级不卡毛片| 99久久久国产精品免费牛牛四川| h在线观看视频免费网站| 黄色片在线免费观看| 在线观看免费为成年视频| 国产真人无遮挡作爱免费视频| 一区二区三区亚洲视频| 国产亚洲精品国看不卡| 亚洲成人在线电影| 亚洲综合小说久久另类区| 中文字幕亚洲男人的天堂网络| 亚洲精品无码av片| 一个人看的免费高清视频日本| a在线免费观看视频| 999久久久免费精品国产| 永久免费av无码网站大全| 亚洲人成电影网站国产精品| 亚洲av激情无码专区在线播放| 亚洲一区二区久久|