前端js.
这里需要下载一份小程序版的aes.js
var CryptoJS = require('./aes.js'); //引用AES源码js
var key = CryptoJS.enc.Utf8.parse("abcdefgabcdefg12"); //十六位十六进制数作为秘钥
var iv = CryptoJS.enc.Utf8.parse('abcdefgabcdefg12'); //十六位十六进制数作为秘钥偏移量
//解密方法
function Decrypt(word) {
var encryptedHexStr = CryptoJS.enc.Hex.parse(word);
var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
var decrypt = CryptoJS.AES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
//加密方法
function Encrypt(word) {
var srcs = CryptoJS.enc.Utf8.parse(word);
console.log(iv);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.ciphertext.toString().toUpperCase();
}
module.exports = {
Decrypt: Decrypt,
Encrypt: Encrypt
}
后台java版本
package com.sunisco.pay.spro.utils;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.Key;
public class AESUtil {
//密钥 (需要前端和后端保持一致)
public static final String KEY = "abcdefgabcdefg12";
//算法
private static final String ALGORITHMSTR = "AES/CBC/PKCS5Padding";
private static final String CHARSET_NAME = "UTF-8";
private static final String AES_NAME = "AES";
//十六位十六进制数作为秘钥偏移量
private static final String IV = "abcdefgabcdefg12";
/*public static void main(String[] args)throws UnsupportedEncodingException {
String content="encrypt";
String key="abcdefgabcdefg12";
String iv="abcdefgabcdefg12";
try {
System.out.print(encrypt(content, key));
} catch (Exception e) {
e.printStackTrace();
}
//加密
byte[ ]encrypted=AES_CBC_Encrypt(content.getBytes(), key.getBytes(), iv.getBytes());
//解密
byte[ ]decrypted=AES_CBC_Decrypts(encrypted, key.getBytes(), iv.getBytes());
System.out.println("解密后:"+byteToHexString(decrypted));
System.out.println(byteToString(decrypted));
}*/
private static String byteToHexString(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();
}
public static byte[] AES_CBC_Decrypts(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;
}
public static String encrypt(String content, String key) throws Exception {
try {
Key keySpec = new SecretKeySpec(key.getBytes(), "AES"); //两个参数,第一个为私钥字节数组, 第二个为加密方式 AES或者DES
String iv = "abcdefgabcdefg12";//初始化向量参数,AES 为16bytes. DES 为8bytes.
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec,ivSpec);
//Cipher cipher = AesUtil.generateCipher(Cipher.ENCRYPT_MODE,"1234567890123456".getBytes(),"1234567890123456".getBytes());
byte[] byteResult = cipher.doFinal(content.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteResult.length; i++) {
String hex = Integer.toHexString(byteResult[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String byteToString(byte[ ]byte1){
return new String(byte1);
}
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;
}
/**
* 解密
*
* @param content 前端加密的信息
* @return
*/
public static String AES_CBC_Decrypt(String content){
try{
/*byte[] encrypted1 = Base64.decodeBase64(content);*/
byte[] encrypted1 = Hex.decodeHex(content.toCharArray());
SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), AES_NAME);
Cipher cipher=Cipher.getInstance(ALGORITHMSTR);
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(IV.getBytes()));
byte[] result= cipher.doFinal(encrypted1);
return byteToString(result);
}catch (Exception e) {
// TODO Auto-generated catchblock
System.out.println("exception:"+e.toString());
}
return null;
}
}
参考文档:
https://www.cnblogs.com/yuyutianxia/p/7694195.html
https://blog.csdn.net/mafei6827/article/details/79645215
https://blog.csdn.net/cwl421/article/details/54318350