目录

一、引入jar包

二、生成秘钥对,加解密工具类


一、引入jar包

        <!-- sm2加密依赖 --><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version></dependency>

二、生成秘钥对,加解密工具类

import org.apache.tomcat.util.codec.binary.Base64;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.security.*;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;/*** @ClassName* @Description 加密工具类* @Author csn* @Date 14:54 2022/11/14* @Version V1.0**/
public class PassUtils {private static Logger logger = LoggerFactory.getLogger(PassUtils.class);private static final SM2Engine.Mode DIGEST = SM2Engine.Mode.C1C3C2;/*** @Description: 生成sm2秘钥对* @Author: csn* @date: 2022/11/14*/public static KeyPair createSm2Key() {try {//使用标准名称创建EC参数生成的参数规范final ECGenParameterSpec sm2p256v1 = new ECGenParameterSpec("sm2p256v1");// 获取一个椭圆曲线类型的密钥对生成器final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());// 使用SM2的算法区域初始化密钥生成器kpg.initialize(sm2p256v1, new SecureRandom());// 获取密钥对return kpg.generateKeyPair();} catch (Exception e) {logger.error("生成秘钥对失败{}", e.getMessage());return null;}}/*** sm2公钥加密方法* @param publicKeyStr 加密的公钥* @param data         需要加密的数据* @return 返回加密后的字符串*/public static String encryptSm2(String publicKeyStr, String data) {try {//算法工具包Security.addProvider(new BouncyCastleProvider());//将公钥字符串转为公钥字节byte[] bytes = Base64.decodeBase64(publicKeyStr);KeyFactory keyFactory = KeyFactory.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);logger.info("获取转换后的公钥");PublicKey publicKey = keyFactory.generatePublic(keySpec);logger.info("开始加密");CipherParameters pubKeyParameters = new ParametersWithRandom(ECUtil.generatePublicKeyParameter(publicKey), new SecureRandom());SM2Engine sm2Engine = new SM2Engine();sm2Engine.init(true, pubKeyParameters);byte[] arrayBytes = sm2Engine.processBlock(data.getBytes(), 0, data.getBytes().length);return Base64.encodeBase64String(arrayBytes);//开始加密} catch (Exception e) {logger.error("加密失败{}", e.getMessage());}return null;}/*** sm2私钥解密方法* @param privateStr 私钥* @param data       需要解密的数据* @return 返回解密后的数据*/public static String decryptSm2(String privateStr, String data) {try {logger.info("私钥转换");byte[] bytes = Base64.decodeBase64(privateStr);KeyFactory keyFactory = KeyFactory.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);PrivateKey privateKey = keyFactory.generatePrivate(keySpec);logger.info("sm2开始解密");CipherParameters privateKeyParameters = ECUtil.generatePrivateKeyParameter((BCECPrivateKey) privateKey);SM2Engine engine = new SM2Engine();engine.init(false, privateKeyParameters);byte[] byteDate = engine.processBlock(Base64.decodeBase64(data), 0, Base64.decodeBase64(data).length);return new String(byteDate);} catch (Exception e) {logger.error("sm2解密失败{}", e.getMessage());return null;}}public static void main(String[] args) throws Exception {//定义需要加密的字符串String str = "aaaaa";//生成秘钥对KeyPair sm2Key = createSm2Key();//获取公钥PublicKey publicKey = sm2Key.getPublic();//获取公钥base加密后字符串String publicStr = Base64.encodeBase64String(publicKey.getEncoded());logger.info("公钥为:{}", publicStr);//获取私钥PrivateKey privateKey = sm2Key.getPrivate();//获取私钥base加密后字符串String privateStr = Base64.encodeBase64String(privateKey.getEncoded());logger.info("私钥为:{}", privateStr);//公钥加密String passStr = encryptSm2(publicStr, str);logger.info("加密后为{}", passStr);//私钥解密String deStr = decryptSm2(privateStr, passStr);logger.info("解密后为{}", deStr);}
}

国密sm2公钥加密 私钥解密java代码实现相关推荐

  1. 国密SM2前端加密,Java后台解密问题

