国密算法SM2、SM3

国密简介

国密算法是国家商用密码管理办公室制定的一系列密码标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)那等等。在终端设备上通常需要使用内嵌国密算法的安全芯片配合使用,倚靠安全芯片的安全性来实现密钥的存储和安全防护。

常用国密算法概述:

SM1算法: 对称加密算法其加密强度与AES相当。该算法不公开,仅以IP核的形式存在于芯片中。需要通过加密芯片的接口进行调用。

SM2算法:非对称算法其实现基于ECC算法。SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。SM2以其高安全性和运算快速的特点在数据安全领域应用越来越广泛。

SM3算法:该算法为摘要算法,可以用MD5作为对比理解。校验结果为256位。适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。

SM4算法: 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。 由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。

SM7算法:是一种分组密码算法,分组长度为128比特,密钥长度为128比特。SM7适用于非接触式IC卡,应用包括身份识别类应用(门禁卡、工作证、参赛证),务类应用(赛事门、展会门****),支付与通卡类应用(校园一卡通、企业一卡通等)。

以下基于前后端实现SM2、SM3

SM2算法

前端实现

引入sm2.js

链接:https://pan.baidu.com/s/1JuvDlJAWjOltTkbTx5VsZA?pwd=b0cd
提取码:b0cd

js方法

<script>
		//私钥
		var prikeyHex = "ec7a560e2b793c2c8b7c530ffa8a03f1ecc2e5a86fc97ca073bdc424eabb02d3";
		//公钥
        var pubkeyHex = "047ff659319cb4fa8f1d97548b98cbfbd36037d80eacbc502590baf9dfe2a296e5b548d3ff61f12fa30fd71a1fcd554511e3ed7616318da1fc51f17ad01c20c8bc";
        
		//加密
        function generateCipher() {
   
            var msg = 'c7f9ff6d97ca9e95d8e6ac784a6c96f2989071b5cc1cea976db41feb09d900c3';
			var encryptData = sm2.doEncrypt(msg, pubkeyHex, 0);
            console.log(encryptData);
        }
	
		//解密,后台加密的数据需要去除04
        function clearCipher() {
   
            var msg = 加密数据;
			var encryptData = sm2.doDecrypt(msg, prikeyHex, 0);
            console.log(encryptData);
        }
		
    </script>

后台实现

引入相应jar包

compile group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.70'

工具类

import java.math.BigInteger;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import org.bouncycastle.asn1.gm.GMNamedCurves;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithID;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.signers.SM2Signer;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.util.Strings;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SM2Util {
   

    //日志
    private static final Logger log = LoggerFactory.getLogger(SM2Util.class);

    /**
     * 生成SM2公私钥对
     *
     * @return 公私钥对
     */
    private static AsymmetricCipherKeyPair genKeyPair0() {
   
        //获取一条SM2曲线参数
        X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");

        //构造domain参数
        ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(),
                                                                     sm2ECParameters

你可能感兴趣的:(密码学,算法,网络,国密)