SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法。

随着密码技术和计算机技术的发展,目前常用的1024位RSA算法面临严重的安全威胁,我们国家密码管理部门经过研究,决定采用SM2椭圆曲线算法替换RSA算法。

依赖

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.60</version>
</dependency>
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.asn1.gm.GMNamedCurves;
import org.bouncycastle.asn1.gm.GMObjectIdentifiers;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.params.ECDomainParameters;
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.ECNamedCurveParameterSpec;
import org.bouncycastle.jce.spec.ECParameterSpec;
import org.bouncycastle.jce.spec.ECPrivateKeySpec;
import org.bouncycastle.jce.spec.ECPublicKeySpec;
import org.bouncycastle.math.ec.ECCurve;
import org.bouncycastle.math.ec.ECPoint;import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.*;public class SM2Utils {private static X9ECParameters x9ECParameters = GMNamedCurves.getByName("sm2p256v1");private static ECDomainParameters ecDomainParameters = new ECDomainParameters(x9ECParameters.getCurve(), x9ECParameters.getG(), x9ECParameters.getN());private static ECParameterSpec ecParameterSpec = new ECParameterSpec(x9ECParameters.getCurve(), x9ECParameters.getG(), x9ECParameters.getN());protected static BigInteger n = new BigInteger("FFFFFFFE" + "FFFFFFFF" + "FFFFFFFF" + "FFFFFFFF" + "7203DF6B" + "21C6052B" + "53BBF409" + "39D54123", 16);protected static BigInteger p = new BigInteger("FFFFFFFE" + "FFFFFFFF" + "FFFFFFFF" + "FFFFFFFF" + "FFFFFFFF" + "00000000" + "FFFFFFFF" + "FFFFFFFF", 16);protected static BigInteger a = new BigInteger("FFFFFFFE" + "FFFFFFFF" + "FFFFFFFF" + "FFFFFFFF" + "FFFFFFFF" + "00000000" + "FFFFFFFF" + "FFFFFFFC", 16);protected static BigInteger b = new BigInteger("28E9FA9E" + "9D9F5E34" + "4D5A9E4B" + "CF6509A7" + "F39789F5" + "15AB8F92" + "DDBCBD41" + "4D940E93", 16);protected static BigInteger gx = new BigInteger("32C4AE2C" + "1F198119" + "5F990446" + "6A39C994" + "8FE30BBF" + "F2660BE1" + "715A4589" + "334C74C7", 16);protected static BigInteger gy = new BigInteger("BC3736A2" + "F4F6779C" + "59BDCEE3" + "6B692153" + "D0A9877C" + "C62A4740" + "02DF32E5" + "2139F0A0", 16);protected static ECDomainParameters ecc_bc_spec;protected static int w = (int) Math.ceil(n.bitLength() * 1.0 / 2) - 1;protected static BigInteger _2w = new BigInteger("2").pow(w);protected static final int DIGEST_LENGTH = 32;private static SecureRandom random = new SecureRandom();protected static ECCurve.Fp curve;protected static ECPoint G;protected static boolean debug = false;static  {curve = new ECCurve.Fp(p, // qa, // ab); // bG = curve.createPoint(gx, gy);ecc_bc_spec = new ECDomainParameters(curve, G, n);}/*** 生成公私钥对* @param compressedPubKey  是否压缩公钥* @return*/public static String[] genKeyPair(boolean compressedPubKey) throws NoSuchAlgorithmException,InvalidAlgorithmParameterException{// 获取SM2 椭圆曲线推荐参数X9ECParameters ecParameters = GMNamedCurves.getByName("sm2p256v1");// 构造EC 算法参数ECNamedCurveParameterSpec sm2Spec = new ECNamedCurveParameterSpec(// 设置SM2 算法的 OIDGMObjectIdentifiers.sm2p256v1.toString()// 设置曲线方程, ecParameters.getCurve()// 椭圆曲线G点, ecParameters.getG()// 大整数N, ecParameters.getN());// 创建 密钥对生成器KeyPairGenerator gen = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());// 使用SM2的算法区域初始化密钥生成器gen.initialize(sm2Spec, new SecureRandom());// 获取密钥对KeyPair keyPair = gen.generateKeyPair();byte buffer[] = ((BCECPublicKey)keyPair.getPublic()).getQ().getEncoded(false);String publicKeyStr = Base64.encodeBase64String(buffer);String privateKeyStr = ((BCECPrivateKey)keyPair.getPrivate()).getD().toString(16);return new String[]{publicKeyStr, privateKeyStr};}/*** 私钥签名* @param privateKeyStr    私钥* @param plainText       待签名内容* @return*/public static String sign(String privateKeyStr, String plainText) throws SignatureException,NoSuchAlgorithmException,InvalidKeyException{// 生成SM2sign with sm3 签名验签算法实例Signature signature = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), new BouncyCastleProvider());BCECPrivateKey privateKey = getPrivatekeyFromD(new BigInteger(privateKeyStr,16));// 签名需要使用私钥,使用私钥 初始化签名实例signature.initSign(privateKey);// 签名原文// 写入签名原文到算法中signature.update(plainText.getBytes(StandardCharsets.UTF_8));// 计算签名值byte[] signatureValue = signature.sign();return Base64.encodeBase64String(signatureValue);}/*** 验证签名* @param publicKeyStr     公钥* @param plainText       待签名内容* @param sign          签名值* @return*/public static boolean verify(String publicKeyStr, String plainText, String sign) throws SignatureException, NoSuchAlgorithmException,InvalidKeyException{Signature signature = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), new BouncyCastleProvider());// 签名需要使用公钥,使用公钥 初始化签名实例byte buffer[] = Base64.decodeBase64(publicKeyStr);ECPoint ecPoint = curve.decodePoint(buffer);signature.initVerify(getPublickeyFromXY(ecPoint.getXCoord().toBigInteger(), ecPoint.getYCoord().toBigInteger()));// 写入待验签的签名原文到算法中signature.update(plainText.getBytes(StandardCharsets.UTF_8));// 验签return signature.verify(Base64.decodeBase64(sign));}public static BCECPrivateKey getPrivatekeyFromD(BigInteger d){ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(d, ecParameterSpec);return new BCECPrivateKey("EC", ecPrivateKeySpec, BouncyCastleProvider.CONFIGURATION);}public static BCECPublicKey getPublickeyFromXY(BigInteger x, BigInteger y){ECPublicKeySpec ecPublicKeySpec = new ECPublicKeySpec(x9ECParameters.getCurve().createPoint(x, y), ecParameterSpec);return new BCECPublicKey("EC", ecPublicKeySpec, BouncyCastleProvider.CONFIGURATION);}public static void main(String[] args) throws Exception{String[] keyPairArray = genKeyPair(true);String publicKeyStr = keyPairArray[0];String privateKeyStr = keyPairArray[1];String plainText = "HelloWorld";String signStr = sign(privateKeyStr, plainText);boolean verify = verify(publicKeyStr, plainText, signStr);System.out.println(verify);}

SM2 (国密算法)实例相关推荐

  1. SM2 国密算法被 Linux 内核社区接受

    喜欢就关注我们吧! 10 月 25 日,有开发者发文称,SM2 国密算法终于被 Linux 内核社区接受了.该作者表示,SM2 的补丁已经更新到了 v7 版本,这个版本的补丁最终被社区接受,目前已经合 ...

  2. SM2国密算法加解密

    接口安全设计原则的一个点就是数据不能明文传输,除了https这个必须的请求外,接口数据加密也是一个重要的方式,下面介绍一下SM2国密算法加解密的使用方式. 这里我就针对目前前后端分离架构的方式来简单介 ...

  3. 记自己发现的—SM2国密算法应用的高危漏洞—CVE-2021-3711

    openssl在8月24日发布了openssl 1.1.1l的稳定版,其中修复了一个高危漏洞:CVE-2021-3711.该漏洞会影响openssl 1.1.1l 之前的所有包含SM2商密算法版本,其 ...

  4. SM2国密算法公钥解压缩

    SM2一般用到的或者第三方提供的公钥都是压缩过的,长度为66个长度,既33字节. 格式如下,保密期间秘钥内容用*代替了,从02到....3F3B共33字节.66个长度 06:028736002931F ...

  5. 密信国密浏览器:推动SM2国密算法和国密SSL证书应用

    为什么80%的码农都做不了架构师?>>>    国密浏览器的普及是推广我国国产密码算法的关键生态要素.日前,沃通CA子公司密信技术发布密信浏览器公测版,支持SM系列国密算法和安全协议 ...

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

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

  7. 国密算法SM2证书制作

    原文链接:http://www.jonllen.com/jonllen/work/162.aspx 国密算法SM2证书制作 分类:工作 大中小 前段时间将系统的RSA算法全部升级为SM2国密算法,密码 ...

  8. SM2 (含SM3、SM4)国密算法工具QT版,彻底搞懂sm2算法的使用

    网上有很多网友问算法SM2怎么使用?什么是压缩公钥和非压缩公钥?xB和yB这参数是什么?怎么使用SM2做加解密?如何签名和验签?有没有工具来验证下? 这里分享个自己用QT造的一个小工具,简单好用,同时 ...

  9. 国密算法java源码_国密算法SM2证书制作

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

  10. php 国密算法,SM2,SM4,SM3,国密算法PHP版.rar

    1 身份认证例子(htm5)\普通例子\网页驱动安装\SetUp.exe 7.23 MB 2017/8/10 18:21:12 2 身份认证例子(htm5)\自动登录安装包\自动登录安装包\SetUp ...

最新文章

  1. selenium python自动化文件下载_selenium+python自动化79-文件下载(SendKeys)【转载】...
  2. linux进程--死锁产生的原因及四个必要条件(六)
  3. 【Android应用开发】分享一个录制 Android 屏幕 gif 格式的小技巧
  4. java.net.inetaddress_java.net.InetAddress类的应用
  5. python中重要的模块asyncio
  6. diff算法_详解 React 16 的 Diff 策略
  7. 利用python进行数据分析——第十四章_数据分析案例
  8. 小伯利恒之歌(音乐)-Oh Little Town of Bethlehem(Virtual Tour)一次真实的旅行,看看耶稣的家乡...
  9. 到底是什么决定了路由器的信号强弱和穿墙能力?
  10. 【分享】新品TI AM5708开发板!DSP+ARM异构多核!相比OMAP-L138,性能升级;相比AM5728,成本优化、功耗更低!
  11. mysql查询一天内,一周,一个月内的消费记录
  12. 一个简约的Android相册(支持多选)
  13. 字符串转成正则表达式
  14. 龙芯开源社区服务器迁移一览
  15. Java中有序与无序
  16. 剪贴板查看器:CopyClip 2 for Mac
  17. ceilometer+gnocchi+influxdb
  18. PyTorch学习笔记(9)——nn.Conv2d和其中的padding策略
  19. 毕设新思路附源码 | 微医平台项目详细步骤
  20. Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?

热门文章

  1. docker kong网关8443端口 无法访问的问题
  2. 二建考完,直接备考下半年一建,有什么好的建议?
  3. c语言构造函数和析构函数,深入解析C++中的构造函数和析构函数
  4. PDF转换成PPT怎样转换比较简单
  5. javascript栈和堆
  6. Android推送原理
  7. php 挂机,用php实现qq挂机_PHP教程
  8. 中秋节到了,送你一个Python做的Crossin牌“月饼”
  9. oracle 9i,10g,11c下载地址
  10. 微信第三方登录(静默授权和非静默授权)