本文不对SM2做过多的介绍,主要介绍java bouncycastle库关于SM2的相关API的使用及注意事项

1. SM2 签名:

注意:

  1)签名格式ASN1(描述了种对数据进行表示、编码、传输和解码的数据格式),包括两个大整数。

  2)注意USER_ID的一致性(规范默认是"1234567812345678"),否则影响验签。

  

主要代码

SM2Signer localSM2Signer = new SM2Signer();
Security.addProvider(new BouncyCastleProvider());
PublicKey publicKey = cert.getPublicKey();
ECPublicKeyParameters param = null; if (publicKey instanceof BCECPublicKey)
{
BCECPublicKey localECPublicKey = (BCECPublicKey)publicKey;
ECParameterSpec localECParameterSpec = localECPublicKey.getParameters();
ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(),
localECParameterSpec.getG(), localECParameterSpec.getN());
param = new ECPublicKeyParameters(localECPublicKey.getQ(),localECDomainParameters);
}
ByteArrayInputStream inStream = new ByteArrayInputStream(signdatebyte);
ASN1InputStream asnInputStream = new ASN1InputStream(inStream);
ASN1Primitive derObject = asnInputStream.readObject();
BigInteger R = null;
BigInteger S = null;
if (derObject instanceof ASN1Sequence) {
ASN1Sequence signSequence = (ASN1Sequence) derObject;
Enumeration<ASN1Integer> enumer = signSequence.getObjects();
R = ((ASN1Integer)enumer.nextElement()).getValue();
S = ((ASN1Integer)enumer.nextElement()).getValue();
}
ParametersWithID parametersWithID = new ParametersWithID(param,SM2_USER_ID);
localSM2Signer.init(false, parametersWithID);
boolean res = localSM2Signer.verifySignature(databyte, BigIntegerUtil.toPositiveInteger(R.toByteArray()),
BigIntegerUtil.toPositiveInteger(S.toByteArray()));
return res;

2. SM2 验签:

注意:同签名

主要代码

SM2Signer localSM2Signer = new SM2Signer();
Security.addProvider(new BouncyCastleProvider());
PublicKey publicKey = cert.getPublicKey();
ECPublicKeyParameters param = null; if (publicKey instanceof BCECPublicKey)
{
BCECPublicKey localECPublicKey = (BCECPublicKey)publicKey;
ECParameterSpec localECParameterSpec = localECPublicKey.getParameters();
ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(),
localECParameterSpec.getG(), localECParameterSpec.getN());
param = new ECPublicKeyParameters(localECPublicKey.getQ(),localECDomainParameters);
}
ByteArrayInputStream inStream = new ByteArrayInputStream(signdatebyte);
ASN1InputStream asnInputStream = new ASN1InputStream(inStream);
ASN1Primitive derObject = asnInputStream.readObject();
BigInteger R = null;
BigInteger S = null;
if (derObject instanceof ASN1Sequence) {
ASN1Sequence signSequence = (ASN1Sequence) derObject;
Enumeration<ASN1Integer> enumer = signSequence.getObjects();
R = ((ASN1Integer)enumer.nextElement()).getValue();
S = ((ASN1Integer)enumer.nextElement()).getValue();
}
ParametersWithID parametersWithID = new ParametersWithID(param,SM2_USER_ID);
localSM2Signer.init(false, parametersWithID);
boolean res = localSM2Signer.verifySignature(databyte, BigIntegerUtil.toPositiveInteger(R.toByteArray()),
BigIntegerUtil.toPositiveInteger(S.toByteArray()));

3. 加解密

