国密SM2的前端加密,后端解密(Java版本)及SM3 摘要加密

一、简介

国密即国家密码局认定的国产密码算法。常用的主要有SM2,SM3,SM4。
SM2:椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。
SM3:消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
SM4:对称加密,密钥长度和分组长度均为128位。

由于国际环境(与美国的关系),我们在加密领域也基本切换为国密算法。

在有些项目中,没有使用HTTPS的时候,登录的口令(用户名/密码),需要进行加密传输的需求,这时候我们就需要采用非对称加密来实现。

故: 前端采用公钥加密, 后端私钥解密。

经过多次的百度及代码验证,折腾,最终找好了合适的方案。

前端加密

前端加密js示例:





    
    

    
    SM2 Algorithm Encryption and Decryption sample
    
    
    
    






SM2 Certificate Encryption

SM2证书加密

后端加密

下面是我封装的工具类:

package com.topinfo.basic.platform.common.sm;

import com.topinfo.basic.platform.common.sm.sm2.KeyVo;
import com.topinfo.basic.platform.common.sm.sm2.SM2EncDecUtils;
import com.topinfo.basic.platform.common.sm.sm2.SM2KeyVO;

/**
 * @ClassName: Sm2Util
 * @Description: Sm2 加密工具类
 * @Author: 杨攀
 * @Date: 2020/12/10 16:47
 * @Copyright: 2020 www.tuxun.net Inc. All rights reserved.
 */
public class TpSm2Util {



    /**
     * 生成非对称秘钥对
     * @author 杨攀
     * @date 2020/12/11 10:50
     * @param
     * @return com.topinfo.basic.platform.common.sm.sm2.KeyVo
     */
    public static KeyVo generateKeyPair() {
        SM2KeyVO sm2KeyVO = SM2EncDecUtils.generateKeyPair();
        KeyVo vo = new KeyVo(sm2KeyVO.getPubHexInSoft(), sm2KeyVO.getPriHexInSoft());
        return vo;
    }


    /**
     * 加密
     * @author 杨攀
     * @date 2020/12/11 10:54
     * @param publicKeyHex 公钥
     * @param plainText 明文
     * @return java.lang.String
     */
    public static String  encrypt(String publicKeyHex, String plainText) {
        String cipherText = SM2EncDecUtils.encrypt(publicKeyHex, plainText);
        return cipherText;
    }


    /**
     * 解密
     * @author 杨攀
     * @date 2020/12/11 10:56
     * @param privateKeyHex 私钥
     * @param cipherText 密文
     * @return java.lang.String
     */
    public static String  decrypt(String privateKeyHex, String cipherText) {
        byte[] decryptData = SM2EncDecUtils.decrypt(privateKeyHex, cipherText);
        String  plainText = new String(decryptData);
        return plainText;
    }

}

一开始,后端使用hutool的工具类, 发现hutool的key生成与前端JS的不同,使用的算法不一样,使用不得已在重现找了一个。

代码比较多,这里没提供上次附件,代码我上传:
链接: https://pan.baidu.com/s/1JiqS... 提取码: qnav 复制这段内容后打开百度网盘手机App,操作更方便哦

使用前需要依赖:



    org.bouncycastle
    bcprov-jdk15to18
    1.66

你可能感兴趣的:(javascript,前端,java)