JS使用国密2(sm2)配合后端做参数加密

需要的工具  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);

你可能感兴趣的:(javascript)