记一Java后台SM2国密与前端联调时公钥格式问题

起因:采用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留言可能不及时,如果有疑问可发邮件[email protected]咨询

猜你喜欢

转载自blog.csdn.net/qq_25484769/article/details/123086835
今日推荐