    背景:要实现请求参数加密的功能,使用的是国密SM2算法,前端向后台发送请求获取公钥,将请求加密发送到后台,后台用对应的私钥进行解密 问题:前端进行加密的请求,后台无法进行解析 解决方案:(此处所用的类 ...

  2. 国密SM2算法加解密文件

    对文档进行加密操作,只有经过系统解密后才能进行查看文档内容 这里使用hutool工具类提供的SM2方法,首先引入pom.xml依赖 hutool文档地址 <!--工具类--> <de ...

  3. 国密SM2算法(JS加密,C#、Java解密)

    常见的渗透测试会将网站登录时密码使用明文传输视为风险.推荐使用国密算法或者RSA算法对密码进行加密传输. RSA加密(JS加密,C#.Java解密)请参考<RSA对称加密(JS加密,C#.Jav ...

  4. 国密SM2,SM3,SM4的前后台(js和java)加解密写法

    目录 SM2加解密 js java SM3加密 js java sm3前后台(js/java)加密不一致原因 SM4加解密 js java 之前做一个项目的时候需要用到国密SM2,SM3,SM4的加解 ...

  5. 使用 Python 脚本执行国密 sm2 加解密

    一.场景 工作中的一个场景:Go 需要对信息加解密,但是研究了 GmSSL Go API 文档之后,发现是依赖于 CGO 的,同事配了半天环境没配成功.于是换了一个方法,选择 Go 调 Python ...

  6. 国密SM2算法的只求理解不求甚解 (4/5)SM2算法加解密协议

    国密SM2算法的只求理解不求甚解 (1/5)前置数学知识:模运算 国密SM2算法的只求理解不求甚解 (2/5)前置数学知识:平面几何 国密SM2算法的只求理解不求甚解 (3/5)SM2算法数学模型 国 ...

  7. 国密SM2电子签章JAVA实现

    本文默认所需的国密SM2证书已生成完成.基于BouncyCastle JAR包+itextpdf,利用itext提供的2个签名接口:ExternalDigest 及 ExternalSignature ...

  8. Spring Security-用户密码自定义国密SM2加密

    为什么80%的码农都做不了架构师?>>>    由于甲方要求需要把密码的加密方式改为国密SM2的方式,网上看了一些写的代码,结合了一下SpringSecurity用户自定义加密,直接 ...

  9. php gmssl,支持国密SM2/SM3/SM4/SM9/ZUC/SSL的密码工具箱GmSSL

    GmSSL概述 GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法.SM2国密数字证书及基于SM2证书的SSL/TLS安全通信协议,支持国密硬件密码 ...

最新文章

  1. pinpoint zipink skywalking
  2. 计算机软件与理论考研考试科目,2014年电子科技大学081202计算机软件与理论考研专业目录及考试科目...
  3. unitoy机器人怎么联网_机器人操作说明
  4. 武汉区块链软件技术公司:区块链如何化解溯源的短板
  5. SQL SERVER 事务处理
  6. python-pymysql模块的使用入门
  7. Tomcat安装之前为什么要安装JDK
  8. BZOJ4836: [Lydsy1704月赛]二元运算-分治FFT
  9. Win7 共享打印机脱机解决
  10. Linux用户权限特殊权限
  11. (转!)利用Keras实现图像分类与颜色分类
  12. 数字图像处理---空间滤波基础
  13. 如何判断一个项目的可行性?
  14. SQL Server之菜鸟入坑学习练习01
  15. 解决 rubygems.org 无法访问的问题!
  16. 公共关系礼仪实务章节测试题——社会关系和公共关系(五)
  17. 微信开放平台-- 微信红包发放
  18. 深深的码丨Java NIO 透析
  19. 阿里巴巴2008年创纪录狂招2000多销售人才
  20. 联想手机打开应用都是计算机怎么搞,安卓手机实现电脑手机互相操控

热门文章

  1. ViT:Transformer在CV领域的开山之作
  2. js 递归思想 处理后台多维数组的数据 之 完美契合
  3. 北大软微拟录取名单公布:逐鹿群雄,是谁收割了战场?
  4. Excel - VBA实例: 遍历若干cell的值
  5. 选择软件测试你后悔吗?
  6. # SAP 系统的BASIS岗位学习手册
  7. 设备全生命周期管理第一股凌雄科技上市,京东、腾讯等长期看好
  8. 常见四种在线即时通讯即时聊天在线客服的源代码
  9. 计网笔记(6) 传输层
  10. VScode如何配置C语言编译环境