當柳上原的風吹向天際的時候...

          真正的快樂來源于創造

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
          按:以下內容涉及傳統的AES加密解密方法,熟悉它的請不要浪費寶貴時間。

          如果用Base64進行加密解密是不安全的,因為這種方式的方法和密鑰(字符映射表)都是公開的,對此熟悉的人如果看到一串字符后面帶一些等號,很容易想到是Base64進行加密。因此,我們必須采取一些更安全的加密解密方式,AES就是其一。

          在使用AES進行加密解密之前,需要到Sun的官方網站上下載一個權限文件:jce_policy,目前它的下載網址是:http://www.oracle.com/technetwork/java/javase/downloads/index.html ,找到“Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6”后點擊按鈕下載,得到下載文件后解開,然后將其中的local_policy.jar和US_export_policy.jar拷貝到你的JAVA_HOME\jre\lib\security和JRE_HOME\lib\security兩個目錄下。如果沒有這一步驟,進行加密解密的時候會產生java.security.InvalidKeyException異常。

          接下來就是代碼了:
          package com.heyang.util;

          import java.security.Key;

          import javax.crypto.Cipher;
          import javax.crypto.KeyGenerator;
          import javax.crypto.SecretKey;
          import javax.crypto.spec.SecretKeySpec;

          import org.apache.commons.codec.binary.Hex;


          /**
           * AES算法加密解密實用工具類
           * 說明:
           * 作者:何楊(heyang78@gmail.com)
           * 創建時間:2010-11-29 上午11:19:11
           * 修改時間:2010-11-29 上午11:19:11
           
          */
          public class AESSecurityUtil{
              
          // 加密方法
              private static final String Algorithm="AES";
              
              
          // 進行加密解密的密鑰
              private static final String Key="03a53dfc257fe1b0996626a5e2e2210692936bd16cc60f37211cbeef9353e268";
              
              
          /**
               * 取得解密后的字符串
               * 
               * 說明:
               * 
          @param encryptArr
               * 
          @return
               * 創建時間:2010-12-1 下午03:33:31
               
          */
              
          public static String getDecryptString(byte[] encryptArr){
                  
          try{
                      Cipher cp
          =Cipher.getInstance(Algorithm);
                      cp.init(Cipher.DECRYPT_MODE, getKey());
                      
          byte[] arr=cp.doFinal(encryptArr);
                      
                      
          return new String(arr);
                  }
                  
          catch(Exception ex){
                      System.out.println(
          "無法進行解密,原因是"+ex.getMessage());
                      
          return null;
                  }
              }
              
              
          /**
               * 取得加密后的字節數組
               * 
               * 說明:
               * 
          @param originalString
               * 
          @return
               * 創建時間:2010-12-1 下午03:33:49
               
          */
              
          public static byte[] getEncryptByteArray(String originalString){
                  
          try{
                      Cipher cp
          =Cipher.getInstance(Algorithm);
                      cp.init(Cipher.ENCRYPT_MODE, getKey());
                      
          return cp.doFinal(originalString.getBytes());
                  }
                  
          catch(Exception ex){
                      System.out.println(
          "無法進行加密,原因是"+ex.getMessage());
                      
          return null;
                  }
              }
              
              
          /**
               * 取得密鑰數組
               * 
               * 說明:
               * 
          @return
               * 
          @throws Exception
               * 創建時間:2010-12-1 下午03:31:08
               
          */
              
          private static byte[] initKey() throws Exception{
                  KeyGenerator kg
          =KeyGenerator.getInstance(Algorithm);
                  kg.init(
          256);
                  
                  SecretKey sk
          =kg.generateKey();
                  
                  
          return sk.getEncoded();
              }
              
              
          /**
               * 取得字符串形式的密鑰
               * 
               * 說明:
               * 
          @return
               * 
          @throws Exception
               * 創建時間:2010-12-1 下午03:31:36
               
          */
              
          public static String initKeyHex() throws Exception{
                  
          return new String(Hex.encodeHex(initKey()));
              }
              
              
          /**
               * 取得密鑰
               * 
               * 說明:
               * 
          @return
               * 
          @throws Exception
               * 創建時間:2010-12-1 下午03:33:17
               
          */
              
          private static Key getKey() throws Exception{
                  
          byte[] arr=Hex.decodeHex(Key.toCharArray());
                  
                  
          return new SecretKeySpec(arr,Algorithm);
              }
              
              
          public static void main(String[] args)  throws Exception{
                  
          //System.out.println(initKeyHex());
                  
                  String str
          ="Hello!World 你好!世界。";
                  
                  
          byte[] arr=AESSecurityUtil.getEncryptByteArray(str);
                  System.out.print(
          "AES加密后的結果為:");
                  
          for(byte b:arr){
                      System.out.print(b);
                  }
                  System.out.println();
                  
                  String str1
          =AESSecurityUtil.getDecryptString(arr);
                  System.out.println(
          "AES解密后的字符串為:"+str1);
              }
          }
          測試輸出如下:
          AES加密后的結果為:833522115-115-6373-10-940-110-93-87736-561-1083427-99-6-6218-4104108-1031216395-92
          AES解密后的字符串為:Hello
          !World 你好!世界。

          上面代碼中值得注意的是,加密后的結果不能直接變成String形式,因為這會導致解密的不可行(解密拋出javax.crypto.IllegalBlockSizeException異常)。如果要使用其他的Key,可以單獨執行一下initKeyHex()函數,將輸出結果置換掉靜態變量Key的值即可。

          這樣,在AES的幫助下,我們實現了比較安全的加密,破解者知道方法AES,但不知道密鑰的話,解密會很困難。但是,話說回來,java程序被反編譯很容易,別有用心的人還是可以看到密鑰,但我們還是可以用公鑰加密私鑰解密的方式來對付,這個以后有空再說。

          好了,感謝您看到這里。
          posted on 2010-12-01 16:10 何楊 閱讀(4060) 評論(1)  編輯  收藏

          Feedback

          # re: AES加密解密工具類 2013-10-14 10:40 lvzhenzhuo
          mt/mk17ImQ7i0teWAZWufikes72IfGrEBFu97AYsB+E=  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 霍州市| 新竹县| 吐鲁番市| 赣州市| 手游| 洪洞县| 邳州市| 金山区| 繁昌县| 新巴尔虎左旗| 海晏县| 密云县| 巧家县| 溆浦县| 新巴尔虎右旗| 从化市| 吉林市| 昆明市| 太湖县| 沙河市| 沙坪坝区| 北安市| 西华县| 射阳县| 临颍县| 和政县| 麻阳| 杨浦区| 乐陵市| 兴海县| 甘肃省| 宁蒗| 喀喇| 台中县| 荃湾区| 中宁县| 上林县| 亳州市| 孙吴县| 高雄县| 修文县|