在java中使用SM2算法加密时遇到的问题

1.密文组成的顺序

java服务端用的加密库是BouncyCastle,BouncyCastle中的加密数据 由C1,C2,C3组成而国密密文的正确排序是C1,C3,C2,安全芯片SM2加密处理的密文顺序也是 C1,C3,C2。

2.秘钥的标志位

BC库生成的公钥前面包含有04标志位(解密的时候需要有标志位),BC库生成的私钥前面偶尔会多加两个00(也是标志位?),记得去掉00就可以。
注:BC库使用的公钥=64个字节+1个字节(04标志位),BC库使用的私钥=32个字节。

3.验签的公钥使用

对于其他地方(例如加密芯片)传来的公钥,在进行签名验证的时候需要将公钥字符串加上一段变为未压缩状态,再构造成公钥类型进行签名验证。

4.SM2签名长度大于64个字节的原因(国密规范签名64个字节)

https://blog.csdn.net/zmnbehappy/article/details/88715431
https://bbs.csdn.net/topics/392137835
关于SM2签名,这里一定要强调一下!!!这个签名折磨我好几天,一直没有找到为什么验签是false的原因,后来偶然间才看到别人的博客说明,签名是分为硬签名和软签名的!!!硬签名就是通过硬件进行签名(例如加密芯片),软签名就是java加密库提供的签名算法。我在对加密芯片的签名进行验签时一直使用的是java库中的软签名验证算法,因此一直都是错的!!!对于硬签名校验,可以查看该博主的博客https://blog.csdn.net/hwyqb/article/details/106804978,最后通过硬签名校验方式才终于成功了。

5. SM2算法建议依赖坐标

<!-- SM2加密算法包 -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.57</version>
</dependency>
        
<!-- Base64编码需要  -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.9</version>
</dependency>




注:SM2算法建议参考博客
签名验签:https://blog.csdn.net/q1009020096/article/details/85115698
https://blog.csdn.net/hwyqb/article/details/106804978
加解密:https://blog.csdn.net/Soul_Programmer_Swh/article/details/80375958

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值