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

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

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

    當柳上原的風(fēng)吹向天際的時候...

    真正的快樂來源于創(chuàng)造

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

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

    在使用AES進行加密解密之前,需要到Sun的官方網(wǎng)站上下載一個權(quán)限文件:jce_policy,目前它的下載網(wǎng)址是: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兩個目錄下。如果沒有這一步驟,進行加密解密的時候會產(chǎn)生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)
     * 創(chuàng)建時間: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
         * 創(chuàng)建時間: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;
            }
        }
        
        
    /**
         * 取得加密后的字節(jié)數(shù)組
         * 
         * 說明:
         * 
    @param originalString
         * 
    @return
         * 創(chuàng)建時間: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;
            }
        }
        
        
    /**
         * 取得密鑰數(shù)組
         * 
         * 說明:
         * 
    @return
         * 
    @throws Exception
         * 創(chuàng)建時間: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
         * 創(chuàng)建時間:2010-12-1 下午03:31:36
         
    */
        
    public static String initKeyHex() throws Exception{
            
    return new String(Hex.encodeHex(initKey()));
        }
        
        
    /**
         * 取得密鑰
         * 
         * 說明:
         * 
    @return
         * 
    @throws Exception
         * 創(chuàng)建時間: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加密后的結(jié)果為:");
            
    for(byte b:arr){
                System.out.print(b);
            }
            System.out.println();
            
            String str1
    =AESSecurityUtil.getDecryptString(arr);
            System.out.println(
    "AES解密后的字符串為:"+str1);
        }
    }
    測試輸出如下:
    AES加密后的結(jié)果為:833522115-115-6373-10-940-110-93-87736-561-1083427-99-6-6218-4104108-1031216395-92
    AES解密后的字符串為:Hello
    !World 你好!世界。

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

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

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

    Feedback

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


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 中国china体内裑精亚洲日本| 亚洲人成色77777在线观看| 16女性下面扒开无遮挡免费| 亚洲国产成人精品无码区在线秒播 | 可以免费观看一级毛片黄a| 亚洲最新永久在线观看| 久久经典免费视频| 五月天婷婷免费视频| 亚洲欧洲日产v特级毛片| 免费a级黄色毛片| 中文字幕亚洲免费无线观看日本 | 亚洲色中文字幕在线播放| 亚洲一本大道无码av天堂| 18未年禁止免费观看| 免费的黄网站男人的天堂| 亚洲精品无码久久毛片波多野吉衣| 国产在线观看免费不卡| 无码AV片在线观看免费| 看全免费的一级毛片| 亚洲视频在线观看网址| 中文字幕亚洲第一| 免费黄色网址入口| 精品一区二区三区免费毛片爱| 香蕉视频免费在线播放| 亚洲入口无毒网址你懂的| 亚洲精品午夜国产VA久久成人| 成年女人免费视频播放体验区| 野花香高清视频在线观看免费 | 亚洲AV中文无码乱人伦下载| 免费观看午夜在线欧差毛片| 91短视频免费在线观看| 91免费在线视频| 免费无码AV一区二区| 色天使亚洲综合在线观看| 亚洲狠狠久久综合一区77777| 亚洲一本大道无码av天堂| 国产又大又黑又粗免费视频| 无码一区二区三区AV免费| 91麻豆国产免费观看| 99视频在线观看免费| 深夜福利在线视频免费|