IT俱乐部 JavaScript vue Aes加解密实践

vue Aes加解密实践

vue Aes 加解密

安装crypto-js

npm install crypto-js

微信小程序直接导入

const CryptoJS = require('../../common/crypto-js/crypto-js'); //引用AES源码js

封装

import CryptoJS from "crypto-js";

//32位密钥
const keyStr = '16aef158550545688ae8ab0835aeb5dd';

//如果是16位密钥则不需要下列操作
let key = CryptoJS.SHA1(CryptoJS.SHA1(keyStr)).toString().substring(0, 32);
let realKey = CryptoJS.enc.Hex.parse(key);

//偏移量 没啥用 不太懂
const IV = '';

let tools = {
     //加密
       encrypt(word) {
         let encrypted = CryptoJS.AES.encrypt(word, realKey, {
           mode: CryptoJS.mode.ECB,
           padding: CryptoJS.pad.Pkcs7
         });
         
         // 如果加密后的密文,需要16进制返回的,使用 
                 //return encrypted.ciphertext.toString()
         // 如果加密后的密文,使用的是base64格式的, 使用直接使用 
                  //return encrypted.toString()
                  
         return encrypted.ciphertext.toString();
       },
       //解密
       decrypt(word) {
           
        // 将16进制 转换为Base64字符串
        var contentHexStr = CryptoJS.enc.Hex.parse(word);
        var srcs = CryptoJS.enc.Base64.stringify(contentHexStr);
        
        let decrypt = CryptoJS.AES.decrypt(srcs, realKey, {
           mode: CryptoJS.mode.ECB,
           padding: CryptoJS.pad.Pkcs7
         });
         return CryptoJS.enc.Utf8.stringify(decrypt).toString();
       }

};

export default tools;

调用

import tools from '../../common/js/utils/crypto-js';

let a = tools.encrypt("{"fLoyaltyId":"7004900004135957810","signType":"0"}");
let b = tools.decrypt(a);

后端工具类

package com.lf.gas_platform.common.utils;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;


/*
 * AES对称加密和解密
 */
public class AESUtil {
    public static byte[] encrypt(String content, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance( "AES" );
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
            secureRandom.setSeed(password.getBytes());
            kgen.init(128,secureRandom);
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] result = cipher.doFinal(byteContent);
            return result;

        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 解密AES加密过的字符串
     *
     * @param content
     *            AES加密过过的内容
     * @param password
     *            加密时的密码
     * @return 明文
     */
    public static byte[] decrypt(byte[] content, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance( "AES" );
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
            secureRandom.setSeed(password.getBytes());
            kgen.init(128,secureRandom);
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] result = cipher.doFinal(content);
            return result;

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**将二进制转换成16进制
     * @param buf
     * @return
     */
    public static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i 

这个是RSA加密跟上面的AES没关系,密钥长度过长可能需要 修改加密的源码 下面是已经修改好的

	import JSEncrypt from './jsencrypt.min.js';
	export default {
		data() {
			return {

			}
		},
		methods: {

		},
		encryptUnicodeLong: function(publicKey, string) {
			const encrypt = new JSEncrypt();
			encrypt.setPublicKey(publicKey);
			var k = encrypt.getKey();
			//根据key所能编码的最大长度来定分段长度。key size - 11:11字节随机padding使每次加密结果都不同。
			var maxLength = ((k.n.bitLength() + 7) >> 3) - 11;
			try {
				var subStr = "",
					encryptedString = "";
				var subStart = 0,
					subEnd = 0;
				var bitLen = 0,
					tmpPoint = 0;
				for (var i = 0, len = string.length; i < len; i++) {
					//js 是使用 Unicode 编码的,每个字符所占用的字节数不同
					var charCode = string.charCodeAt(i);
					if (charCode <= 0x007f) {
						bitLen += 1;
					} else if (charCode <= 0x07ff) {
						bitLen += 2;
					} else if (charCode  maxLength) {
						subStr = string.substring(subStart, subEnd)
						encryptedString += encrypt.encrypt(subStr);
						subStart = subEnd;
						bitLen = bitLen - tmpPoint;
					} else {
						subEnd = i;
						tmpPoint = bitLen;
					}
				}
				subStr = string.substring(subStart, len)
				encryptedString += encrypt.encrypt(subStr);
				return encryptedString;
			} catch (ex) {
				return false;
			}
		},
		getRealLen: function(str) {
			return str.replace(/[^x00-xff]/g, '__').length;

		},
		setEncryptList: function(publicKey, str, max) {
			var arr = []

			var s = str,
				reg = /.{40}/g,
				ppstr = s.match(reg);
			ppstr.push(s.substring(ppstr.join('').length));

			for (var nux = 0; nux  116) {
					var list = this.setEncryptList(publicKey, ppstr[nux], Nax)
					for (var nu = 0; nu  117){
			// 	return setEncrypt(publicKey,data)
			// }
			var s = data,
			reg = /.{116}/g,
			rs = s.match(reg);
			if (rs === null) {
				console.log(data, '进入短加密')
				return this.setEncrypt(publicKey, data)
			}
			// debugger;
			rs.push(s.substring(rs.join('').length));
			var arr = [];
			for (var n = 0; n  116) {

					var list = this.setEncryptList(publicKey, rs[n], max)
					for (var nu = 0; nu < list.length; nu++) {
						arr.push(list[nu]);
					}
				} else {

					arr.push(this.setEncrypt(publicKey, rs[n]));
				}

			}
			return arr;
		},
		setDecryptArray: function(PrivateKey, ArrayData) {
			var Decrypt = "";
			for (var n = 0; n < ArrayData.length; n++) {
				Decrypt = Decrypt + this.setDecrypt(PrivateKey, ArrayData[n]);
			}
			return Decrypt;
		},
		setDecrypt: function(PrivateKey, data) {
			const encrypt = new JSEncrypt();
			encrypt.setPrivateKey(PrivateKey);

			return encrypt.decrypt(data);
		}
	}


总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/navsub/js/17770.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部