package com.aes.util;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* 该类提供了一些常用的方法,比如将二进制转换为十六进制和将十六进制转换为二进制
* 和加密和解密的方法
* @author HP
*/
public class AESMethod
{
/**
* 初始化加密密码器
* @param password //密钥
* @return
*/
public static Cipher initEncrypt(String password)
{
try
{
//密钥产生器,密钥产生器对象可重复使用
KeyGenerator kgen = KeyGenerator.getInstance("AES");
/**
* 对于给定的密钥长度和用户提供的随机数来初始化密钥
* new SecureRandom(password.getBytes())是产生一个SecureRandom的实例以给定的password
*/
kgen.init(128, new SecureRandom(password.getBytes()));
//生成一个密钥
SecretKey secretKey = kgen.generateKey();
//返回密钥的初始编码格式,如果该密钥不支持编码则返回null
byte[] enCodeFormat = secretKey.getEncoded();
/**
* SecretKeySpec,指定一个密钥在provider-independent中如何使用
* 从给定的字节数组构造一个密钥
*/
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES"); // 创建密码器
cipher.init(Cipher.ENCRYPT_MODE, key); // 初始化为加密
return cipher;
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("加密密码器初始化异常");
}
finally
{
AESUtil.flag = true;
}
return null;
}
/**
* 初始化解密密码器
* @param password 密钥
* @return
*/
public static Cipher initDecrypt(String password)
{
try
{
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化为解密
return cipher;
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("解密密码器初始化异常");
}
finally
{
AESUtil.flag = true;
}
return null;
}
/**
* 将二进制转换成16进制
* @param buf
* @return
*/
public static String parseByte2HexStr(byte buf[])
{
/**
* StringBuffer,相当于一个可以修改内容的字符串
*/
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++)
{
// 将防范中的参数转换为16进制
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1)
{
hex = '0' + hex;
}
// 将字符转换为大写
sb.append(hex.toUpperCase());
}
return sb.toString();
}
/**
* 将16进制转换为二进制
* @param hexStr
* @return
*/
public static byte[] parseHexStr2Byte(String hexStr)
{
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length() / 2];
for (int i = 0; i < hexStr.length() / 2; i++)
{
/**
* substring(int begin, int end)方法返回该字符串的一个子串,初始位置为begin,结束位置为end
*/
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),
16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
}