// 加密算法
private static String ALGO = "AES";
// 转换模式(“算法/工作模式/填充模式”)
private static String transformation = "AES/CBC/NoPadding";
private static String ALGO_MODE = "AES/CBC/NoPadding";
private static String akey= " sdfe1***38dd12d4";
private static String aiv= "0321ebe***1f75de2";
/**
*
* @param Data
* 传过来的数据:data=id+“,”+“price”,“timestamp”
* @param akey
* 定义秘钥规范所需要的参数
* @param aiv
* 定义秘钥参数规范需要的参数哦
* @return
* @throws Exception
*/
public static String encrypt(String Data, String akey, String aiv) throws Exception {
try {
// 获得一个加密解密的类(密码类)的实例转换方式其中算法是AES,工作模式为CBC,填充方式NoPadding
Cipher cipher = Cipher.getInstance(ALGO_MODE);
// 获得相应块的大小(密码类块的大小)
int blockSize = cipher.getBlockSize();
// 把传过来的 数据字符串达成字节的形式的数组中
byte[] dataBytes = Data.getBytes();
// 获得该字节数组的长度
int plaintextLength = dataBytes.length;
if (plaintextLength % blockSize != 0) {
// 如果该字节数组的长度对相应块的大小去模有余,则增加该字节数组的长度(增加的长度为该相应块的值-字节数组长度对块取模的值),其目的主要是让数组长度对块的值取模后值为0
plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
}
// 已更改后的自己数组的长度为单位new一个新的字节数组
byte[] plaintext = new byte[plaintextLength];
// dataBytes被复制的数组,0:被复制数组的起始位置,plaintext:备用数组(dataBytes里的内容要被复制在这个数组里面);dataBytes.length:被复制数组的长度
System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
// 上述代码的意思是指把dataBytes数组里的内容从0的位置到最后的位置全部复制到plaintext数组中,其主要目的就是让dataBytes数组的长度对加密解密类的块的大小取模之后的值为0
// 把秘钥打成一个字节数组,采用"AES"的算法构建一个秘钥规范(SecretKeySpec为秘钥规范类他实现了KeySpec接口)
SecretKeySpec keyspec = new SecretKeySpec(akey.getBytes("utf-8"), ALGO);
// iv的作用主要是用于产生密文的第一个block,以使最终生成的密文产生差异(明文相同的情况下),使密码攻击变得更为困难,除此之外iv并无其它用途,因此iv通过随机方式产生,是简便有效的途径
// IvParameterSpec主要是用来规范加密参数的一个实现类
IvParameterSpec ivspec = new IvParameterSpec(aiv.getBytes("utf-8"));
// 初始化加密解密的类Cipher.ENCRYPT_MODE:表明这个加密解密的类主要功能是加密,keyspec:秘钥规范;ivspec:加密参数的规范
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
// 对数据进行最终处理,生成一个新的数组即被加密后的数组
byte[] encrypted = cipher.doFinal(plaintext);
// 把加密后的字节数组进行base64进行编码,编码后形成新的字符串
String EncStr = new sun.misc.BASE64Encoder().encode(encrypted);
return EncStr;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
*
* @param encryptedData
* 被加密的数据
* @param akey
* 秘钥规范类所需要的参数
* @param aiv
* 秘钥参数规范类所需要的参数
* @return 被解密的字符串
* @throws Exception
*/
public static String decrypt(String encryptedData, String akey, String aiv) throws Exception {
try {
// 把被加密的数字按照base64的形式进行解码生成一个字节数组
byte[] encrypted1 = new sun.misc.BASE64Decoder().decodeBuffer(encryptedData);
// 创建一个加密解密的类(密码类)
Cipher cipher = Cipher.getInstance(ALGO_MODE);
// 把密文打成一个字节数组的形式,按照“AESC”的加密算法创建一个密文规范类
SecretKeySpec keyspec = new SecretKeySpec(akey.getBytes("utf-8"), ALGO);
// 把注入值打成字节数组创建一个密文注入值参数规范类
IvParameterSpec ivspec = new IvParameterSpec(aiv.getBytes("utf-8"));
// 初始化加密解密类并把其初始化成解密的类
cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
// 把需要解密的数据字节数组进行最后处理,还原成原来的数据字节数组
byte[] original = cipher.doFinal(encrypted1);
// 把原始字节数组变成字符串
String originalString = new String(original);
return originalString;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}