public static String encrypt(String data, PublicKey publicKey)
{ ECPublicKeyParameters localECPublicKeyParameters = null; if (publicKey instanceof BCECPublicKey)
{
BCECPublicKey localECPublicKey = (BCECPublicKey)publicKey;
ECParameterSpec localECParameterSpec = localECPublicKey.getParameters();
ECDomainParameters localECDomainParameters = new ECDomainParameters(
localECParameterSpec.getCurve(), localECParameterSpec.getG(),
localECParameterSpec.getN());
localECPublicKeyParameters = new ECPublicKeyParameters(localECPublicKey.getQ(),
localECDomainParameters);
}
SM2Engine localSM2Engine = new SM2Engine();
localSM2Engine.init(true, new ParametersWithRandom(localECPublicKeyParameters,
new SecureRandom()));
byte[] arrayOfByte2;
try
{
arrayOfByte2 = localSM2Engine.processBlock(data.getBytes(), 0, data.getBytes().length);
return new String(Base64.encode(arrayOfByte2));
}
catch (InvalidCipherTextException e)
{ e.printStackTrace();
return null;
} } public static String decrypt(String encodedata, PrivateKey privateKey)
{
byte[] encodedataByte = Base64.decode(encodedata.getBytes());
SM2Engine localSM2Engine = new SM2Engine();
BCECPrivateKey sm2PriK = (BCECPrivateKey)privateKey;
ECParameterSpec localECParameterSpec = sm2PriK.getParameters();
ECDomainParameters localECDomainParameters = new ECDomainParameters(
localECParameterSpec.getCurve(), localECParameterSpec.getG(),
localECParameterSpec.getN());
ECPrivateKeyParameters localECPrivateKeyParameters = new ECPrivateKeyParameters(
sm2PriK.getD(), localECDomainParameters);
localSM2Engine.init(false, localECPrivateKeyParameters);
try
{
byte[] arrayOfByte3 = localSM2Engine.processBlock(encodedataByte, 0,
encodedataByte.length);
return new String(arrayOfByte3);
}
catch (InvalidCipherTextException e)
{
e.printStackTrace();
return null;
} }

4. pkcs#7(CMS)格式

可以使用bouncycastle的CMS包下的API进行封装,或者自己实现,或使用j4sign库(基于bouncycastle)实现。这里就不贴代码了。

注意:相关OID

国密标准GM/T 0010定义的oid如下:
数据类型data 1.2.156.10197.6.1.4.2.1
签名数据类型signedData 1.2.156.10197.6.1.4.2.2
数字信封数据类型envelopedData        1.2.156.10197.6.1.4.2.3
签名及数字信封数据类型signedAndEnvelopedData                  1.2.156.10197.6.1.4.2.4
加密数据类型encryptedData 1.2.156.10197.6.1.4.2.5
密钥协商类型keyAgreementInfo    1.2.156.10197.6.1.4.2.6

参考资料:

1.GM T 0009-2012 SM2密码算法使用规范

2.https://tools.ietf.org/html/rfc2315

3.http://j4sign.sourceforge.net/

4.http://gmssl.org/docs/oid.html

5.https://stackoverflow.com/questions/39925946/generate-cmssigneddata-with-no-private-key-in-java

6.https://github.com/bcgit/bc-java

7.https://www.zhihu.com/question/62639301/answer/214184309

转载请注明原博客地址http://www.cnblogs.com/jeffreyluo/p/sm2forjava.html)

