<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)

    天基成員

    學習園

    我的海角

    搜索

    •  

    積分與排名

    • 積分 - 182443
    • 排名 - 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
    主站蜘蛛池模板: 亚洲Av无码国产一区二区 | 无码日韩人妻AV一区免费l| 亚洲乱色熟女一区二区三区蜜臀| 亚洲人成网站日本片| 久久乐国产综合亚洲精品| 亚洲中文字幕日本无线码| 在线观看日本亚洲一区| 亚洲色www永久网站| 亚洲AV无码成人精品区狼人影院| 亚洲第一成年免费网站| 国产亚洲视频在线观看网址| 真正全免费视频a毛片| 牛牛在线精品观看免费正| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 色婷婷精品免费视频| 色多多免费视频观看区一区| 一级成人a免费视频| 国产中文字幕在线免费观看| 亚洲欧洲免费视频| 91成年人免费视频| 狼友av永久网站免费观看| 亚洲国产av无码精品| 亚洲色欲久久久综合网东京热| 亚洲精品福利视频| 亚洲伊人久久精品| 国产精品亚洲综合天堂夜夜| 一级做α爱过程免费视频| 久久国产精品一区免费下载| 免费人成网站在线观看10分钟| 女人18一级毛片免费观看| 无码专区一va亚洲v专区在线 | 免费人成视频x8x8入口| 国产成人精品日本亚洲| 亚洲成a人片在线看| 特黄特色大片免费| 久久免费精品一区二区| 欧美在线看片A免费观看| 亚洲AV无码成H人在线观看| 亚洲国产成人久久综合一 | 亚洲综合无码一区二区痴汉| 一级中文字幕免费乱码专区|