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