package algo;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
/**
* 对称加密算法:基于口令加密-PBE算法实现 使用java6提供的PBEWITHMD5andDES算法进行展示
* */
public class PBE {
public static void main(String[] args) {
// 待加密数据
String str = "PBE";
// 设定的口令密码
String pwd = "azsxdc";
System.out.println("加密前数据String类型:" + str);
System.out.println("加密前数据byte[]类型:"+showByteArray(str.getBytes()));
System.out.println("密码:" + pwd);
// 初始化盐
byte[] salt;
try {
salt = PBE.initSalt();
System.out.println("Base64加密后:" + org.apache.tomcat.util.codec.binary.Base64.encodeBase64String(salt));
// 加密数据
byte[] data = PBE.encrypt(str.getBytes(), pwd, salt);
System.out.println("加密后数据byte[]类型:" + showByteArray(data));
System.out.println("加密后数据String类型:" + org.apache.tomcat.util.codec.binary.Base64.encodeBase64String(data));
// 解密数据
data = PBE.decrypt(data, pwd, salt);
System.out.println("解密后数据byte[]类型:" + showByteArray(data));
System.out.println("解密后String[]类型:" + new String(data));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* JAVA6支持以下任意一种算法
* PBEWITHMD5ANDDES
* PBEWITHMD5ANDTRIPLEDES
* PBEWITHSHAANDDESEDE
* PBEWITHSHA1ANDRC2_40
* PBKDF2WITHHMACSHA1
* */
public static final String ALGORITHM = "PBEWITHMD5andDES";
/**
* 迭代次数
* */
public static final int ITERATION_COUNT = 100;
/**
* 盐初始化 盐长度必须为8字节
*
* @return byte[] 盐
* */
public static byte[] initSalt() throws Exception {
// 实例化安全随机数
SecureRandom random = new SecureRandom();
// 产出盐
return random.generateSeed(8);
}
/**
* 转换密钥
*
* @param password
* 密码
* @return Key 密钥
* */
private static Key toKey(String pwd) throws Exception {
// 密钥彩礼转换
PBEKeySpec keySpec = new PBEKeySpec(pwd.toCharArray());
// 实例化
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
// 生成密钥
SecretKey secretKey = keyFactory.generateSecret(keySpec);
return secretKey;
}
/**
* 加密
*
* @param data
* 待加密数据
* @param password
* 密码
* @param salt
* 盐
* @return byte[] 加密数据
*
* */
public static byte[] encrypt(byte[] str, String pwd, byte[] salt) throws Exception {
// 转换密钥
Key key = toKey(pwd);
// 实例化PBE参数材料
PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATION_COUNT);
// 实例化
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 初始化
cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
// 执行操作
return cipher.doFinal(str);
}
/**
* 解密
*
* @param data
* 待解密数据
* @param password
* 密码
* @param salt
* 盐
* @return byte[] 解密数据
*
* */
public static byte[] decrypt(byte[] str, String pwd, byte[] salt) throws Exception {
// 转换密钥
Key key = toKey(pwd);
// 实例化PBE参数材料
PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATION_COUNT);
// 实例化
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 初始化
cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
// 执行操作
return cipher.doFinal(str);
}
private static String showByteArray(byte[] data) {
if (null == data) {
return null;
}
StringBuilder sb = new StringBuilder("{");
for (byte b : data) {
sb.append(b).append(",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append("}");
return sb.toString();
}
}
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
/**
* 对称加密算法:基于口令加密-PBE算法实现 使用java6提供的PBEWITHMD5andDES算法进行展示
* */
public class PBE {
public static void main(String[] args) {
// 待加密数据
String str = "PBE";
// 设定的口令密码
String pwd = "azsxdc";
System.out.println("加密前数据String类型:" + str);
System.out.println("加密前数据byte[]类型:"+showByteArray(str.getBytes()));
System.out.println("密码:" + pwd);
// 初始化盐
byte[] salt;
try {
salt = PBE.initSalt();
System.out.println("Base64加密后:" + org.apache.tomcat.util.codec.binary.Base64.encodeBase64String(salt));
// 加密数据
byte[] data = PBE.encrypt(str.getBytes(), pwd, salt);
System.out.println("加密后数据byte[]类型:" + showByteArray(data));
System.out.println("加密后数据String类型:" + org.apache.tomcat.util.codec.binary.Base64.encodeBase64String(data));
// 解密数据
data = PBE.decrypt(data, pwd, salt);
System.out.println("解密后数据byte[]类型:" + showByteArray(data));
System.out.println("解密后String[]类型:" + new String(data));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* JAVA6支持以下任意一种算法
* PBEWITHMD5ANDDES
* PBEWITHMD5ANDTRIPLEDES
* PBEWITHSHAANDDESEDE
* PBEWITHSHA1ANDRC2_40
* PBKDF2WITHHMACSHA1
* */
public static final String ALGORITHM = "PBEWITHMD5andDES";
/**
* 迭代次数
* */
public static final int ITERATION_COUNT = 100;
/**
* 盐初始化 盐长度必须为8字节
*
* @return byte[] 盐
* */
public static byte[] initSalt() throws Exception {
// 实例化安全随机数
SecureRandom random = new SecureRandom();
// 产出盐
return random.generateSeed(8);
}
/**
* 转换密钥
*
* @param password
* 密码
* @return Key 密钥
* */
private static Key toKey(String pwd) throws Exception {
// 密钥彩礼转换
PBEKeySpec keySpec = new PBEKeySpec(pwd.toCharArray());
// 实例化
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
// 生成密钥
SecretKey secretKey = keyFactory.generateSecret(keySpec);
return secretKey;
}
/**
* 加密
*
* @param data
* 待加密数据
* @param password
* 密码
* @param salt
* 盐
* @return byte[] 加密数据
*
* */
public static byte[] encrypt(byte[] str, String pwd, byte[] salt) throws Exception {
// 转换密钥
Key key = toKey(pwd);
// 实例化PBE参数材料
PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATION_COUNT);
// 实例化
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 初始化
cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
// 执行操作
return cipher.doFinal(str);
}
/**
* 解密
*
* @param data
* 待解密数据
* @param password
* 密码
* @param salt
* 盐
* @return byte[] 解密数据
*
* */
public static byte[] decrypt(byte[] str, String pwd, byte[] salt) throws Exception {
// 转换密钥
Key key = toKey(pwd);
// 实例化PBE参数材料
PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATION_COUNT);
// 实例化
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 初始化
cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
// 执行操作
return cipher.doFinal(str);
}
private static String showByteArray(byte[] data) {
if (null == data) {
return null;
}
StringBuilder sb = new StringBuilder("{");
for (byte b : data) {
sb.append(b).append(",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append("}");
return sb.toString();
}
}