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

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

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

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

    真正的快樂來源于創造

      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 何楊 閱讀(4059) 評論(1)  編輯  收藏

    Feedback

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


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


    網站導航:
     
    主站蜘蛛池模板: 久久国产色AV免费观看| 一级做a爰全过程免费视频毛片| 国内精品一级毛片免费看| 亚洲VA综合VA国产产VA中| 在线观看亚洲免费视频| 免费人成视频在线观看视频| 亚洲AV无码片一区二区三区 | 午夜电影免费观看| 亚洲最大的成人网| 日韩免费高清视频网站| 国产一区二区三区亚洲综合| 亚洲 另类 无码 在线| 黄床大片免费30分钟国产精品 | 57pao国产成永久免费视频| 久久精品国产亚洲麻豆| 99热在线免费观看| 亚洲午夜精品在线| 青青青青青青久久久免费观看| 日韩亚洲综合精品国产| 亚洲成a人片在线播放| 香蕉免费一级视频在线观看| 亚洲精品国产精品乱码在线观看 | 亚洲av色影在线| 亚洲一区二区三区免费在线观看| 亚洲一级在线观看| 免费在线黄色网址| a级毛片免费全部播放| 亚洲精品国产啊女成拍色拍| 成全影视免费观看大全二| 无码毛片一区二区三区视频免费播放 | 亚洲丰满熟女一区二区哦| 免费看又爽又黄禁片视频1000| 国产精品亚洲精品日韩动图| 亚洲男人av香蕉爽爽爽爽| 久久青草精品38国产免费| 亚洲日本国产综合高清| 亚洲一区二区三区偷拍女厕 | 亚洲美女免费视频| 日韩在线视频免费看| 国产亚洲精品免费视频播放| 亚洲AV综合色区无码二区爱AV|