JAVA集成国密SM2

article/2025/8/21 11:50:12

JAVA集成国密SM2加解密

  • 一、pom配置
  • 二、代码集成
    • 2.1、目录结构
    • 2.2、源码
    • 2.3、测试
  • 三、相关链接

国密算法概述:https://blog.csdn.net/qq_38254635/article/details/131801527

SM2椭圆曲线公钥密码算法
为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。

一、pom配置

<!-- 国密 -->
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.66</version>
</dependency>

二、代码集成

2.1、目录结构

在这里插入图片描述

2.2、源码

KeyConstant.java

package com.secret.sm2;public class KeyConstant {public static final String PRIVATE_KEY = "pveky"; // 私钥public static final String PUBLIC_KEY = "pbcky"; // 公钥public static final String GM_NAME_CURVE = "sm2p256v1";public static final String ALGORITHM = "SHA1PRNG";}

ModeTypeConstant.java

package com.secret.sm2;import org.bouncycastle.crypto.engines.SM2Engine;public class ModeTypeConstant {public static final String BASE = "base";public static final String BC = "bc";@Deprecatedpublic static final SM2Engine.Mode BASE_MODE = SM2Engine.Mode.C1C3C2;@Deprecatedpublic static final SM2Engine.Mode BC_MODE = SM2Engine.Mode.C1C2C3;public static ModeTypeEnum getMode(String modeType){if (ModeTypeEnum.BASE_MODE.getType().equals(modeType)) return ModeTypeEnum.BASE_MODE;return ModeTypeEnum.BC_MODE;}}

ModeTypeEnum.java

package com.secret.sm2;import org.bouncycastle.crypto.engines.SM2Engine;public enum ModeTypeEnum {BASE_MODE(ModeTypeConstant.BASE, SM2Engine.Mode.C1C3C2),BC_MODE(ModeTypeConstant.BC, SM2Engine.Mode.C1C2C3);private String type;private SM2Engine.Mode mode;ModeTypeEnum(String type, SM2Engine.Mode mode) {this.type = type;this.mode = mode;}public String getType(){return type;}public SM2Engine.Mode getMode(){return mode;}}

SecretCommon.java

package com.secret.sm2;import org.bouncycastle.asn1.gm.GMNamedCurves;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.InvalidCipherTextException;
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.ParametersWithRandom;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.bouncycastle.util.encoders.Hex;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Map;/*** SM2公钥密码算法(非对称算法)* SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法。* 包括SM2-1椭圆曲线数字签名算法;SM2-2椭圆曲线密钥交换协议;SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。* SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。*/
public class SecretCommon {//获取椭圆曲线public static synchronized ECDomainParameters getECDomainParameters() {X9ECParameters sm2ECParameters = GMNamedCurves.getByName(KeyConstant.GM_NAME_CURVE);return new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());}/*** get key pair*/public static Map<String, String> createKeyPair() throws NoSuchAlgorithmException {ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();keyPairGenerator.init(new ECKeyGenerationParameters(getECDomainParameters(), SecureRandom.getInstance(KeyConstant.ALGORITHM)));AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair();Map<String, String> map = new HashMap<>();BigInteger bigInteger = ((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD();map.put(KeyConstant.PRIVATE_KEY, ByteUtils.toHexString(bigInteger.toByteArray()));// 把公钥放入map中,默认压缩公钥// 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥,04的时候,可以去掉前面的04ECPoint ecPoint = ((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ();map.put(KeyConstant.PUBLIC_KEY, ByteUtils.toHexString(ecPoint.getEncoded(false)));return map;}/*** 加密* @param plainText 需加密的明文字符串* @param publicKey 公钥* @param modeType base:标准;bc:BC模式*/public static String encrypt(String plainText, String publicKey, ModeTypeEnum modeType) throws IOException, InvalidCipherTextException {return encrypt(plainText.getBytes(), publicKey, modeType.getMode());}/*** 加密* @param plainByte 需加密的明文字节数组* @param publicKey 公钥* @param mode 加密模式 ModeTypeEnum*/public static String encrypt(byte[] plainByte, String publicKey, SM2Engine.Mode mode) throws IOException, InvalidCipherTextException {ECDomainParameters domainParameters = getECDomainParameters();//提取公钥点ECPoint ecPoint = domainParameters.getCurve().decodePoint(ByteUtils.fromHexString(publicKey));// 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(ecPoint, domainParameters);SM2Engine sm2Engine = new SM2Engine(mode);sm2Engine.init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom()));return ByteUtils.toHexString(sm2Engine.processBlock(plainByte, 0, plainByte.length));}/*** 解密* @param cipherText 需加密的字符串* @param privateKey 私钥* @param modeType base:标准;bc:BC模式*/public static String decrypt(String cipherText, String privateKey, ModeTypeEnum modeType) throws InvalidCipherTextException, UnsupportedEncodingException {return decrypt(Hex.decode(cipherText), privateKey, modeType.getMode());}/*** 解密* @param cipherDataByte 密文字节数组* @param privateKeyHex 私钥* @param mode 解密模式 ModeTypeEnum*/public static String decrypt(byte[] cipherDataByte, String privateKeyHex, SM2Engine.Mode mode) throws InvalidCipherTextException, UnsupportedEncodingException {BigInteger bigInteger = new BigInteger(privateKeyHex, 16);ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(bigInteger, getECDomainParameters());SM2Engine sm2Engine = new SM2Engine(mode);sm2Engine.init(false, privateKeyParameters);return new String(sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length), "utf-8");}}

Utils.java

package com.secret.sm2;import org.bouncycastle.crypto.InvalidCipherTextException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.Map;public class Utils {/*** get key pair*/public static Map<String, String> createKeyPair() throws NoSuchAlgorithmException {return SecretCommon.createKeyPair();}/*** encrypt* @param plainText 需加密的明文字符串* @param publicKey 公钥*/public static String encrypt(String plainText, String publicKey) throws IOException, InvalidCipherTextException {return encrypt(plainText, publicKey, ModeTypeConstant.BASE);}/*** encrypt* @param plainText 需加密的明文字符串* @param publicKey 公钥* @param modeType base:标准;bc:BC模式*/public static String encrypt(String plainText, String publicKey, String modeType) throws IOException, InvalidCipherTextException {return SecretCommon.encrypt(plainText, publicKey, ModeTypeConstant.getMode(modeType));}/*** decrypt* @param cipherText 需加密的字符串* @param privateKey 私钥*/public static String decrypt(String cipherText, String privateKey) throws InvalidCipherTextException, UnsupportedEncodingException {return decrypt(cipherText, privateKey, ModeTypeConstant.BASE);}/*** decrypt* @param cipherText 需加密的字符串* @param privateKey 私钥* @param modeType base:标准;bc:BC模式*/public static String decrypt(String cipherText, String privateKey, String modeType) throws InvalidCipherTextException, UnsupportedEncodingException {return SecretCommon.decrypt(cipherText, privateKey, ModeTypeConstant.getMode(modeType));}}

测试类:Test.java

package com.secret.sm2;import java.util.Map;public class Test {public static void main(String[] args) throws Exception {Map<String, String> createKeyPair = Utils.createKeyPair();System.out.println("秘钥对:" + createKeyPair);String privateKey = createKeyPair.get(KeyConstant.PRIVATE_KEY);String publicKey = createKeyPair.get(KeyConstant.PUBLIC_KEY);String text = "I believe you can do anything";String encrypt = Utils.encrypt(text, publicKey);System.out.println("加密后密文:" + encrypt);String decrypt = Utils.decrypt(encrypt, privateKey);System.out.println("解密后明文:" + decrypt);}}

2.3、测试

测试结果如图:
在这里插入图片描述
使用方法参考测试类即可。

三、相关链接

国密算法概述:https://blog.csdn.net/qq_38254635/article/details/131801527

JAVA集成国密SM3:https://blog.csdn.net/qq_38254635/article/details/131810696

JAVA集成国密SM4:https://blog.csdn.net/qq_38254635/article/details/131810715


http://chatgpt.dhexx.cn/article/6iyNlxFq.shtml

相关文章

Java SM2

pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http…

ECCSM2

ECC&SM2 ECC 基本内容 概念 ECC 全称为椭圆曲线加密&#xff0c;EllipseCurve Cryptography&#xff0c;是一种基于椭圆曲线数学的公钥密码。与传统的基于大质数因子分解困难性的加密方法(RSA)不同&#xff0c;ECC 依赖于解决椭圆曲线离散对数问题的困难性。它的优势主要…

C# SM2

Cipher using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.Math.EC;namespace SM2Test {/// <summary>/// 密码计算/// </summary>public…

Springboot整合SM2加密的笔记

首先要明白公钥是加密&#xff0c;私钥用来解密。 国密公钥格式&#xff1a;公钥为64位&#xff0c;前后各32位&#xff0c;对应椭圆算法中BigInteger X 和 BigInteger X &#xff0c;私钥为32位&#xff0c;对应算法中的BigInteger d。 工具类&#xff1a; 可以参考https:/…

SM2加解密、签名验签

导论 SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法&#xff0c;在我们国家商用密码体系中被用来替换RSA算法。 国产SM2算法&#xff0c;是基于ECC的&#xff0c;但二者在签名验签、加密解密过程中或许有些许区别&#xff0c;目前鄙人还不太清楚&#xff0c…

sm2和sm4加密算法浅析

sm2和sm4加密算法浅析 一: SM2 简介&#xff1a;SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法 &#xff0c;SM2为非对称加密&#xff0c;基于ECC。该算法已公开。由于该算法基于ECC&#xff0c;故其签名速度与秘钥生成速度都快于RSA。ECC 256位&#xff0…

国密算法(SM2)简介及SM2生成秘钥

国密算法&#xff08;SM2&#xff09;生成秘钥 一、国密算法介绍二、SM2算法和RSA算法比较三、生成SM2秘钥1、openssl生成SM2秘钥1.1、安装openssl1.2、生成SM2私钥1.3、生成SM2公钥 2、nodejs:使用sm-crypto包生成SM2秘钥3、c生成秘钥 参考 一、国密算法介绍 国密即国家密码局…

向量积(叉积)

a和b叉积可表示为ab&#xff0c;结果是一个和这两个向量都垂直的伪向量 ab absinθ*n &#xff0c;ab为两向量的模长&#xff0c;θ是两向量的夹角&#xff0c;n是垂直二者的单位向量。 叉积的长度可以理解为以ab为邻边的平行四边形面积 叉积的运算 反交换律 ab-ba 分配律…

向量的点乘(内积)和叉乘(外积)

向量点乘&#xff1a;a * b&#xff08;常被写为a b&#xff09; 点乘,也叫向量的内积、数量积.顾名思义,求下来的结果是一个数. 向量a向量b|a||b|cos 在物理学中,已知力与位移求功,实际上就是求向量F与向量s的内积,即要用点乘. 向量叉乘&#xff1a;a ∧ b&#xff08;常被…

向量的内积(点乘)与外积(叉乘)

向量的内积&#xff08;点乘&#xff09;与外积&#xff08;叉乘&#xff09; 向量的内积点乘 向量的外积叉乘 向量的内积&#xff08;点乘&#xff09; 内积的几何意义&#xff1a; 用来表征或计算两个向量之间的夹角在b向量在a向量方向上的投影。 向量的外积&#xff08;叉…

两向量的向量积

两向量的向量积 两向量 a 与 b 的向量积&#xff08;外积&#xff09;是一个向量&#xff0c;记做 a b \mathbf{a}\times \mathbf{b} ab 或 [ a b ] [\mathbf{a}\mathbf{b}] [ab]&#xff0c;它的模是 ∣ a b ∣ ∣ a ∣ ∣ b ∣ sin ⁡ ∠ ( a , b ) |\mathbf{a}\times…

8.2 向量数量积与向量积(点乘与叉乘)

本篇内容依然是向量的运算&#xff0c;只不过不属于线性运算&#xff0c;内容包括向量的数量积与向量积。 一、向量的数量积&#xff08;内积、点乘&#xff0c;参与运算的是向量&#xff0c;结果是数&#xff09; &#xff08;一&#xff09;问题产生的背景与表达 &#x…

【口诀】巧记泰勒公式

函数 多项式函数 可以计算出精确值 非多项式函数 无法计算出精确值 泰勒公式的本质 多项式函数逼近非多项式函数 随着项数累加&#xff0c;逼近的误差就会越小 规律&#xff1a; 只需要确定x的指数符号只有两种情况 要么符号相同(全为) 要么符号交替( -)开头要么1&am…

matlab泰勒公式含义,泰勒公式的哲学意义与敏捷研发

学过微积分的人都知道泰勒展开公式,它是将一个在x=x0处具有n阶导数的函数f(x)利用关于(x-x0)的n次多项式来逼近函数的方法,用标准的数学术语来描述是这样的:若函数f(x)在包含x0的某个闭区间[a,b]上具有n阶导数,且在开区间(a,b)上具有(n 1)阶导数,则对闭区间[a,b]上任意一点…

泰勒公式及泰勒级数

目录 一、背景二、提出问题三、解决问题四、应用——泰勒级数※ 函数的幂级数展开 参考文献 一、背景 对于一些复杂的函数&#xff0c;通常会找简单的函数做近似&#xff0c;而多项式函数就是常用的一种简单函数。 比如当 ∣ x ∣ |x| ∣x∣ 很小时&#xff0c;有以下近似&a…

泰勒公式求极限(如何用+精度怎么确定)一文扫除泰勒公式难点

有些复杂的极限题&#xff0c;里面会涵盖着各种各样的函数&#xff0c;这些群魔乱舞的函数加大了我们计算极限的难度&#xff0c;此时想&#xff1a;如果可以将这些函数统一成一样的形式该多好?此时&#xff0c;就有我们的泰勒公式了。 1.泰勒公式怎么用&#xff1a; 指数函…

泰勒公式记忆方法

泰勒公式记忆方法 几个常见函数的泰勒公式 f ( x ) f ( x 0 ) f ′ ( x 0 ) ( x − x ) f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 ⋯ f ( n ) ( x 0 ) n ! ( x − x 0 ) n R n ( x ) f ( x ) f ( 0 ) f ′ ( 0 ) x f ′ ′ ( 0 ) 2 ! x 2 ⋯ f ( n ) ( 0 ) n ! x n o (…

理解高斯分布

开始前&#xff0c;先看几个重要概念&#xff1a; 概率函数&#xff1a;把事件概率表示成关于事件变量的函数 概率分布函数&#xff1a;一个随机变量ξ取值小于某一数值x的概率&#xff0c;这概率是x的函数&#xff0c;称这种函数为随机变量ξ的分布函数&#xff0c;简称分布…

透彻理解高斯分布

https://www.toutiao.com/a6639894224189784590/ 2018-12-28 12:22:15 正态分布是与中的定量现象的一个方便模型。各种各样的心理学测试分数和现象比如计数都被发现近似地服从正态分布。 开始前&#xff0c;先看几个重要概念&#xff1a; 概率函数&#xff1a;把事件概率表示成…

高斯分布的一些理解

转自&#xff1a;http://blog.csdn.net/rns521/article/details/6953591 正态分布&#xff08;Normal distribution&#xff09;又名高斯分布&#xff08;Gaussian distribution&#xff09;&#xff0c;是一个在数学、物理及工程等领域都非常重要的概率分布&#xff0c;在统计…