java的AES算法加密/解密方式
有时候我们在遇到一些比较重要的数据需要传送的时候就会用到一些解密算法对这些重要的数据进行加密操作。而之前比较常用的DES(Date Encryption Standard)数据加密标准,来说AESAdvanced Encrytion Standard(高级加密标准)是更高级的加密标准。
DES:特点是1、对称加密,2、同一个秘钥
AES:特点是1、 对称加密, 2、一个SK扩展成多个子SK,轮加密
java代码实现部分
public class EncryptUtil {
//static String data = "123456RWEQR";
static String private_key = "abcdef0123456789"; //16位秘钥(自定义)
static String public_key = "0123456789abcdef"; //16位公钥(自定义)
/**
* 功能分析:提供一个数据加密的操作方法
* @param data //要加密的数据
* @return
* @throws Exception
*/
public static String encryptAES(String data) throws Exception {
try {
//获取加密对象
Cipher cipher = Cipher.getInstance("AES/CBC/NOPadding"); //参数分别代表 算法名称/加密模式/数据填充方式
//获取加密对象的数据长度
int blockSize = cipher.getBlockSize();
//把要加密的字符串数据转换成字节数组
byte[] dataBytes = data.getBytes();
//获取加密字节数组的长度
int plaintextLength = dataBytes.length;
//设置被加密数据的字节长度为加密数据字节长度的整数倍
if (plaintextLength % blockSize != 0) {
/**例如
* 7 + 4 -(7 % 4) = 8
* 10 + 3 - (10 % 3) = 12
* 9 + 5 - (9 % 5) = 10
*/
plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
}
//创建一个新的字节数组(长度为加密数据字节长度的整数倍)
byte[] plaintext = new byte[plaintextLength];
//从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
//根据给定的字节数组和加密算法构造一个密钥。
SecretKeySpec keyspec = new SecretKeySpec(private_key.getBytes(), "AES");
//根据给定的字节数组来构造一个 IvParameterSpec 对象公钥。
IvParameterSpec ivspec = new IvParameterSpec(public_key.getBytes());
//用密钥和一组算法参数(公钥)初始化此 Cipher的加密对象
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
//加密对象调用加密方法开启数据加密工作
byte[] encrypted = cipher.doFinal(plaintext);
//利用sun公司的64位编码格式重新编译一遍加密后的数据
return new sun.misc.BASE64Encoder().encode(encrypted);
} catch (Exception e) {//加密过程中有发送报错直接跳出
e.printStackTrace();
return null;
}
}
/**
* 功能分析:提供一个数据解密的方法
* @param data //要解密的数据
* @return
* @throws Exception
*/
public static String decryptAES(String data) throws Exception {
try {
//先把解密数据进行64位编码格式重新编译一遍存入到一个字节数组中
byte[] encrypted1 = new BASE64Decoder().decodeBuffer(data);
//获取解密对象
Cipher cipher = Cipher.getInstance("AES/CBC/NOPadding");
//根据给定的字节数组和加密算法构造一个密钥。
SecretKeySpec keyspec = new SecretKeySpec(private_key.getBytes(), "AES");
//根据给定的字节数组来构造一个 IvParameterSpec 对象公钥。
IvParameterSpec ivspec = new IvParameterSpec(public_key.getBytes());
//用密钥和一组算法参数(公钥)初始化此 Cipher的加密对象
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;
}
}
}
提供前端vue.js解密部分代码
//先导入工具第三方包
import CryptoJS from 'crypto-js'
//解密方法
Decrypt(word){
// 用于解密后台加密的aes数据
var key = CryptoJS.enc.Latin1.parse('abcdef0123456789');//秘钥(要和加密的秘钥一致)
var iv = CryptoJS.enc.Latin1.parse('0123456789abcdef');//公钥(要和加密的公钥一致)
var decrypted = CryptoJS.AES.decrypt(word, key, {iv: iv, padding: CryptoJS.pad.ZeroPadding});
console.log(decrypted.toString(CryptoJS.enc.Utf8));
return decrypted.toString(CryptoJS.enc.Utf8);
}
好了到这里已经能把一些重要的信息完成加密操作了。当然你若是有需要做手机短信验证码功能也可以参照我写的一篇《springMVC+阿里云API = 实现发送手机验证码短信》