0


前端sm2国密加密解密

1.下载国密包

npm i sm-crypto

2.获取后端的公钥注sm-crypto使用BC库加解密前端密钥与后端密钥是两队,非常规的base64密钥
前端公钥需要在前面加04占位否则无法解密

// 前端公钥
const publicKey ='0453bac6d2499e427529b3fcd213c33fed87a596d27c52334d457c222c729727925bae7bd7937b2dee449303faf69f128ea7530994d7a9e1272e14e6efef5437ca';
// 前端私钥
const privateKey ='009c2d9397afd38f5fe46d85611f55ebb8118c3b148d51fe8cc26a509215d49a33'
// 后端公钥
const publicKey ='MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEq+OqrQd71xbWD50ks7zfikU7ec64O8fp0d6yuEbadmURoZl4P07I1aEm4bjGvxmP6XP65tqNJWgTDomLhvrpUQ==';
// 后端私钥
const privateKey ='MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgn1ABWedtUoujWXCCwMfKnCXLgj1riMWf/S2SB6xodZKgCgYIKoEcz1UBgi2hRANCAASr46qtB3vXFtYPnSSzvN+KRTt5zrg7x+nR3rK4Rtp2ZRGhmXg/TsjVoSbhuMa/GY/pc/rm2o0laBMOiYuG+ulR'

java 密钥生成方式
SM2 sm2 = SmUtil.sm2();
String privateKey = sm2.getPrivateKeyBase64();  // 私钥
String publicKey = sm2.getPublicKeyBase64();  // 公钥
String privateQKey = HexUtil.encodeHexStr(BCUtil.encodeECPrivateKey(sm2.getPrivateKey()));  // 前端使用的私钥
String publicQKey = HexUtil.encodeHexStr(((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false));  // 前端使用的公钥

3.前端使用公钥进行加密

  • 生成的加密串加04方便后端解密
/**
 * 国密sm2加密
 * @param str 需要加密的文本
 * @param publicKey 公钥
 * @param cipherMode sm2的加解密时有两种方式即0——C1C2C3、1——C1C3C2,前后端需要统一
 * @returns 加密后的数据
 */
export function sm2Encryption(str: string, publicKey: string = Global.commonPubilcKey,cipherMode =1) {
  const sm2 = smCrypto.sm2;
  // 加密
  return sm2.doEncrypt(str, publicKey,cipherMode );
}

4.前端使用私钥解密

/**
 * TODO: 国密sm2解密
 * @param privateKey 前端私钥
 * @param cipherMode sm2的加解密时有两种方式即0——C1C2C3、1——C1C3C2,前后端需要统一
 * @returns 解密后的数据
 */
export function sm2DoDecrypt(
  data: string,
  privateKey: string = Global.privateKey,
  cipherMode =1
) {
  const sm2 = smCrypto.sm2;
  // 解密
  return sm2.doDecrypt(data, privateKey, cipherMode );
}

本文转载自: https://blog.csdn.net/sghu8023/article/details/129323763
版权归原作者 sghu8023 所有, 如有侵权,请联系我们删除。

“前端sm2国密加密解密”的评论:

还没有评论