sm-crypto
sm-crypto copied to clipboard
Sm2使用hutool工具进行加解密的解决方案
问题的原因
通常由于网上找的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
}
非常感谢,搞了半天看到您的方案终于解决了。👍
关于 hexStr 可以简化成以下的方法调用:
String hexStr = HexUtil.encodeHexStr(sm2.getQ(false));
后端解密的时候还是用的原始私钥进行解密吗?按照上面的方法,后端目前一直解码出错
后端解密的时候还是用的原始私钥进行解密吗?按照上面的方法,后端目前一直解码出错
SM2 sm2 = SmUtil.sm2(privateKey, null);
String requestBody = sm2.decryptStr("04" + requestBody, KeyType.PrivateKey);
可以用生成的Base64编码的私钥构造sm2对象来解密,需要在密文前加上04前缀