您的位置:首页 > 编程语言 > Java开发

Java加密技术(三)——PBE算法

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

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


 

通过java代码实现如下:Coder类见 Java加密技术(一) 

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安全编码组件 

 *  

 * @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);  

  

    }  

}  

再给出一个测试类: 

Java代码  


import static org.junit.Assert.*;  

  

import org.junit.Test;  

  

/** 

 *  

 * @author 梁栋 

 * @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);  

    }  

  

}  

控制台输出: 

Console代码  


原文: abc  

密码: efg  

加密后: iCZ0uRtaAhE=  

  

解密后: abc  

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

相关链接: 
Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC 
Java加密技术(二)——对称加密DES&AES 
Java加密技术(三)——PBE算法 
Java加密技术(四)——非对称加密算法RSA 
Java加密技术(五)——非对称加密算法的由来DH 
Java加密技术(六)——数字签名算法DSA 
Java加密技术(七)——非对称加密算法最高ECC 
Java加密技术(八)——数字证书 
Java加密技术(九)——初探SSL 
Java加密技术(十)——单向认证 
Java加密技术(十一)——双向认证 
Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: