博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java加密算法(三)——PBE算法
阅读量:6081 次
发布时间:2019-06-20

本文共 3010 字,大约阅读时间需要 10 分钟。

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

PBE 
    PBE——Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。是一种简便的加密方式。 
 
通过java代码实现如下:Coder类见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安全编码组件 *  */public abstract class PBECoder extends Coder {	/**	 * 支持以下任意一种算法	 * 	 * 
	 * PBEWithMD5AndDES 	 * PBEWithMD5AndTripleDES 	 * PBEWithSHA1AndDESede	 * PBEWithSHA1AndRC2_40	 * 
*/ 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; } /** * 转换密钥
* * @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;/** *  * PBE测试 * */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

  来源于:http://snowolf.iteye.com/blog

转载于:https://www.cnblogs.com/zengsong-restService/archive/2013/03/25/2981003.html

你可能感兴趣的文章
使用Maven搭建SpringMVC项目
查看>>
Nginx学习之三:对应平台的Nginx下载和安装
查看>>
Rabbitmq 基础
查看>>
关于一个接入第三方系统程序结构
查看>>
我的友情链接
查看>>
判断浏览器类型
查看>>
CentOS yum升级GCC到4.8
查看>>
GridView视图(BaseAdapter)
查看>>
Postfix 利用用户别名自动转发邮件
查看>>
fcitx要设定local才能用~~
查看>>
linux ls命令详解
查看>>
磁盘-使用fdisk格式化硬盘
查看>>
VMware KEY
查看>>
用递归实现的二分查找
查看>>
snmp启动失败
查看>>
Window.Open参数详解
查看>>
linux负载均衡总结性说明;四层负载和七层负载有什么区别
查看>>
转帖-Centos修改时区时间日期
查看>>
IPv4地址
查看>>
MongoDB——第五天 主从复制
查看>>