Java加密技术篇(三)对称加密算法PBE

除了DES,我们还知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法——PBE 

PBE 
    PBE——Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。是一种简便的加密方式。 

Java加密技术篇(三)对称加密算法PBE_第1张图片

通过java代码实现如下:

[java]  view plain copy print ?
  1. import java.security.Key;  
  2. import java.util.Arrays;  
  3. import java.util.Random;  
  4.   
  5. import javax.crypto.Cipher;  
  6. import javax.crypto.SecretKey;  
  7. import javax.crypto.SecretKeyFactory;  
  8. import javax.crypto.spec.PBEKeySpec;  
  9. import javax.crypto.spec.PBEParameterSpec;  
  10.   
  11. import org.apache.commons.codec.binary.Hex;  
  12.   
  13. /** 对称加密PBE算法 
  14.  * @Title: PBEUtil.java  
  15.  * @Package com.somnus.cipher  
  16.  * @Description: TODO 
  17.  * @author Somnus 
  18.  * @date 2015年6月6日 上午8:57:52  
  19.  * @version V1.0  
  20.  */  
  21. public class PBEUtil {  
  22.    /**  
  23.     * 支持以下任意一种算法  
  24.     *   
  25.     * <pre>  
  26.     * PBEWithMD5AndDES   
  27.     * PBEWithMD5AndTripleDES   
  28.     * PBEWithSHA1AndDESede  
  29.     * PBEWithSHA1AndRC2_40  
  30.     * </pre>  
  31.     */    
  32.    public static final String ALGORITHM = "PBEWITHMD5andDES";    
  33.    
  34.    /**  
  35.     * 盐初始化  
  36.     *   
  37.     * @return  
  38.     * @throws Exception  
  39.     */    
  40.    public static byte[] initSalt() throws Exception {    
  41.        byte[] salt = new byte[8];    
  42.        Random random = new Random();    
  43.        random.nextBytes(salt);    
  44.        return salt;    
  45.    }    
  46.    
  47.    /**  
  48.     * 转换密钥<br>  
  49.     *   
  50.     * @param password  
  51.     * @return  
  52.     * @throws Exception  
  53.     */    
  54.    private static Key keyGenerator(String password) throws Exception {    
  55.        PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());    
  56.        //创建一个密匙工厂,然后用它把PBEKeySpec转换成  
  57.        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);    
  58.        SecretKey secretKey = keyFactory.generateSecret(keySpec);    
  59.        return secretKey;    
  60.    }    
  61.    
  62.    /**  
  63.     * 加密  
  64.     *   
  65.     * @param data  
  66.     *            数据  
  67.     * @param password  
  68.     *            密码  
  69.     * @param salt  
  70.     *            盐  
  71.     * @return  
  72.     * @throws Exception  
  73.     */    
  74.    public static String encrypt(String data, String password, byte[] salt) throws Exception {    
  75.        Key key = keyGenerator(password);    
  76.        PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);   
  77.        // 实例化Cipher对象,它用于完成实际的加密操作  
  78.        Cipher cipher = Cipher.getInstance(ALGORITHM);   
  79.        // 初始化Cipher对象,设置为加密模式  
  80.        cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);  
  81.        byte[] buff = cipher.doFinal(data.getBytes());  
  82.        System.out.println(Arrays.toString(buff));  
  83.        // 执行加密操作。加密后的结果通常都会用Base64编码进行传输   
  84.        return Hex.encodeHexString(buff);  
  85.    }    
  86.    
  87.    /**  
  88.     * 解密  
  89.     *   
  90.     * @param data  
  91.     *            数据  
  92.     * @param password  
  93.     *            密码  
  94.     * @param salt  
  95.     *            盐  
  96.     * @return  
  97.     * @throws Exception  
  98.     */    
  99.    public static String decrypt(String data, String password, byte[] salt) throws Exception {    
  100.        Key key = keyGenerator(password);    
  101.        PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);   
  102.        // 实例化Cipher对象,它用于完成实际的解密操作  
  103.        Cipher cipher = Cipher.getInstance(ALGORITHM);  
  104.        //初始化Cipher对象,设置为解密模式  
  105.        cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);  
  106.        // 执行解密操作  
  107.        byte[] buff = cipher.doFinal(Hex.decodeHex(data.toCharArray()));  
  108.        System.out.println(Arrays.toString(buff));  
  109.        return new String(buff);  
  110.    }  
  111.      
  112.    public static void main(String[] args) throws Exception {  
  113.        String inputStr = "Somnus";    
  114.        System.out.println("原文: " + inputStr);    
  115.    
  116.        String pwd = "efg";    
  117.        System.out.println("密码: " + pwd);    
  118.    
  119.        byte[] salt = initSalt();    
  120.    
  121.        String encryptData = encrypt(inputStr, pwd, salt);    
  122.        System.out.println("加密后: " + encryptData);    
  123.    
  124.        String decryptData = decrypt(encryptData, pwd, salt);    
  125.        System.out.println("解密后: " + decryptData);    
  126.    }  
  127. }  

控制台输出: 

[java]  view plain copy print ?
  1. 原文: Somnus  
  2. 密码: efg  
  3. [45, -9111619, -10595, -531]  
  4. 加密后: 2da57413975ffb1f  
  5. [83111109110117115]  
  6. 解密后: Somnus  

    后续我们会介绍非对称加密算法,如RSA、DSA、DH、ECC等。

你可能感兴趣的:(java,加密,算法)