记一Java后台SM2国密与前端联调时公钥格式问题
sm2 vue 前端 加密 解密 javaconst sm2 = require('sm-crypto').sm2;此依赖需要的公钥为16进制格式 需要后端进行转换给前端HexUtil.encodeHexStr(((BCECPublicKey)sm2.getPublicKey()).getQ().getEncoded(fa
·
起因:采用hutool工具类生成sm2公私钥
SM2 sm2= SmUtil.sm2();
公钥为
String publicKey=sm2.getPublicKeyBase64();
前端采用依赖为
const sm2 = require('sm-crypto').sm2;
常用的公私钥为
String publicKey=sm2.getPublicKeyBase64();
String privateKey=sm2.getPrivateKeyBase64();
但此前端模块需要的公钥为16进制格式 需要后端进行转换给前端
HexUtil.encodeHexStr(((BCECPublicKey)sm2.getPublicKey()).getQ().getEncoded(false));
获取16进制公钥
同时,前端加密后 后端需要进行如下操作 才能正确解码前端发来的加密密文
public String decrypt(String encryptStr){
if(!encryptStr.startsWith("04")){
encryptStr="04".concat(encryptStr);
}
return StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
}
此时 公钥格式大致为
04813d4d97ad31bd9d18d785f337f683233099d5abed09cb397152d50ac28cc0ba43711960e811d90453db5f5a9518d660858a8d0c57e359a8bf83427760ebcbba
前端加密 代码为
const sm2 = require('sm-crypto').sm2
const cipherMode = 1 // 1 - C1C3C2,0 - C1C2C3,默认为1
let encryptData = sm2.doEncrypt('需要加密的字符', publicKey, cipherMode)
csdn留言可能不及时,如果有疑问可发邮件scat1520@foxmail.com咨询
更多推荐
已为社区贡献1条内容
所有评论(0)