AES前后台加密解密流程--对接小程序版

前端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

猜你喜欢

转载自blog.csdn.net/qq_39669916/article/details/82146837
今日推荐