前后端AES加密解密,前端使用CryptoJS,后端Java实现

匿名 (未验证) 提交于 2019-12-02 21:53:52

前端使用CryptoJS

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

引入JS

<script src="./js/crypto-js.js"></script> <script src="./js/aes.js"></script>
<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>

结果:

 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();         }     } } 

结果

引入JS

<script src="./js/crypto-js.js"></script> <script src="./js/aes.js"></script>
<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>

结果:

 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();         }     } } 

结果

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!