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) 按与对端约定的顺序拼接输出对接检查项
| 检查项 | 常见差异 | 表现 |
|---|---|---|
| 拼接顺序 | 两种主流顺序 | 解密结果乱码或校验失败 |
| 封装格式 | 裸字节与结构化封装 | 解析报错或长度不符 |
| 摘要参与内容 | 坐标与明文的组合方式 | 校验不通过 |
| 密钥派生 | 参数与长度约定 | 解密结果全为乱码 |
跨系统对接先确认三段的拼接顺序与是否使用结构化封装;顺序不一致时表现为解密结果乱码或校验失败,与密钥错误的现象很像,容易误判方向。
排错建议
- 先用标准测试向量验证实现是否符合规范
- 确认双方使用的加密库版本与默认封装格式
- 比对密文长度,判断是否包含额外的结构开销
- 在链路两端分别记录中间值定位差异位置
公钥加密只适合处理短数据;大文件应先用对称算法加密,再用公钥加密对称密钥,这也是混合加密的通用思路。