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

前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密算法DES(AES)和摘要MD5(SHA1)也相应改变,分别对应SM1、SM3算法,SM1算法基于硬件实现,SM2、SM3算法已公开。

SM2签名验证算法

SM2签名同样也是需要先摘要原文数据,即先使用SM3密码杂凑算法计算出32byte摘要。SM3需要摘要签名方ID(默认1234567812345678)、曲线参数a,b,Gx,Gy、共钥坐标(x,y)计算出Z值,然后再杂凑原文得出摘要数据。这个地方要注意曲线参数和坐标点都是32byte,在转换为BigInteger大数计算转成字节流时要去掉空补位,否则可能会出现摘要计算不正确的问题。SM2签名实现如下:

293384dfdbebf4a68403c3e04d11e3a0.gifSM2签名

f82d653e25f5b2ae14305a4a7b95f6b2.gifpublicstaticBigInteger[] Sm2Sign(byte[] md, AsymmetricCipherKeyPair keypair)

58c3266e906d263a226ad7cb5f2738be.gif

293384dfdbebf4a68403c3e04d11e3a0.gif...{

31bf357972705fcb86ef56e26687bd02.gif SM3Digest sm3=newSM3Digest();

31bf357972705fcb86ef56e26687bd02.gif

31bf357972705fcb86ef56e26687bd02.gif ECPublicKeyParameters ecpub=(ECPublicKeyParameters)keypair.Public;

31bf357972705fcb86ef56e26687bd02.gif

31bf357972705fcb86ef56e26687bd02.gifbyte[] z=SM2CryptoServiceProvider.Sm2GetZ(Encoding.Default.GetBytes(SM2CryptoServiceProvider.userId), ecpub.Q);

31bf357972705fcb86ef56e26687bd02.gif sm3.BlockUpdate(z,0, z.Length);

31bf357972705fcb86ef56e26687bd02.gif

31bf357972705fcb86ef56e26687bd02.gifbyte[] p=md;

31bf357972705fcb86ef56e26687bd02.gif sm3.BlockUpdate(p,0, p.Length);

31bf357972705fcb86ef56e26687bd02.gif

31bf357972705fcb86ef56e26687bd02.gifbyte[] hashData=newbyte[32];

31bf357972705fcb86ef56e26687bd02.gif sm3.DoFinal(hashData,0);

31bf357972705fcb86ef56e26687bd02.gif

31bf357972705fcb86ef56e26687bd02.gif//e31bf357972705fcb86ef56e26687bd02.gifBigInteger e=newBigInteger(1, hashData);

31bf357972705fcb86ef56e26687bd02.gif//k31bf357972705fcb86ef56e26687bd02.gifBigInteger k=null;

31bf357972705fcb86ef56e26687bd02.gif ECPoint kp=null;

31bf357972705fcb86ef56e26687bd02.gif BigInteger r=null;

31bf357972705fcb86ef56e26687bd02.gif BigInteger s=null;

31bf357972705fcb86ef56e26687bd02.gif BigInteger userD=null;

31bf357972705fcb86ef56e26687bd02.gif

31bf357972705fcb86ef56e26687bd02.gifdob8322e5cb9aa26914065dd81201a48a1.gif

388501a28159dc49db27bb8c20a49886.gif...{

31bf357972705fcb86ef56e26687bd02.gifdob8322e5cb9aa26914065dd81201a48a1.gif

388501a28159dc49db27bb8c20a49886.gif...{

31bf357972705fcb86ef56e26687bd02.gif

31bf357972705fcb86ef56e26687bd02.gif ECPrivateKeyParameters ecpriv=(ECPrivateKeyParameters)keypair.Private;

31bf357972705fcb86ef56e26687bd02.gif k=ecpriv.D;

31bf357972705fcb86ef56e26687bd02.gif kp=ecpub.Q;

31bf357972705fcb86ef56e26687bd02.gif

31bf357972705fcb86ef56e26687bd02.gif userD=ecpriv.D;

31bf357972705fcb86ef56e26687bd02.gif

31bf357972705fcb86ef56e26687bd02.gif//r31bf357972705fcb86ef56e26687bd02.gifr=e.Add(kp.X.ToBigInteger());

31bf357972705fcb86ef56e26687bd02.gif r=r.Mod(ecc_n);

545ba3e5b443562604c78421e3b51725.gif }31bf357972705fcb86ef56e26687bd02.gifwhile(r.Equals(BigInteger.Zero)||r.Add(k).Equals(ecc_n));

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值