1、安装引用AES的加密解密的Jar包(bcprov-jdk16-1.46-sources.jar)
1) 手动下载引用
下载地址:https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk16/1.46/
2) Maven的pom.xml添加依赖
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16</artifactId> <version>1.46</version> </dependency>
2、Java的AES加解密实现代码
package demo01; import java.security.AlgorithmParameters; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchProviderException; import java.security.Security; import java.util.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; /** * AES加密工具 模式:CBC 补码方式:PKCS7Padding * @author Administrator * */ public class AESCBCUtils { public static boolean initialized = false; final Base64.Decoder decoder = Base64.getDecoder(); final Base64.Encoder encoder = Base64.getEncoder(); // 加密 public static String encrypt(String sSrc, String encodingFormat, String sKey, String ivParameter) throws Exception { initialize(); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); byte[] raw = sKey.getBytes(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encrypted = cipher.doFinal(sSrc.getBytes(encodingFormat)); return Base64.getEncoder().encodeToString(encrypted); //https://www.cjavapy.com//article/697 //return parseByte2HexStr(encrypted);// 此处使用BASE64做转码。 } /**BouncyCastle作为安全提供,防止我们加密解密时候因为jdk内置的不支持改模式运行报错。**/ public static void initialize() { if (initialized) return; Security.addProvider(new BouncyCastleProvider()); initialized = true; } public static String decrypt(String sSrc, String encodingFormat, String sKey, String ivParameter) throws Exception { try { initialize(); byte[] raw = sKey.getBytes("utf-8"); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes()); //https://www.cjavapy.com//article/697 cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); byte[] encrypted1 = Base64.getDecoder().decode(sSrc); ///parseHexStr2Byte(sSrc);//先用base64解密 byte[] original = cipher.doFinal(encrypted1); String originalString = new String(original,encodingFormat); return originalString; } catch (Exception ex) { return null; } } /** * 将二进制转换成十六进制 * * @param buf * @return */ private static String parseByte2HexStr(byte buf[]) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < buf.length; i++) { String hex = Integer.toHexString(buf[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } sb.append(hex.toUpperCase()); } return sb.toString(); } /** * 将十六进制转换为二进制 * * @param hexStr * @return */ private static byte[] parseHexStr2Byte(String hexStr) { if (hexStr.length() < 1) { return null; } else { byte[] result = new byte[hexStr.length() / 2]; for (int i = 0; i < hexStr.length() / 2; i++) { int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16); int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16); result[i] = (byte) (high * 16 + low); } return result; } } }
测试:
package demo01; public class demo { public static void main(String[] args) { //https://www.cjavapy.com//article/697 try { System.out.println(AESCBCUtils.decrypt("v9BxRJX+ojPDhyJFrglcbA==","utf-8","CJAVAPmXcuAksWmF","V33CQ1428SI8ZNMT")); System.out.println(AESCBCUtils.encrypt("137","utf-8","CJAVAPmXcuAksWmF","V33CQ1428SI8ZNMT")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
3、js的aes.js加解密实现代码
aes.js下载引用地址:https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js
//加密 function encrypt(e,key,iv) { var r = CryptoJS.enc.Utf8.parse(key), var n = CryptoJS.enc.Utf8.parse(iv), var o = CryptoJS.enc.Utf8.parse(e), var u = { iv: n, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }, i = CryptoJS.AES.encrypt(o, r, u); return i.toString() } //解密 function decrypt(str, key, iv) { var r = CryptoJS.enc.Utf8.parse(iv), var n = CryptoJS.enc.Utf8.parse(key), var o = CryptoJS.AES.decrypt(e, n, { iv: r, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return CryptoJS.enc.Utf8.stringify(o).toString() } Node.js中实现AES(CBC)加密和解密: 安装crypto:npm install crypto //加密 function encrypt (data, key, iv) { iv = iv || ""; var clearEncoding = 'utf8'; var cipherEncoding = 'base64'; var cipherChunks = []; var cipher = crypto.createCipheriv('aes-128-cbc', key, iv); cipher.setAutoPadding(true); cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding)); cipherChunks.push(cipher.final(cipherEncoding)); return cipherChunks.join(''); } //解密 function decrypt (data, key, iv) { if (!data) { return ""; } iv = iv || ""; var clearEncoding = 'utf8'; var cipherEncoding = 'base64'; var cipherChunks = []; var decipher = crypto.createDecipheriv('aes-128-cbc', key, iv); decipher.setAutoPadding(true); cipherChunks.push(decipher.update(data, cipherEncoding, clearEncoding)); cipherChunks.push(decipher.final(clearEncoding)); return cipherChunks.join(''); }