前端库地址:crypto-js
安装依赖
npm install --save crypto-js
或者下载后引用
<script src="./js/crypto-js.js"></script> <script src="./js/aes.js"></script>
使用CBC模式
前端
// 字符串转hex let string_to_hex = function (str) { let tempstr = ""; for (let i = 0; i < str.length; i++) { if (tempstr === "") tempstr = str.charCodeAt(i).toString(16); else tempstr += str.charCodeAt(i).toString(16); } return tempstr; }; let keystr = "0123456789ABCDEF"; let ivstr = "0123456789101112"; const src = "Hello World"; console.log("密钥:", keystr); console.log("偏移量:", ivstr); console.log("原字符串:", src); let key = string_to_hex(keystr); key = CryptoJS.enc.Hex.parse(key); ivstr = string_to_hex(ivstr); let iv = CryptoJS.enc.Hex.parse(ivstr); const enc = CryptoJS.AES.encrypt(src, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); const enced = enc.ciphertext.toString(); console.log("加密:", enced); const dec = CryptoJS.AES.decrypt(CryptoJS.format.Hex.parse(enced), key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); const decstr = CryptoJS.enc.Utf8.stringify(dec); console.log("解密:", decstr);
结果
密钥: 0123456789ABCDEF 偏移量: 0123456789101112 原字符串: Hello World 加密: 4b20efdf7aceb95c099b7df542673256 解密: Hello World
Java后端
import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AES { private static String Algorithm = "AES"; private static String AlgorithmProvider = "AES/CBC/PKCS5Padding"; //算法/模式/补码方式 public static byte[] generatorKey() throws NoSuchAlgorithmException { KeyGenerator keyGenerator = KeyGenerator.getInstance(Algorithm); keyGenerator.init(256);//默认128,获得无政策权限后可为192或256 SecretKey secretKey = keyGenerator.generateKey(); return secretKey.getEncoded(); } public static IvParameterSpec getIv(String ivstr) throws UnsupportedEncodingException { IvParameterSpec ivParameterSpec = new IvParameterSpec(ivstr.getBytes("utf-8")); return ivParameterSpec; } public static String encrypt(String src, String keystr, IvParameterSpec iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, InvalidAlgorithmParameterException { byte[] key = keystr.getBytes("utf-8"); SecretKey secretKey = new SecretKeySpec(key, Algorithm); IvParameterSpec ivParameterSpec = iv; Cipher cipher = Cipher.getInstance(AlgorithmProvider); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec); byte[] cipherBytes = cipher.doFinal(src.getBytes(Charset.forName("utf-8"))); return byteToHexString(cipherBytes); } public static String decrypt(String src, String keystr, IvParameterSpec iv) throws Exception { byte[] key = keystr.getBytes("utf-8"); SecretKey secretKey = new SecretKeySpec(key, Algorithm); IvParameterSpec ivParameterSpec = iv; Cipher cipher = Cipher.getInstance(AlgorithmProvider); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec); byte[] hexBytes = hexStringToBytes(src); byte[] plainBytes = cipher.doFinal(hexBytes); return new String(plainBytes, "utf-8"); } /** * 将byte转换为16进制字符串 * * @param src * @return */ public static String byteToHexString(byte[] src) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < src.length; i++) { int v = src[i] & 0xff; String hv = Integer.toHexString(v); if (hv.length() < 2) { sb.append("0"); } sb.append(hv); } return sb.toString(); } /** * 将16进制字符串装换为byte数组 * * @param hexString * @return */ public static byte[] hexStringToBytes(String hexString) { hexString = hexString.toUpperCase(); int length = hexString.length() / 2; char[] hexChars = hexString.toCharArray(); byte[] b = new byte[length]; for (int i = 0; i < length; i++) { int pos = i * 2; b[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); } return b; } private static byte charToByte(char c) { return (byte) "0123456789ABCDEF".indexOf(c); } public static void main(String[] args) { try { // 密钥必须是16的倍数 String keystr = "0123456789ABCDEF"; String ivstr = "0123456789101112"; String src = "Hello World"; System.out.println("密钥:" + keystr); System.out.println("偏移量:" + ivstr); System.out.println("原字符串:" + src); IvParameterSpec iv = getIv(ivstr); String enc = encrypt(src, keystr, iv); System.out.println("加密:" + enc); String dec = decrypt(enc, keystr, iv); System.out.println("解密:" + dec); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
结果
密钥:0123456789ABCDEF 偏移量:0123456789101112 原字符串:Hello World 加密:4b20efdf7aceb95c099b7df542673256 解密:Hello World
使用ECB模式
前端
// 字符串转hex let string_to_hex = function (str) { let tempstr = ""; for (let i = 0; i < str.length; i++) { if (tempstr === "") tempstr = str.charCodeAt(i).toString(16); else tempstr += str.charCodeAt(i).toString(16); } return tempstr; }; let keystr = "0123456789ABCDEF"; const src = "Hello World"; console.log("密钥:", keystr); console.log("原字符串:", src); let key = string_to_hex(keystr); key = CryptoJS.enc.Hex.parse(key); const enc = CryptoJS.AES.encrypt(src, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, }); const enced = enc.ciphertext.toString(); console.log("加密:", enced); const dec = CryptoJS.AES.decrypt(CryptoJS.format.Hex.parse(enced), key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, }); let decstr = CryptoJS.enc.Utf8.stringify(dec); console.log("解密:", decstr);
结果
密钥: 0123456789ABCDEF 原字符串: Hello World 加密: 21f41dde54d0c9703c730fd14ce47cfe 解密: Hello World
Java后端
import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AES { private static String Algorithm = "AES"; private static String AlgorithmProvider = "AES/ECB/PKCS5Padding"; // 算法/模式/补码方式 public static byte[] generatorKey() throws NoSuchAlgorithmException { KeyGenerator keyGenerator = KeyGenerator.getInstance(Algorithm); keyGenerator.init(256);//默认128,获得无政策权限后可为192或256 SecretKey secretKey = keyGenerator.generateKey(); return secretKey.getEncoded(); } public static String encrypt(String src, String keystr) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, InvalidAlgorithmParameterException { byte[] key = keystr.getBytes("utf-8"); SecretKey secretKey = new SecretKeySpec(key, Algorithm); Cipher cipher = Cipher.getInstance(AlgorithmProvider); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] cipherBytes = cipher.doFinal(src.getBytes(Charset.forName("utf-8"))); return byteToHexString(cipherBytes); } public static String decrypt(String src, String keystr) throws Exception { byte[] key = keystr.getBytes("utf-8"); SecretKey secretKey = new SecretKeySpec(key, Algorithm); Cipher cipher = Cipher.getInstance(AlgorithmProvider); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] hexBytes = hexStringToBytes(src); byte[] plainBytes = cipher.doFinal(hexBytes); return new String(plainBytes, "utf-8"); } /** * 将byte转换为16进制字符串 * * @param src * @return */ public static String byteToHexString(byte[] src) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < src.length; i++) { int v = src[i] & 0xff; String hv = Integer.toHexString(v); if (hv.length() < 2) { sb.append("0"); } sb.append(hv); } return sb.toString(); } /** * 将16进制字符串装换为byte数组 * * @param hexString * @return */ public static byte[] hexStringToBytes(String hexString) { hexString = hexString.toUpperCase(); int length = hexString.length() / 2; char[] hexChars = hexString.toCharArray(); byte[] b = new byte[length]; for (int i = 0; i < length; i++) { int pos = i * 2; b[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); } return b; } private static byte charToByte(char c) { return (byte) "0123456789ABCDEF".indexOf(c); } public static void main(String[] args) { try { // 密钥必须是16的倍数 String keystr = "0123456789ABCDEF"; String src = "Hello World"; System.out.println("密钥:" + keystr); System.out.println("原字符串:" + src); String enc = encrypt(src, keystr); System.out.println("加密:" + enc); String dec = decrypt(enc, keystr); System.out.println("解密:" + dec); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
结果
密钥:0123456789ABCDEF 原字符串:Hello World 加密:21f41dde54d0c9703c730fd14ce47cfe 解密:Hello World
转载地址:https://cloud.tencent.com/developer/article/1823249
结果
encrypt_str: U2FsdGVkX1/QM9zoNjeuJ4AHYhjME01+XQLEOGkO3ns= decrypt_str: 123456