前后端实现AES加解密(一):java后端实现
程序员文章站
2022-07-10 15:23:26
...
首先需要导入一个第三方jsr包,commons-codec.jar
下面是一个写好的工具类,调用该类的方法,实现使用指定**对明文进行加解密:
package util;
import java.io.UnsupportedEncodingException;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class AesUtil {
//byte数组转字符串
public static String byteToString(byte[] byte1)
throws UnsupportedEncodingException {
return new String(byte1);
}
//加密时调用方法,三个参数分别是:明文,**,向量,注意向量的长度只能是16byte,而且加密解密时必须使用一致的向量。
public static byte[] AES_CBC_Encrypt(byte[] content, byte[] keyBytes,
byte[] iv) {
try {
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
System.out.println("exception:" + e.toString());
}
return null;
}
//解密方法,三个参数:密文,**,向量
public static byte[] AES_CBC_Decrypt(byte[] content, byte[] keyBytes,
byte[] iv) {
try {
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
// TODO Auto-generated catchblock
System.out.println("exception:" + e.toString());
}
return null;
}
/**
*将base64类型的字符串转成byte类型
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptBASE64(String key) throws Exception {
return Base64.decodeBase64(key.getBytes());
}
/**
* 将byte类型转变为base64类型的字符串
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE64(byte[] key) throws Exception {
return new String(Base64.encodeBase64(key));
}
/**
* 这个方法在大多数时候是用不到的,可以选择无视。
* @param src byte数组
* @return 十六进制的字符串
*/
public static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
/**
* 字符串转二进制字符串
*
* @param str
*/
public String toBinary(String str) {
char[] strChar = str.toCharArray();
String result = "";
for (int i = 0; i < strChar.length; i++) {
result += Integer.toBinaryString(strChar[i]) + "";
}
return result;
}
/**
* 字符串转16进制字符串
* @param s
* @return
*/
public static String strTo16(String s) {
String str = "";
for (int i = 0; i < s.length(); i++) {
int ch = (int) s.charAt(i);
String s4 = Integer.toHexString(ch);
str = str + s4;
}
return str;
}
/**
* 得到一个任意长度随即**
* @param KeyLength
* @return
*/
public static String KeyCreate(int KeyLength) {
String base = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
Random random = new Random();
StringBuffer Keysb = new StringBuffer();
for (int i = 0; i < KeyLength; i++) // 生成指定位数的随机秘钥字符串
{
int number = random.nextInt(base.length());
Keysb.append(base.charAt(number));
}
return Keysb.toString();
}
}
直接将上面的工具类复制到项目中,下面demo用来演示加密解密过程:
//明文
String returnMessageContent = "症结所在";
//aes的key值
String key = AesUtil.KeyCreate(16);
//注意第一个参数-明文转化为byte数组的时候,一定要指定是按照utf-8的格式进行转化的,不然对中文的加密就会出现加密后无法解密的情况。
//第三个参数-向量,一定是16byte长度的,这里采用**字符串的前16位。
byte[] encrypted = AesUtil.AES_CBC_Encrypt(returnMessageContent.getBytes("utf-8"), key.getBytes(), key.substring(0, 16).getBytes());
//将加密后的密文转成base64格式的字符串
String secretWord = AesUtil.encryptBASE64(encrypted);
解密的demo
String chat_content = secretWord;
// 解密,获得消息明文
byte[] chat_contentming = AesUtil.AES_CBC_Decrypt(AesUtil.decryptBASE64(chat_content),aesming.getBytes(),aesming.substring(0, 16).getBytes());
//将明文byte按照utf-8的形式转化为String字符串
String messageming = new String(chat_contentming, "utf-8");
上一篇: AES加密算法的理解及Java实现
下一篇: AES加解密实例