新建crypto.js文件,封装aes和国密sm4加密解密方法,导出加解密方法(入参均为需要加解密的数据)

相关依赖如下:

1.AES
npm i --save crypto-js    
2.国密sm4
npm i --save sm-crypto

代码如下:                  

// 引入crypto-js的核心文件和AES模块
import CryptoJS from 'crypto-js';
//生成规则密钥(前后端约定好的规则生成的key,这里要自己补充)
export function generateKeyBasedOnToday() {
  return key;
}
// 将字符串转换为字节数组
export function stringToBytes(str) {
  return new TextEncoder().encode(str);
}
/**
* [AES 解密]
*/
export function decryptData(result) {
	var content =decodeURIComponent(result) ;
	var key = CryptoJS.enc.Utf8.parse(generateKeyBasedOnToday());
	var bytes = CryptoJS.AES.decrypt(content.toString(), key, {
		mode: CryptoJS.mode.ECB,
		padding: CryptoJS.pad.Pkcs7
	});
	var decryptResult = bytes.toString(CryptoJS.enc.Utf8);
	console.log('解密',decryptResult)
  return decryptResult
}
/*
* [AES 加密]
*/
export function encryptData(data) {
  // const secretKey = generateKeyBasedOnToday(); 
	var keyUtf8 = CryptoJS.enc.Utf8.parse(generateKeyBasedOnToday()); //密钥,16位
  const dataUtf8 = CryptoJS.enc.Utf8.parse(data);
    // 使用AES进行加密,使用ECB模式和PKCS7填充
    const encrypted = CryptoJS.AES.encrypt(dataUtf8, keyUtf8, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    // 对结果进行Base64编码
    const base64Result = encrypted.toString();
    // URL编码返回结果
    const encodedResult = encodeURIComponent(base64Result);

   console.log('decryptData(encodedResult)',decryptData(encodedResult));
    
    return encodedResult;
}

// 引入sm-crypto的核心文件和sm4国密模块
import smCrypto from 'sm-crypto';
// [国密 加密]
const pwdKey = stringToBytes(generateKeyBasedOnToday()) //密钥替换为后端密钥
export function encryptData(text) {
	const gmCryptConfigSet = {
		mode: 'ecb',
		output: 'string'
	};
  const ciphertext = smCrypto.sm4.encrypt(stringToBytes(text), pwdKey, gmCryptConfigSet)
  console.log('加密数据',ciphertext);
    return ciphertext
}
// [国密 解密]
export function decryptData(result,key) {
	const gmCryptConfigSet = {
		mode: 'ecb',
		output: 'string'
	};
  const decryptedText = smCrypto.sm4.decrypt(result,stringToBytes(key), gmCryptConfigSet);
  console.log('解密数据',decryptedText||'error');
	return decryptedText
}


使用:

import { decryptData ,encryptData} from "@/utils/crypto.js"


// data:需加密的数据(加密时的密钥key已经在crypto.js文件中直接使用了,如果密钥生成有特殊要求则按照解密的方式自行修改)
encryptData(data)

// data:需解密的数据
// key:密钥
decryptData(data,key)

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