最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

当前动态:前后端AES加密解密,CryptoJS和Java实现

来源:博客园

原文链接:https://blog.csdn.net/lsvtogergo/article/details/80804312

前端使用CryptoJS

下载CryptoJS, Github : https://github.com/brix/crypto-js


(相关资料图)

一、使用CBC模式1、前端实现引入JS

<script src="./js/crypto-js.js"></script><script src="./js/aes.js"></script>12<script> var key = "3132333435363738393041424344454631323334353637383930414243444566"; console.log("密钥:", key); key = CryptoJS.enc.Hex.parse(key) iv = CryptoJS.enc.Hex.parse("30313233343536373839414243444546") var src = "werty7890"; console.log("原字符串:", src); var enc = CryptoJS.AES.encrypt(src ,key,{ iv:iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 })

//console.log("加密:",enc.toString()); var enced = enc.ciphertext.toString() console.log("加密:", enced);

var dec = CryptoJS.AES.decrypt(CryptoJS.format.Hex.parse(enced), key,{ iv:iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }) console.log("解密:",CryptoJS.enc.Utf8.stringify(dec));</script>123456789101112131415161718192021222324结果:

2、后端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 iv = "0123456789ABCDEF";//偏移量字符串必须是16位 当模式是CBC的时候必须设置偏移量 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() throws UnsupportedEncodingException { IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("utf-8")); System.out.println("偏移量:"+byteToHexString(ivParameterSpec.getIV())); return ivParameterSpec; }

public static byte[] encrypt(String src, byte[] key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, InvalidAlgorithmParameterException { SecretKey secretKey = new SecretKeySpec(key, Algorithm); IvParameterSpec ivParameterSpec = getIv(); Cipher cipher = Cipher.getInstance(AlgorithmProvider); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec); byte[] cipherBytes = cipher.doFinal(src.getBytes(Charset.forName("utf-8"))); return cipherBytes; }

public static byte[] decrypt(String src, byte[] key) throws Exception { SecretKey secretKey = new SecretKeySpec(key, Algorithm);

IvParameterSpec ivParameterSpec = getIv(); Cipher cipher = Cipher.getInstance(AlgorithmProvider); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec); byte[] hexBytes = hexStringToBytes(src); byte[] plainBytes = cipher.doFinal(hexBytes); return plainBytes; }

/** * 将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 { // byte key[] = generatorKey(); // 密钥必须是16的倍数 byte key[] = "1234567890ABCDEF1234567890ABCDEf".getBytes("utf-8");//hexStringToBytes("0123456789ABCDEF"); String src = "werty7890"; System.out.println("密钥:"+byteToHexString(key)); System.out.println("原字符串:"+src);

String enc = byteToHexString(encrypt(src, key)); System.out.println("加密:"+enc); System.out.println("解密:"+new String(decrypt(enc, key), "utf-8")); } 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(); } }}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125结果

二、使用ECB模式1、前端实现引入JS

<script src="./js/crypto-js.js"></script><script src="./js/aes.js"></script>12<script> var key = "3132333435363738393041424344454631323334353637383930414243444566"; console.log("密钥:", key); key = CryptoJS.enc.Hex.parse(key) //iv = CryptoJS.enc.Hex.parse("30313233343536373839414243444546") //console.log("偏移量:",CryptoJS.enc.Hex.stringify(iv)); var src = "werty7890"; console.log("原字符串:", src); var enc = CryptoJS.AES.encrypt(src ,key,{ //iv:iv, mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })

//console.log("加密:",enc.toString()); var enced = enc.ciphertext.toString() console.log("加密:", enced);

var dec = CryptoJS.AES.decrypt(CryptoJS.format.Hex.parse(enced), key,{ //iv:iv, mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }) console.log("解密:",CryptoJS.enc.Utf8.stringify(dec));</script>12345678910111213141516171819202122232425结果:

2、后端实现

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 iv = "0123456789ABCDEF";//偏移量字符串必须是16位 当模式是CBC的时候必须设置偏移量 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 IvParameterSpec getIv() throws UnsupportedEncodingException { IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("utf-8")); System.out.println("偏移量:"+byteToHexString(ivParameterSpec.getIV())); return ivParameterSpec; }

public static byte[] encrypt(String src, byte[] key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, InvalidAlgorithmParameterException { SecretKey secretKey = new SecretKeySpec(key, Algorithm); //IvParameterSpec ivParameterSpec = getIv(); Cipher cipher = Cipher.getInstance(AlgorithmProvider); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] cipherBytes = cipher.doFinal(src.getBytes(Charset.forName("utf-8"))); return cipherBytes; }

public static byte[] decrypt(String src, byte[] key) throws Exception { SecretKey secretKey = new SecretKeySpec(key, Algorithm);

//IvParameterSpec ivParameterSpec = getIv(); Cipher cipher = Cipher.getInstance(AlgorithmProvider); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] hexBytes = hexStringToBytes(src); byte[] plainBytes = cipher.doFinal(hexBytes); return plainBytes; }

/** * 将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 { // byte key[] = generatorKey(); // 密钥必须是16的倍数 byte key[] = "1234567890ABCDEF1234567890ABCDEf".getBytes("utf-8");//hexStringToBytes("0123456789ABCDEF"); String src = "werty7890"; System.out.println("密钥:"+byteToHexString(key)); System.out.println("原字符串:"+src);

String enc = byteToHexString(encrypt(src, key)); System.out.println("加密:"+enc); System.out.println("解密:"+new String(decrypt(enc, key), "utf-8")); } 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(); } }}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125结果

关键词: 原字符串