需要的工具 smCrypto
安装 yarn add sm-crypto
encoded.js
import smCrypto from "sm-crypto";
/**
* 用于加密数据
* @param {any} msgString - 需加密的数据
* @param {string} publicKey - 加密公钥
* @return {string} 加密后的字符串
*/
export function doEncrypt(msgString, publicKey) {
let msg = msgString;
if (typeof (msgString) !== "string") {
msg = JSON.stringify(msgString);
}
let sm2 = smCrypto.sm2;
// 1 - C1C3C2; 0 - C1C2C3; 默认为1
let cipherMode = 1; // 特别注意,此处前后端需保持一致
const publicKey2 = "04bbfbea94e01445784544b29b9430a7b5309d6c93d0a05df2bfd43497f7f8de20cce0bf934f69e90ea399b372865899506a0abccd23a660dd191480014f2857cf";
// 加密结果
let encryptData = sm2.doEncrypt(msg, publicKey, cipherMode);
// 加密后的密文前需要添加04,后端才能正常解密
return "04" + encryptData;
}
/**
* 用于解密数据
* @param {any} enStr - 待解密的数据
* @param {string} privateKey - 解密私钥
* @return {string} 解密后的字符串
*/
export function doDecryptStr(enStr, privateKey) {
let msg = enStr;
if (typeof (enStr) !== "string") {
msg = JSON.stringify(enStr);
}
let sm2 = smCrypto.sm2;
// 1 - C1C3C2; 0 - C1C2C3; 默认为1
let cipherMode = 1;
const privateKey1 = "287eef8b13aeacd980427a902b20e9746f481258b06a2f30e8c0735b2efc6652";
// 加密后的密文,需要前去掉04。因为doDecrypt中自行添加了04,后端加密代码也自行添加了04
let en = msg.substr(2);
// 解密结果
return sm2.doDecrypt(en, privateKey, cipherMode);
}
使用:
// 公钥
const publicKey = "04bbfbea94e01445784544b29b9430a7b5309d6c93d0a05df2bfd43497f7f8de20cce0bf934f69e90ea399b372865899506a0abccd23a660dd191480014f2857cf";
// 私钥
const privateKey = "287eef8b13aeacd980427a902b20e9746f481258b06a2f30e8c0735b2efc6652";
const data = "测试使用SM2加密、解密";
const a = doEncrypt(data, publicKey);
const b = doDecryptStr(a, privateKey);
console.log(a, b);