bouncycastle 国密SM2 API的使用的更多相关文章

  1. 推荐一款能支持国密SM2浏览器——密信浏览器

    密信浏览器( MeSince Browser )是基于Chromium开源项目开发的国密安全浏览器,支持国密算法和国密SSL证书,同时也支持国际算法及全球信任SSL证书:密信浏览器使用界面清新,干净. ...

  2. 谈谈PBOC3.0中使用的国密SM2算法

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/39780825 作者:小马 一 知识准备 SM2是国密局推出的一种他们自己说具有自主 ...

  3. 一个支持国密SM2/SM3/SM4/SM9/ZUC/SSL的密码工具箱

    转:https://blog.csdn.net/xuq09/article/details/91815366 The GmSSL Project网址:http://gmssl.org/docs/qui ...

  4. java 解析国密SM2算法证书

    首先说明用Java自带的解析x509证书类,是不能解析sm2算法的证书,执行会抛出异常. 用开源库bouncycastle能够解析.详细代码 private byte[] getCSPK(byte[] ...

  5. SM 国密算法踩坑指南

    各位,好久不见~ 最近接手网联的国密改造项目,由于对国密算法比较陌生,前期碰到了一系列国密算法加解密的问题. 所以这次总结一下,分享这个过程遇到的问题,希望帮到大家. 国密 什么是国密算法? 国密就是 ...

  6. 20155206赵飞 基于《Arm试验箱的国密算法应用》课程设计个人报告

    20155206赵飞 基于<Arm试验箱的国密算法应用>课程设计个人报告 课程设计中承担的任务 完成试验箱测试功能1,2,3 . 1:LED闪烁实验 一.实验目的  学习GPIO原理  ...

  7. 《基于Arm实验箱的国密算法应用》课程设计 结题报告

    <基于Arm实验箱的国密算法应用>课程设计 结题报告 小组成员姓名:20155206赵飞 20155220吴思其 20155234昝昕明 指导教师:娄嘉鹏 设计方案 题目要求:基于Arm实 ...

  8. 2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法

    国密商用算法是指国密SM系列算法,包括基于椭圆曲线的非对称公钥密码SM2算法.密码杂凑SM3算法.分组密码SM4算法,还有只以IP核形式提供的非公开算法流程的对称密码SM1算法等. 第1节 SM2非对 ...

  9. 国密SSL证书免费试用申请指南

    沃通提供国密SSL证书免费申请试用服务,一次申请可同时签发SM2/RSA双算法证书,试用周期1个月,用于测试国密SM2 SSL证书的运行效果和SM2/RSA双证书部署效果. 试用产品:SM2/RSA双 ...

随机推荐

  1. Swift实现JSON转Model - HandyJSON使用讲解

    背景: 很多时候,我们从服务端请求下的数据都是Json格式,我们需要拿这些数据显示到我们的UI界面. 因此,我们的做法基本都会先将json转为方便使用的数据模型,或者也可以直接转字典解决. 在OC中, ...

  2. Oracle的用户、角色以及权限相关操作

    1.创建用户create user KD identified by 123456;2.授予连接数据库的权限grant connect to KD;3.将Scott用户的emp表授权给KD可以查询gr ...

  3. Vue.js入学教程

    Vue.js是什么Vue.js 是用于构建交互式的 Web 界面的库.Vue.js 提供了 MVVM 数据绑定和一个可组合的组件系统,具有简单.灵活的 API.Vue.js(类似于view)是一套构建 ...

  4. vue.js 组件之间传递数据

    前言 组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.如何传递数据也成了组件的重要知识点之一. 组件 组件与组件之间,还存在着不同的关 ...

  5. Centos7yum安装Redis详细教程

    原本是在自己的mac上安装redis的,通过brew去安装的redis觉得很简单,实际macos系统与centos系统还是有一些区别的. 1.yum安装redis服务 sudo yum install ...

  6. 【DG】Oracle_Data_Guard官方直译

    [DG]Oracle Data Guard官方直译 1 Oracle Data Guard 介绍   Oracle Data Guard概念和管理10g版本2   Oracle Data Guard ...

  7. Python爬虫番外篇之Cookie和Session

    关于cookie和session估计很多程序员面试的时候都会被问到,这两个概念在写web以及爬虫中都会涉及,并且两者可能很多人直接回答也不好说的特别清楚,所以整理这样一篇文章,也帮助自己加深理解 什么 ...

  8. js模块加载详解

    看着java中各种import加载,在回过头来看看javascript还在自己造轮子,写各种XX的模块加载框架,ECMASCRIPT6不知什么时候能够普及.不过DT归DT,该学的还是要学. 一 同步加 ...

  9. 【HTML】dl dt dd

    摘要 看到没怎么使用过的html 标签,记录下 定义 dl 类似于 ul ,无任何样式,自定义列表容器, ul 为无序列表容器,ol 为有序列表容器 dt dd 类似于 li ,无任何样式,为帮助实现 ...

  10. 【MYSQL】主从库查看及搭建

    show slave status 查看从库信息  http://blog.csdn.net/lxpbs8851/article/details/7898716 搭建主从库   http://www. ...