sm-crypto icon indicating copy to clipboard operation
sm-crypto copied to clipboard

Sm2使用hutool工具进行加解密的解决方案

Open musicguoke opened this issue 2 years ago • 3 comments

问题的原因

通常由于网上找的js端提供的 SM2代码实现的方案, 都是直接使用的私钥的d值和公钥的q值直接进行的加解密 所以后端口返回的最好是从公钥里面提取的q值,以q值做为js端的加密公钥

前端使用publicKey加密步骤

  • 后端提取 q值
SM2 sm2 = SmUtil.sm2();
String hexStr = HexUtil.encodeHexStr(((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false));//未压缩的
  • 前端加密
import { sm2 } from 'sm-crypto'
export function sm2Encrypt(data, publickey, cipherMode) {
  cipherMode = cipherMode === 0 ? cipherMode : 1
  const publicKey = hexStr  // 对应上面的 hexStr
  const encryptData = sm2.doEncrypt(data, publicKey)
  return '04' + encryptData
}

musicguoke avatar Jul 14 '22 03:07 musicguoke

非常感谢,搞了半天看到您的方案终于解决了。👍

关于 hexStr 可以简化成以下的方法调用:

String hexStr = HexUtil.encodeHexStr(sm2.getQ(false));

GunhouWong avatar Nov 03 '22 12:11 GunhouWong

后端解密的时候还是用的原始私钥进行解密吗?按照上面的方法,后端目前一直解码出错

longshihui avatar May 08 '23 07:05 longshihui

后端解密的时候还是用的原始私钥进行解密吗?按照上面的方法,后端目前一直解码出错

SM2 sm2 = SmUtil.sm2(privateKey, null); String requestBody = sm2.decryptStr("04" + requestBody, KeyType.PrivateKey); 可以用生成的Base64编码的私钥构造sm2对象来解密,需要在密文前加上04前缀

Tyler-Rabbit avatar Sep 06 '23 05:09 Tyler-Rabbit