JAVA bouncycastle实现SM2算法(国密2)

package com.blcase.common.utils.sm;
import org.bouncycastle.asn1.gm.GMNamedCurves;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.*;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECParameterSpec;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.util.encoders.Hex;import org.bouncycastle.jce.provider.BouncyCastleProvider;import java.math.BigInteger;
import java.security.*;
import java.security.spec.ECGenParameterSpec;//
public class SM2Util {/*** SM2加密算法* @param publicKey     公钥* @param data          明文数据* @return*/public String encrypt(String publicKey, String data) {// 获取一条SM2曲线参数X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");// 构造ECC算法参数,曲线方程、椭圆曲线G点、大整数NECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());//提取公钥点ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(Hex.decode(publicKey));// 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters);SM2Engine sm2Engine = new SM2Engine(SM2Engine.Mode.C1C3C2);// 设置sm2为加密模式sm2Engine.init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom()));byte[] arrayOfBytes = null;try {byte[] in = data.getBytes();arrayOfBytes = sm2Engine.processBlock(in, 0, in.length);} catch (Exception e) {System.out.println("SM2加密时出现异常:"+e.getMessage());}return Hex.toHexString(arrayOfBytes);}/*** SM2解密算法* @param privateKey        私钥* @param cipherData        密文数据* @return*/public String decrypt(String privateKey, String cipherData) {// 使用BC库加解密时密文以04开头,传入的密文前面没有04则补上if (!cipherData.startsWith("04")){cipherData = "04" + cipherData;}byte[] cipherDataByte = Hex.decode(cipherData);//获取一条SM2曲线参数X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");//构造domain参数ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());BigInteger privateKeyD = new BigInteger(privateKey, 16);ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters);SM2Engine sm2Engine = new SM2Engine(SM2Engine.Mode.C1C3C2);// 设置sm2为解密模式sm2Engine.init(false, privateKeyParameters);String result = "";try {byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length);return new String(arrayOfBytes);} catch (Exception e) {System.out.println("SM2解密时出现异常:"+e.getMessage());}return result;}public static void main(String[] args) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {String M="encryption standard";SM2Util sm2 = new SM2Util();final ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");// 获取一个椭圆曲线类型的密钥对生成器final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());// 使用SM2参数初始化生成器kpg.initialize(sm2Spec);// 获取密钥对KeyPair keyPair = kpg.generateKeyPair();PublicKey publicKey = keyPair.getPublic();BCECPublicKey p=(BCECPublicKey)publicKey;System.out.print("\n公钥:"+Hex.toHexString(p.getQ().getEncoded(false)));PrivateKey privateKey = keyPair.getPrivate();BCECPrivateKey s=(BCECPrivateKey)privateKey;System.out.print("\n私钥:"+Hex.toHexString(s.getD().toByteArray()));String data = sm2.encrypt(Hex.toHexString(p.getQ().getEncoded(false)),M);System.out.println("\n加密字符串:"+data);String text=sm2.decrypt(Hex.toHexString(s.getD().toByteArray()),data);System.out.println("\n解密:"+text);}
}

JAVA bouncycastle实现SM2算法(国密2)相关推荐

  1. 基于Java的(SM2_SM3_SM4)国密算法, 加密解密工具类及测试demo

    编写本文的同时借鉴了多位同学写的demo, 最后发现这位同学写的最详细, 放上该作者的链接, 原版链接: https://download.csdn.net/download/ererfei/9474 ...

  2. java mac pos_pos终端mac国密(sm4)算法(java实现)

    概念理解 mac算法是(Message Authentication Codes 消息认证码算法),是含有密钥散列函数算法.主要通过异或运算,再配合其他加密算法实现mac值的运算,用于校验. 实现过程 ...

  3. SM2 (国密算法)实例

    SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法. 随着密码技术和计算机技术的发展,目前常用的1024位RSA算法面临严重的安全威 ...

  4. SM2 (国密的一种算法)

    SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法. 中文名 SM2 发布时间 2010年12月17日 发布单位 国家密码管理局 性    质 椭圆曲线公钥密码算法 目录 1 简 ...

  5. 用java写一个SM2算法

    SM2算法是国密算法, 是一种非对称加密算法, 主要用于数字签名和加密. 在Java中,可以使用Bouncy Castle库来实现SM2算法. 下面是一个简单的示例代码,用于生成SM2公钥和私钥,并使 ...

  6. 安全算法 - 国密算法

    国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4,SM7, SM9. 国密算法分类 国家标准官方网站如下:http://openstd.samr.gov.cn/bzgk/gb/ ...

  7. Java笔记-SM2(国密2)的调用及SM2、SM3、SM4使用场景

    注意:本博文仅仅说明SM2的使用,应用场景等,不研究其算法. SM2是非对称加密算法,对应应用层程序员来说,使用逻辑和RSA一样. 他的最主要的功能: ①非对称加密: ②签名和验签 对于应用层程序员来 ...

  8. Delphi SM2/SM4国密算法

    最近忙个医保平台的项目,涉及SM2/SM4的签名,验签,加密,解密的业务操作过程.毕竟现在用Delpih的人不是很多,懂这方面的技术的人也更少,能涉及密码算法的少之更少,网上也能搜到一些开源的代码,也 ...

  9. ec java sm2证书_国密算法SM2证书制作

    前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...

最新文章

  1. TiDB 在中通的落地与进化
  2. 怎样用VB编写.DLL动态链接库文件 1
  3. 长见识:你真的知道C语言里extern quot;Cquot; 的作用吗?
  4. OpenCV中霍夫直线变换
  5. 图例解析四大UML关系图使用
  6. asp.net后台程序动态加载js或样式表
  7. 【离散数学】单向连通和弱连通的区别
  8. LINQ to SQL创建三层/多层Web应用系统 (Part 1)
  9. python简单爬虫代码-Python爬虫――写出最简单的网页爬虫
  10. python并行编程手册 pdf_Python并行编程手册
  11. matlab 没有vartestn,2013五一赛数学建模论文.docx
  12. 威纶通定时循环操作宏_相同功能带定时器的PLC程序怎么简化?
  13. 华三交换机配置access命令_H3C交换机配置基本命令详解
  14. Supercell:靠两款手游如何做到30亿美金市值?
  15. 格式工厂 vtt字幕 加入视频
  16. 贾又福大象鸿蒙,2016贾又福工作室师生优秀作品全国巡展
  17. 信息检索经典文章-1
  18. 物权法全文内容有哪些呢-广告外链_有哪些网络推广免费平台?通过哪些平台进行免费推广及注意事项?...
  19. 华为便携机修改服务器密码,华为随身WiFi如何修改WiFi密码 华为随身WiFi修改WiFi密码方法【介绍】...
  20. 从零开始一起学习SLAM-ICP原理及应用

热门文章

  1. 本科毕业工作五年,一点感慨(转)
  2. 鹅厂中年工程师的“前半生”:从“刷墙少年”到“技术专家”
  3. 数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析
  4. mysql gbk编码不全_一次MySQL GBK编码的故障分析
  5. s5pv210 u-boot的那些事儿之---lowleve_init.S的分析
  6. 科技英语交流作业(1)
  7. win8虚拟机_用vm ware安装虚拟机必备的工具神器
  8. js第1章JavaScript快速入门 课后习题
  9. threeJs中镜头拉远导致物体闪烁
  10. 开源面向对象数据库 db4o 之旅: 深入 db4o “db4o 之旅(三)”