首页/安全/加密与证书速查/SM2 公钥加密与 C1C2C3 结构
加密算法基础95 条

SM2 公钥加密与 C1C2C3 结构

SM2 加密输出由 C1(曲线点)、C2(密文)与 C3(SM3 摘要)组成;不同标准版本与实现的拼接顺序不同,是国密对接中的常见故障点。

加密与证书速查安全更新于 2026-10-13

SM2 加密的结构

SM2 公钥加密的输出由三部分组成:C1 是随机点与基点的乘积,C2 是与密钥流异或后的密文,C3 是明文的摘要,用于解密方校验。不同标准版本与不同实现采用的拼接顺序不一致,这是国密对接中最常见的故障点。加密流程是随机取 k 算出 C1,用共享点派生密钥流,异或得到 C2,再算出 C3,最后按双方约定的顺序拼接输出。

基本信息

C1随机点 kG,椭圆曲线上的一个点
C2与密钥流异或后的密文
C3对坐标与明文计算的摘要,用于校验
顺序差异两种拼接顺序在生态中并存
标准GB/T 32918.4

典型使用场景

  • 与国内合规系统对接:需要按国密标准实现加密
  • 传输对称密钥:用公钥加密短密钥再混合加密大文件
  • 设备间安全通信:国密网关与终端之间的密钥分发
  • 对接排错:解密结果异常时核对拼接顺序与是否使用 ASN.1 封装
  • 合规改造:把既有公钥加密方案替换为国密算法

加密流程要点

加密流程要点
1) 随机取 k,计算 C1 = kG
2) 计算共享点 S = kP,用密钥派生函数得到密钥流 t
3) C2 = 明文 异或 t
4) C3 = 对坐标与明文计算的摘要
5) 按与对端约定的顺序拼接输出

对接检查项

检查项常见差异表现
拼接顺序两种主流顺序解密结果乱码或校验失败
封装格式裸字节与结构化封装解析报错或长度不符
摘要参与内容坐标与明文的组合方式校验不通过
密钥派生参数与长度约定解密结果全为乱码
跨系统对接先确认三段的拼接顺序与是否使用结构化封装;顺序不一致时表现为解密结果乱码或校验失败,与密钥错误的现象很像,容易误判方向。

排错建议

  • 先用标准测试向量验证实现是否符合规范
  • 确认双方使用的加密库版本与默认封装格式
  • 比对密文长度,判断是否包含额外的结构开销
  • 在链路两端分别记录中间值定位差异位置
公钥加密只适合处理短数据;大文件应先用对称算法加密,再用公钥加密对称密钥,这也是混合加密的通用思路。

易错点

  • 顺序问题排查困难,密文看起来都像乱码,建议对接时先跑标准测试向量
  • 把公钥加密用于大文件:性能极差且受数据长度限制,应按混合加密处理
  • 忽略封装格式差异:裸字节与结构化封装的长度与解析方式不同
  • 只比对密钥而不比对库版本与默认参数,定位方向跑偏
  • 用自研实现替代标准库:细节偏差会造成难以定位的互操作问题

数据来源与参考

  • GB/T 32918.4-2016(SM2 公钥加密算法)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