趁着周末,对前段工作做一个小总结.
首先,从Cipher的加解密开始,这里写了一个简单的加解密工具
构造函数
首先定义构造函数
public class EncryptUtil {
/**
* 加密算法
*/
final String ALGORITHM = "DES";
/**
* 默认密钥
*/
final String DEFAULTKEY = "ManerFan";
/** 加密工具 */
private Cipher encryptCipher = null;
/** 解密工具 */
private Cipher decryptCipher = null;
/**
* 默认构造方法,使用默认密钥及算法
*
* @throws Exception
*/
public EncryptUtil() throws Exception {
this(DEFAULTKEY, ALGORITHM);
}
/**
* 指定密钥构造方法
*
* @param strKey 指定的密钥
* @param algorithm 指定的算法
* @throws Exception
*/
public EncryptUtil(String strKey, String algorithm) throws Exception {
Key key = getKey(strKey.getBytes("utf-8"), algorithm);
encryptCipher = Cipher.getInstance(algorithm);
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
decryptCipher = Cipher.getInstance(algorithm);
decryptCipher.init(Cipher.DECRYPT_MODE, key);
}
/**
* 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
*
* @param byteArrTmp 构成该字符串的字节数组
* @return 生成的密钥
* @throws java.lang.Exception
*/
private Key getKey(byte[] byteArrTmp, String algorithm) throws Exception {
// 创建一个空的8位字节数组(默认值为0)
byte[] byteArr = new byte[8];
// 将原始字节数组转换为8位
for (int i = 0; i < byteArrTmp.length && i < byteArr.length; i++) {
byteArr[i] = byteArrTmp[i];
}
// 生成密钥
Key key = new javax.crypto.spec.SecretKeySpec(byteArr, algorithm);
return key;
}
}
byte与对应十六进制字符转换
这里需要两个转换函数,实现将加密后得到的byte数组转换为其在内存中所表示的十六进制的字符串
/**
* 将byteArr在内存中所表示的16进制转换为字符串 00~FF
*
* @param byteArr 需要转换的byte数组
* @return 转换后的字符串
*/
public static String byteArr2HexStr(byte[] byteArr) throws Exception {
int byteLen = byteArr.length;
// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
StringBuffer sb = new StringBuffer(byteLen * 2);
for (int i = 0; i < byteLen; i++) {
int intTmp = byteArr[i];
// 把负数转换为正数
while (intTmp < 0) {
intTmp = intTmp + 256;
}
// 小于0F的数需要在前面补0
if (intTmp < 16) {
sb.append("0");
}
// 将byteArr在内存中所表示的16进制转换为字符串 00~FF
sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
}
/**
* 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
* 互为可逆的转换过程
*
* @param strIn 需要转换的字符串
* @return 转换后的byte数组
*/
public static byte[] hexStr2ByteArr(String strIn) throws Exception {
byte[] byteArr = strIn.getBytes("utf-8");
int arrLen = byteArr.length;
// 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
byte[] arrOut = new byte[arrLen / 2];
for (int i = 0; i < arrLen; i = i + 2) {
// 两位两位取出
String strTmp = new String(byteArr, i, 2, "utf-8");
arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
}
return arrOut;
}
加密字符串
/**
* 加密字节数组
*
* @param arrB
* 需加密的字节数组
* @return 加密后的字节数组
* @throws Exception
*/
private byte[] encrypt(byte[] arrB) throws Exception {
return encryptCipher.doFinal(arrB);
}
/**
* 加密字符串
*
* @param strIn
* 需加密的字符串
* @return 加密后的字符串
* @throws Exception
*/
public String encrypt(String strIn) throws Exception {
if (null == strIn || strIn.isEmpty()) {
return null;
}
return byteArr2HexStr(encrypt(strIn.getBytes("utf-8")));
}
解密字符串
/**
* 解密字节数组
*
* @param arrB
* 需解密的字节数组
* @return 解密后的字节数组
* @throws Exception
*/
private byte[] decrypt(byte[] arrB) throws Exception {
return decryptCipher.doFinal(arrB);
}
/**
* 解密字符串
*
* @param strIn
* 需解密的字符串
* @return 解密后的字符串
* @throws Exception
*/
public String decrypt(String strIn) throws Exception {
if (null == strIn || strIn.isEmpty()) {
return null;
}
return new String(decrypt(hexStr2ByteArr(strIn)), "utf-8");
}
至此,加密与解密的功能就全部实现了