准备:在项目中引入Base64jar包。
使用git下载Base64jar包:https://github.com/gaoconglin/encrypt.git
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
- 密钥生成工具类
- AE是对称加密,加密和解密的密钥是一样的,密钥是长度为16的字符串(明文/密钥)。下面是截取密文的16个字符作为密钥。
- @author JungleKao
*/
public class SHA256Utils {
/**
* 生成长度为16的加密/解密密钥
*
* @param str
* @return
*/
public static String getSHA16Str(String str) {
return getSHA256StrJava(str).substring(10, 26).toUpperCase();
}
/**
* 利用java原生的摘要实现SHA256加密 密钥长度为64
*
* @param str 加密后的报文
* @return
*/
public static String getSHA256StrJava(String str) {
MessageDigest messageDigest;
String encodeStr = "";
try {
messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(str.getBytes("UTF-8"));
encodeStr = byte2Hex(messageDigest.digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return encodeStr;
}
/**
* 将二进制byte[]转为16进制
*/
private static String byte2Hex(byte[] bytes) {
StringBuffer stringBuffer = new StringBuffer();
String temp = null;
for (int i = 0; i < bytes.length; i++) {
temp = Integer.toHexString(bytes[i] & 0xFF);
if (temp.length() == 1) {
// 得到一位的进行补0操作
stringBuffer.append("0");
}
stringBuffer.append(temp);
}
return stringBuffer.toString();
}
}
import java.security.InvalidParameterException;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
- 加密/解密方法
- @author JungleKao
*/
public class AESUtil {
private static final String ENCODING = "UTF-8";
/**
* 对数据进行AES加密
*
* @param originalString
* @param key
* @return
* @throws Exception
*/
public static String encrypt(String originalString, String key) throws Exception {
if (null == originalString || originalString.length() == 0) {
throw new InvalidParameterException("请传入需要加密的字符串数据");
}
if (null == key || key.length() == 0) {
throw new InvalidParameterException("请传入用于加密的密钥");
}
if (key.length() != 16) {
throw new InvalidParameterException("请传入长度为16的字符串密钥" + key.length());
}
byte[] raw = key.getBytes(ENCODING);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// "算法/模式/补码方式"
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(originalString.getBytes(ENCODING));
return Base64.encodeBase64String(encrypted);
}
/**
* 对数据进行AES解密
*
* @param encryptedString
* @param key
* @return
* @throws Exception
*/
public static String decrypt(String encryptedString, String key) throws Exception {
if (null == encryptedString || encryptedString.length() == 0) {
throw new InvalidParameterException("请传入需要解密的密文");
}
if (null == key || key.length() == 0) {
throw new InvalidParameterException("请传入用于解加密的密钥");
}
if (key.length() != 16) {
throw new InvalidParameterException("请传入长度为16的字符串密钥");
}
byte[] raw = key.getBytes(ENCODING);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] unBase64String = Base64.decodeBase64(encryptedString);
byte[] original = cipher.doFinal(unBase64String);
String originalString = new String(original, ENCODING);
return originalString;
}
}
/**
- 管理加密类,对加密失败做处理。
- @author JungleKao
*/
public class AESSecurityManager {
/**
* 对数据进行AES加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public String encryptData(String data, String key) throws Exception {
if (data == null || data.length() == 0) {
return "请传入需要加密的字符串数据";
}
if (key == null || data.length() == 0) {
return "请传入加密的密钥";
}
try {
return AESUtil.encrypt(data, key);
} catch (Exception e) {
// 加密失败
throw e;
}
}
/**
* 对数据进行AES解密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public String decryptData(String data, String key) throws Exception {
if (data == null || data.length() == 0) {
return "请传入需要解密的密文";
}
if (key == null || data.length() == 0) {
return "请传入解密的密钥key";
}
try {
return AESUtil.decrypt(data, key);
} catch (Exception e) {
throw e;
}
}
}
/**
- AES加密/解密测试类
- @author JungleKao
*/
public class AesTest {
public static void main(String[] args) throws Exception {
// 生成密钥
String key = SHA256Utils.getSHA16Str("000");
System.out.println("密钥:" + key);
AESSecurityManager aes = new AESSecurityManager();
String str = "点个赞呗!";
System.out.println("加密前的参数:" + str);
String data = aes.encryptData(str, key);
System.out.println("加密后的参数:" + data);
String data2 = aes.decryptData(data, key);
System.out.println("解密后的参数:" + data2);
}
}