您的位置:首页 > 财经 > 产业 > 品牌建设促进中心_上海中小企业服务中心官网_seo搜索引擎优化入门_培训总结怎么写

品牌建设促进中心_上海中小企业服务中心官网_seo搜索引擎优化入门_培训总结怎么写

2025/4/27 10:22:00 来源:https://blog.csdn.net/yesewubian000/article/details/147499478  浏览:    关键词:品牌建设促进中心_上海中小企业服务中心官网_seo搜索引擎优化入门_培训总结怎么写
品牌建设促进中心_上海中小企业服务中心官网_seo搜索引擎优化入门_培训总结怎么写

SM2国密,国家推荐的,很多项目对接现在都不用RSA了,改用国密对接了。对接过程中遇到一些问题,记录一下。 

1.  报错: Invalid point encoding 0x30

SM2的公钥要求开头为(00/02/03/04/06/07)见下图

如果不是这些开头的公钥就是一个异常的公钥。

我拿到的是一个30开头的公钥,这是什么样的公钥,为什么会给我30的公钥?

您遇到的以 30 开头的公钥,很可能是 ASN.1 DER编码格式 的SM2公钥,而非原始的未压缩格式(04 + x + y)。 ASN.1 DER是国际通用的密钥编码标准(如PKCS#8、X.509)。为了兼容所以部分api生成的为30开头的公钥。 

30的公钥怎么转换为04的公钥?

import org.bouncycastle.asn1.ASN1BitString;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.util.encoders.Hex;// ASN.1 DER 格式
if (publicKeyHex.startsWith("30")) {// 解析DER格式SubjectPublicKeyInfo keyInfo = SubjectPublicKeyInfo.getInstance(Hex.decode(publicKeyHex));// BIT STRING数据ASN1BitString bitString = keyInfo.getPublicKeyData();// 转换为04开头的未压缩格式publicKeyHex = Hex.toHexString(bitString.getBytes());
}

2. 报错:InvalidCipherTextException: invalid cipher text

我加密完了,没有报错,我自己解密也没有报错,对方解密的时候报错了。InvalidCipherTextException: invalid cipher text

为什么会解密异常? 这个就不得不说SM2加密之后的报文格式了,
先说是什么?  C1 = 椭圆曲线点 ;C2 = 加密数据 ;C3 = 哈希校验值;

国密的默认模式:C1C3C2
排序方式有两种,

C1C3C2(国密默认模式)前65字节为 C1​,接着32字节为 C3​,剩余为 C2。​

C1C2C3(java构建SM2)  前65字节为 C1​,接着为 C2​,最后32字节为 C3​。

有了两种不同的排序,再说为什么会有两种不同的排序差异?

C1C2C3 为兼容国际ECC加密习惯(如ISO/IEC 18033-2)采用的变种。
C1C3C2 为中国国家标准《GB/T 32918.4-2016》和密码行业标准《GM/T 0009-2012》中明确规定的 默认模式。C1C3C2: 先校验C3的hash值,再进行解密, 如果校验失败,则无需解密. 参数被篡改,采用C1C2C3方式,仍然会进行一次解密操作,浪费计算机算力。
如何保证密文的拼接顺序,最好的方式肯定是双方共同约定拼接顺序。否则就分别尝试一下。

// 初始化 SM2 引擎(使用 C1C3C2 模式)
SM2Engine engine = new SM2Engine(SM2Engine.Mode.C1C3C2);
// 初始化 SM2 引擎(使用 C1C2C3 模式)
SM2Engine engine = new SM2Engine(SM2Engine.Mode.C1C2C3);

如果我们的工具类固定写死了C1C3C2, 但是收到的等待解密的数据是C1C2C3 模式,也不用担心。因为C1/C3有固定的长度, 所以进行一下数据拼接即可。

c1c3c2=c1c2c3[0:65]+c1c2c3[-32:]+c1c2c3[65:-32]

SM2  PK  RSA

原来的项目系统使用的RSA, 为什么大家现在都在陆续替换为SM2呢?

1. SM2相比RSA速度更快。
2. SM2相比RSA速度更快。
3. SM2相比RSA速度更快。

4. SM2的签名长度更短(64字节)

优点有了,有啥缺点呢?

1. RSA 属于国际的标准, SM2属于中国的标准,针对国外对接的项目还是用RSA等国际惯例比较好。

故事时间

听着玩,权当一乐呵。

全国开启了数字化浪潮,政府要开启数字化办公展示。说人话:我们调用政府api推数据。简简单单,以前对接过没有十个也有八个了,老本行了这咱熟啊。

对接文档过来了, 上来让我引包。

implementation 'cn.hutool:hutool-all:5.8.26' 

implementation 'org.bouncycastle:bcpkix-jdk18on:1.77'

???这... hutool是一个好的插件, 但是我们项目没有引入,但是引入了lang3等一些基础的jar包, 所以不打算引入hutool组件。

我们对接过很多对称加密的。比如:AES/CBC/PKCS5Padding。这次一看是对接SM2, 这玩意也没有对接过,人家也没说啥东西, 扔过来一个公钥, 一个hutool的工具类调用示例。

跑示例,没啥问题,自己网上搜SM2工具类。 哎!竟然不行。 这个也比较常见。无非是一些参数的调整问题。
debug模式,跟着hutool的工具类,一步一步的看他干了什么,摘抄出来进行项目的运行。不得不说hutool的类封装真的厉害, 里三层外三层绕的我头晕眼花😵‍💫。找了这个找那个,最后还是不知道那个地方的初始化没有做好。一直是不行。干自闭了快。
一度想放弃,算了不就是引入一个jar包吗?后来想想我引入了fastjson导致的被dns攻击,瞬间又来了动力。直接拿来的用法不行,那么就搜一下SM2是啥。再根据自己的报错原因,去网上搜原因。
被坑的两个点:
1.公钥没有明确格式,导致我一直按照正常的公钥试用报错:Invalid point encoding 0x30
2.没有明确加密的模式,java缺省是C1C2C3,但是解密方是C1C3C2。而且政府的比较那个啥,还没法问人家那边解密报啥错。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com