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

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

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

    隨筆 - 64  文章 - 9  trackbacks - 0
    <2009年12月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(6)

    我參與的團隊

    隨筆分類(88)

    隨筆檔案(92)

    文章分類(142)

    文章檔案(182)

    天基成員

    學習園

    我的海角

    搜索

    •  

    積分與排名

    • 積分 - 182482
    • 排名 - 319

    最新評論


        除了DES,我們還知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多種對稱加密方式,其實現方式大同小異,這里介紹對稱加密的另一個算法——PBE

        PBE

        PBE——Password-based encryption(基于密碼加密)。其特點在于口令由用戶自己掌管,不借助任何物理媒體;采用隨機數(這里我們叫做鹽)雜湊多重加密等方法保證數據的安全性。是一種簡便的加密方式。

        通過java代碼實現如下:

    import java.security.Key;   
    import java.util.Random;   
      
    import javax.crypto.Cipher;   
    import javax.crypto.SecretKey;   
    import javax.crypto.SecretKeyFactory;   
    import javax.crypto.spec.PBEKeySpec;   
    import javax.crypto.spec.PBEParameterSpec;   
      
    /**  
     * PBE安全編碼組件 
    http://www.bt285.cn   http://www.5a520.cn 
     *   
     * 
    @author 梁棟  
     * 
    @version 1.0  
     * 
    @since 1.0  
     
    */
      
    public abstract class PBECoder extends Coder {   
        
    /**  
         * 支持以下任意一種算法  
         *   
         * <pre>  
         * PBEWithMD5AndDES   
         * PBEWithMD5AndTripleDES   
         * PBEWithSHA1AndDESede  
         * PBEWithSHA1AndRC2_40  
         * </pre>  
         
    */
      
        
    public static final String ALGORITHM = "PBEWITHMD5andDES";   
      
        
    /**  
         * 鹽初始化  
         *   
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static byte[] initSalt() throws Exception {   
            
    byte[] salt = new byte[8];   
            Random random 
    = new Random();   
            random.nextBytes(salt);   
            
    return salt;   
        }
       
      
        
    /**  
         * 轉換密鑰<br>  
         *   
         * 
    @param password  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    private static Key toKey(String password) throws Exception {   
            PBEKeySpec keySpec 
    = new PBEKeySpec(password.toCharArray());   
            SecretKeyFactory keyFactory 
    = SecretKeyFactory.getInstance(ALGORITHM);   
            SecretKey secretKey 
    = keyFactory.generateSecret(keySpec);   
      
            
    return secretKey;   
        }
       
      
        
    /**  
         * 加密  
         *   
         * 
    @param data  
         *            數據  
         * 
    @param password  
         *            密碼  
         * 
    @param salt  
         *            鹽  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static byte[] encrypt(byte[] data, String password, byte[] salt)   
                
    throws Exception {   
      
            Key key 
    = toKey(password);   
      
            PBEParameterSpec paramSpec 
    = new PBEParameterSpec(salt, 100);   
            Cipher cipher 
    = Cipher.getInstance(ALGORITHM);   
            cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);   
      
            
    return cipher.doFinal(data);   
      
        }
       
      
        
    /**  
         * 解密  
         *   
         * 
    @param data  
         *            數據  
         * 
    @param password  
         *            密碼  
         * 
    @param salt  
         *            鹽  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static byte[] decrypt(byte[] data, String password, byte[] salt)   
                
    throws Exception {   
      
            Key key 
    = toKey(password);   
      
            PBEParameterSpec paramSpec 
    = new PBEParameterSpec(salt, 100);   
            Cipher cipher 
    = Cipher.getInstance(ALGORITHM);   
            cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);   
      
            
    return cipher.doFinal(data);   
      
        }
       
    }
     

        再給出一個測試類:

    import static org.junit.Assert.*;   
      
    import org.junit.Test;   
      
    /**  
     *   
     * 
    @author 梁棟  http://www.5a520.cn http://www.feng123.com
     * 
    @version 1.0  
     * 
    @since 1.0  
     
    */
      
    public class PBECoderTest {   
      
        @Test  
        
    public void test() throws Exception {   
            String inputStr 
    = "abc";   
            System.err.println(
    "原文: " + inputStr);   
            
    byte[] input = inputStr.getBytes();   
      
            String pwd 
    = "efg";   
            System.err.println(
    "密碼: " + pwd);   
      
            
    byte[] salt = PBECoder.initSalt();   
      
            
    byte[] data = PBECoder.encrypt(input, pwd, salt);   
      
            System.err.println(
    "加密后: " + PBECoder.encryptBASE64(data));   
      
            
    byte[] output = PBECoder.decrypt(data, pwd, salt);   
            String outputStr 
    = new String(output);   
      
            System.err.println(
    "解密后: " + outputStr);   
            assertEquals(inputStr, outputStr);   
        }
       
      
    }

        控制臺輸出:

        原文: abc

        密碼: efg

        加密后: iCZ0uRtaAhE=

        解密后: abc

    posted on 2009-12-19 10:20 鵬凌 閱讀(317) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 国产一区二区视频免费| 可以免费观看的国产视频| 亚洲熟女精品中文字幕| wwwxxx亚洲| 亚洲91精品麻豆国产系列在线| 亚洲欧洲春色校园另类小说| 久久综合亚洲鲁鲁五月天| 亚洲图片中文字幕| 亚洲av日韩av无码av| 亚洲kkk4444在线观看| 亚洲中文字幕无码中文| 亚洲av无码一区二区三区人妖| 国产成人精品久久亚洲高清不卡| 亚洲AV无码国产一区二区三区| 粉色视频在线观看www免费| 深夜免费在线视频| 两个人看的www视频免费完整版| 国内精品久久久久影院免费 | 亚洲国产精品久久久天堂| 亚洲av无码一区二区三区不卡| 亚洲va久久久噜噜噜久久男同| 久久精品亚洲中文字幕无码麻豆| 亚洲成人黄色在线| 亚洲一区精彩视频| 老司机午夜性生免费福利 | 亚洲欧洲日本在线观看| 国产精品国产亚洲区艳妇糸列短篇| 在线播放免费人成视频网站| 中文字幕久无码免费久久| 日韩免费无码一区二区三区| 无码中文在线二区免费| 亚洲?V乱码久久精品蜜桃| 亚洲人精品午夜射精日韩 | 亚洲成av人片在线观看天堂无码| 中文亚洲AV片不卡在线观看| 青青草原精品国产亚洲av| 亚洲精品无码中文久久字幕| 一级特黄a免费大片| 97公开免费视频| 日韩免费毛片视频| 亚洲国产精华液网站w|