HarmonyOS鸿蒙Next中SM2算法的C1C2C3格式密文与ASN.1编码格式如何互换
HarmonyOS鸿蒙Next中SM2算法的C1C2C3格式密文与ASN.1编码格式如何互换 [文档链接]: https://developer.huawei.com/consumer/cn/doc/architecture-guides/common-v1_26-ts_45-0000002298448793
[问题现象]: 文档的标题是C1C2C3格式与整个文档内容中的C1C3C2格式不对应, 存在误导, 真正遇到该问题时反而会搜不到

更多关于HarmonyOS鸿蒙Next中SM2算法的C1C2C3格式密文与ASN.1编码格式如何互换的实战教程也可以访问 https://www.itying.com/category-93-b0.html
尊敬的开发者,您好!感谢您的反馈,问题正在加速处理中,还请关注后续版本,感谢您的理解与支持。
更多关于HarmonyOS鸿蒙Next中SM2算法的C1C2C3格式密文与ASN.1编码格式如何互换的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这个标题确实建议改。标题写 C1C2C3,但正文主要在讲服务端密文格式 C1C3C2,会影响搜索和问题定位;开发者遇到 C1C3C2/ASN.1 互转问题时,可能搜不到这篇。
建议标题和正文统一为实际讨论的格式,例如“SM2 算法 C1C3C2 格式密文与 ASN.1 编码格式如何互换”;如果文档同时覆盖 C1C2C3 和 C1C3C2,也应在开头明确两种拼接顺序的差异,再分别给转换步骤。
这类差异通常不是算法错,而是“密文拼接顺序/编码方式”不同。
国密 SM2 加密输出里常见的原始拼接约定是 C1||C3||C2(很多库也称“标准格式”),也有人用 C1||C2||C3;而 ASN.1 则一般把 C1(点坐标/点字节)、C3、C2 分字段做 DER 编码后再输出。
做互换前先确认两点:
1)C1 是未压缩点(0x04||X||Y)还是压缩点;
2)各段长度:在 256 位曲线且未压缩点时,C1 常见 65 字节;C3 固定 32 字节;剩下都是 C2。
如果拿到的是 C1C3C2 想转成 C1C2C3:按长度切出 C1、C3、C2,然后重排为 C1||C2||C3 即可(反向同理)。
如果拿到的是 ASN.1:先用 DER 解码拿到字段(x/y 或 pointBytes、hash、cipher),再按目标库要求拼成 C1C3C2 或 C1C2C3。注意大端字节序,以及不要把未压缩点的 0x04 头字节丢掉。
你这里文档标题/正文确实不一致(标题写 C1C2C3,正文写 C1C3C2),建议在文档页点“反馈/提单”推动修正。若方便补充你使用的具体 SM2 库/接口名(不需要贴密钥/密文原文),我可以按该库约定把切分长度和 ASN.1 结构再对齐一下。
已经向官方社区提单,您也可以在指导文档中,选择需要优化的文字后,点击右键反馈
在HarmonyOS Next中,SM2密文C1C2C3原始格式与ASN.1编码互换通过cryptoFramework库完成。使用SM2CipherTextEncoder.encodeCipherText将原始字节编码为ASN.1 DER格式;使用SM2CipherTextDecoder.decodeCipherText解析ASN.1数据得到C1、C2、C3分片。两接口均以Uint8Array作为输入输出,分别对应格式转换。
文档标题中的“C1C2C3格式”和正文里“服务端加密后密文为C1C3C2”确实不一致,容易让人在搜索时产生困惑。实际国密SM2密文标准(GMT 0009)定义的字节顺序是C1||C3||C2,而C1||C2||C3只是部分早期实现的写法。两种格式的互换很简单:直接交换末尾C2和C3的位置即可(即C1C3C2 ⇄ C1C2C3)。另外,SM2密文的ASN.1编码(如OID 1.2.156.10197.1.301)本身就把密文组织成SEQUENCE{C1,C3,C2},与C1C3C2的顺序一致,因此它和原始C1C3C2字节串可以直接对应,无需额外调整。

