AES加密解密
AES.java类代码
package com.apex.esb.client.http.util; /**
* Created by Administrator on 2018/3/8.
*/
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import common.Logger;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Random;
/**
* @version V1.0
* @desc AES 加密工具类
*/
public class AES {
private static final Logger LOG = Logger.getLogger(AES.class);
private static final String KEY_ALGORITHM = "AES";
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";//默认的加密算法
private static String getRandomString(int length) { //length表示生成字符串的长度
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
/**
* AES 加密操作
*
* @param content 待加密内容
* @param password 加密密码
* @return 返回Base64转码后的加密数据
*/
public static String encrypt(String content, String password) {
try {
String randomKey = getRandomString(16);
//动态秘钥密文
byte[] signaturePart1 = encryptInner(randomKey.getBytes("utf-8"), password);
//文本秘钥密文
byte[] signaturePart2 = encryptInner(content.getBytes("utf-8"), randomKey);
byte[] data = new byte[signaturePart1.length + signaturePart2.length];
System.arraycopy(signaturePart1, 0, data, 0, signaturePart1.length);
System.arraycopy(signaturePart2, 0, data, signaturePart1.length, signaturePart2.length);
return Base64.encode(data);//通过Base64转码返回
} catch (Exception ex) {
LOG.error(ex.getMessage(), ex);
}
return null;
}
private static byte[] encryptInner(byte[] content, String password) {
try {
//计算秘钥字节
byte[] key = fromHexString(MD5.MD5(password));
//创建密码器
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, KEY_ALGORITHM), new IvParameterSpec(key));// 初始化为加密模式的密码器
//计算密文字节
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception ex) {
LOG.error(ex.getMessage(), ex);
}
return null;
}
private static byte[] decryptInner(byte[] content, String password) {
try {
//计算秘钥字节
byte[] key = fromHexString(MD5.MD5(password));
//创建密码器
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, KEY_ALGORITHM), new IvParameterSpec(key));// 初始化为加密模式的密码器
//计算密文字节
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception ex) {
LOG.error(ex.getMessage(), ex);
}
return null;
}
/**
* AES 解密操作
*
* @param content
* @param password
* @return
*/
public static String decrypt(String content, String password) {
try {
//动态秘钥+密文
byte[] bytes = Base64.decode(content);
//拆解动态秘钥+密文
byte[] randomKeyByte = new byte[32];
byte[] contentByte = new byte[bytes.length - 32];
System.arraycopy(bytes, 0, randomKeyByte, 0, 32);
System.arraycopy(bytes, 32, contentByte, 0, bytes.length - 32);
String randomKey = new String(decryptInner(randomKeyByte, password), "utf-8");
return new String(decryptInner(contentByte, randomKey), "utf-8");
} catch (Exception ex) {
LOG.error(ex.getMessage(), ex);
}
return null;
}
public static byte[] fromHexString(String input) {
if(input == null) {
return null;
} else if((input.length() & 1) == 1) {
throw new IllegalArgumentException("hexUtils.fromHex.oddDigits");
} else {
char[] inputChars = input.toCharArray();
byte[] result = new byte[input.length() >> 1];
for(int i = 0; i < result.length; ++i) {
int upperNibble = getDec(inputChars[2 * i]);
int lowerNibble = getDec(inputChars[2 * i + 1]);
if(upperNibble < 0 || lowerNibble < 0) {
throw new IllegalArgumentException("hexUtils.fromHex.nonHex");
}
result[i] = (byte)((upperNibble << 4) + lowerNibble);
}
return result;
}
}
private static final int[] DEC = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15};
public static int getDec(int index) {
try {
return DEC[index - 48];
} catch (ArrayIndexOutOfBoundsException var2) {
return -1;
}
}
}
Test.java测试类代码
package com.apex.esb.client;
import com.apex.esb.client.http.util.AES;
/**
* Created by Administrator on 2018/8/3.
*/
public class Test {
public static void main(String[] args) {
//加密
String password = "12ergergfdgfdg"; //用户名密码加密
String signature = "password=" + password + "×tamp=" + System.currentTimeMillis();//增加时间搓
String secret = "100000000000054";//用户的BID (加密和解密的公共秘钥)
signature = AES.encrypt(signature, secret);//加密的密码
System.out.println("加密后的密码:"+signature);
//解密
String decryptData = AES.decrypt(signature, secret);
String[] descArr = decryptData.split("&");
String pwd="";
for(int i = 0; i < descArr.length; ++i) {
String keyValue = descArr[i];
int firstIndex = keyValue.indexOf("=");
if(keyValue.substring(0, firstIndex).equals("password")) {
pwd=keyValue.substring(firstIndex + 1);//获取到密码
}
}
System.out.println("解密后的密码:"+pwd);
}
}
2、2、另一组代码
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class AESUtil {
static String key="finedo_nxcrm_aes";
static byte[] ivByte = { 85, 60, 12, 116, 99, (byte) (-67 + 256), (byte) (-83 + 256), 19, (byte) (-118 + 256),
(byte) (-73 + 256), (byte) (-24 + 256), (byte) (-8 + 256), 82, (byte) (-24 + 256), (byte) (-56 + 256),
(byte) (-14 + 256) };
//加密
public static String Encrypt(String src) throws Exception {
if (key == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16位
if (key.length() != 16) {
System.out.print("Key长度不是16位");
return null;
}
byte[] raw = key.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivps = new IvParameterSpec(ivByte);// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivps);
byte[] encrypted = cipher.doFinal(src.getBytes("UTF-8"));
//return Base64.encodeBase64String(encrypted);
return Base64.encodeBase64URLSafeString(encrypted);
}
//解密
public static String Decrypt(String src) throws Exception {
if (key == null) {
System.out.print("Key为空null");
return null;
}
if (key.length() != 16) {
System.out.print("Key长度不是16位");
return null;
}
byte[] raw = key.getBytes("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivps = new IvParameterSpec(ivByte);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivps);
byte[] encrypted1 = Base64.decodeBase64(src.getBytes("utf-8"));
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original);
return originalString;
}
//测试
public static void main(String[] args) throws Exception {
String src = "sys_9511";
System.out.println("加密前:" + src);
String enString = AESUtil.Encrypt(src);
System.out.println("密文是:" + enString);
String DeString = AESUtil.Decrypt(enString);
System.out.println("解密后的明文是:" + DeString);
}
}

浙公网安备 33010602011771号