【国密算法标准】国产(商用)密码算法之间的区别以及基本理解

【国密算法标准】国产(商用)密码算法之间的区别以及基本理解

一、为什么需要一套”自己的”密码算法体系?

密码算法是信息安全的基石。

长期以来,全球商用密码领域由美国主导的 RSA、DSA、AES、SHA 系列算法占据绝对主导地位。然而,随着国际形势的变化和自主可控需求的提升,中国自 1990 年代起逐步构建起一套完整的商用密码算法体系——国密算法(简称 GM/T 系列)。

国密算法由国家密码管理局(简称”国密局”)认定和发布,覆盖了对称加密、非对称加密、哈希摘要、数字签名、身份认证等多种密码学原语,形成了从底层算法到上层协议的完整技术栈。

以下将从算法原理、安全强度、性能特征、应用场景四个维度,系统梳理 SM1、SM2、SM3、SM4、SM7、SM9 及祖冲之(ZUC)算法之间的核心差异与用途区别。


二、国密算法总览与分类

在深入各算法之前,我们先建立一个宏观分类框架:

算法类型公开程度核心用途
SM1对称加密不公开(硬件实现)高安全等级加密
SM2非对称加密(椭圆曲线)公开密钥交换、数字签名、公钥加密
SM3哈希/摘要公开数据完整性校验、数字签名
SM4对称加密(分组密码)公开通用数据加密
SM7对称加密不公开特定行业加密
SM9标识密码(IBC)公开基于身份的加密与签名
ZUC流密码公开移动通信加密(4G/5G)

可以看到,国密算法体系并非简单复制国际标准,而是根据实际应用场景进行了差异化设计,尤其在标识密码(SM9)和流密码(ZUC)方面体现了独特的技术路线。


三、SM1 算法:硬件专属的对称加密

3.1 算法概述

SM1 是一种对称分组密码算法,分组长度和密钥长度均为 128 位。其最大的特点是:算法细节不对外公开,仅以 IP 核或芯片形式提供,必须通过硬件实现。

这意味着你无法在软件中直接调用 SM1 算法——它被设计为一种”黑盒”加密方案,所有加解密操作都在安全芯片内部完成。

3.2 技术特征

  • 分组长度:128 bit
  • 密钥长度:128 bit
  • 实现方式:仅支持硬件(芯片、加密卡、加密机)
  • 轮数:未公开(推测与 SM4 类似的多轮迭代结构)
  • 安全等级:与 SM4 相当,但由于硬件隔离,抗侧信道攻击能力更强

3.3 设计哲学

SM1 的设计思路源于”物理安全优于算法安全”的理念。在金融、政务等高安全场景中,密钥管理和算法保护往往比算法本身的数学强度更为关键。通过将算法固化在硬件中,可以有效防止算法被逆向分析、密钥被软件层面窃取。

3.4 典型应用场景

  • 金融 IC 卡(银行卡芯片)
  • 政务内网加密通信
  • 高安全等级的加密机/加密卡
  • 需要硬件级密钥保护的场景

3.5 与 SM4 的核心区别

SM1 与 SM4 同属对称加密,但 SM1 强调硬件绑定和物理安全,SM4 则强调软件兼容性和开放标准。在实际部署中,SM1 通常用于对安全等级要求极高的场景,而 SM4 用于通用数据加密。


四、SM2 算法:基于椭圆曲线的非对称加密

4.1 算法概述

SM2 是基于椭圆曲线密码学(ECC)的非对称加密算法,于 2010 年发布。它整合了数字签名、密钥交换和公钥加密三种功能,对标的是国际上的 ECDSA(签名)、ECDH(密钥交换)和 ECIES(加密)。

4.2 数学基础

SM2 定义在一条特定的 256 位素数域椭圆曲线上,曲线方程为:

1
y² = x³ + ax + b (mod p)

其中曲线参数 a、b、基点 G、阶 n 等均由国密局统一指定。安全强度基于椭圆曲线离散对数问题(ECDLP)的计算困难性。

4.3 三大功能模块

4.3.1 SM2 数字签名

签名过程:

  1. 计算消息的 SM3 哈希值
  2. 生成随机数 k,计算椭圆曲线点 (x₁, y₁) = kG
  3. 计算签名分量 r、s
  4. 输出签名 (r, s)

验证过程:

  1. 使用公钥和签名值恢复椭圆曲线点
  2. 验证 r 值是否匹配

4.3.2 SM2 密钥交换

SM2 密钥交换协议允许两方在不安全的信道上协商出一个共享密钥,过程类似 ECDH,但增加了身份认证步骤,防止中间人攻击。

4.3.3 SM2 公钥加密

使用接收方的公钥加密数据,只有持有对应私钥的接收方才能解密。加密过程中引入了随机数,确保同一明文每次加密结果不同(语义安全)。

4.4 性能特征

  • 密钥长度:256 bit(等效于 RSA-3072 的安全强度)
  • 签名速度:较快(ECC 的优势)
  • 加密速度:较慢(相比对称加密)
  • 密文膨胀:较大(密文比明文长约 96 字节以上)

4.5 典型应用场景

  • 电子签名与电子证照
  • SSL/TLS 证书(国密 SSL)
  • 区块链数字签名(部分国产链)
  • 政务系统身份认证
  • 安全邮件(SMIME 国密版)

4.6 与 RSA 的对比

维度SM2 (ECC)RSA
密钥长度256 bit2048+ bit
签名速度
验证速度略慢
存储开销
数学基础椭圆曲线离散对数大整数分解

五、SM3 算法:256 位安全哈希

5.1 算法概述

SM3 是国密体系中的密码杂凑算法(Hash),输出 256 位摘要值。其设计思路借鉴了 SHA-256 的 Merkle-Damgård 结构,但在消息扩展和压缩函数上进行了显著改动,以抵御已知的碰撞攻击。

5.2 技术细节

  • 输入:任意长度消息
  • 输出:256 bit(32 字节)固定长度摘要
  • 分组长度:512 bit
  • 轮数:64 轮压缩
  • 结构:Merkle-Damgård 迭代结构

5.3 与 SHA-256 的差异

虽然 SM3 和 SHA-256 输出长度相同,但内部结构有本质区别:

  • 消息扩展:SM3 使用了两组不同的扩展消息 W 和 W’,而 SHA-256 只有一组
  • 常量设计:SM3 使用了两组不同的常量 T₀ 和 T₁(前 16 轮和后 48 轮不同)
  • 置换函数:SM3 引入了 P₀ 和 P₁ 两个置换函数,增强了扩散性
  • 循环左移位数:与 SHA-256 完全不同

这些差异使得 SM3 并非 SHA-256 的简单翻版,而是具有独立安全性的哈希算法。

5.4 安全强度

  • 抗碰撞性:2¹²⁸(生日攻击边界)
  • 抗原像性:2²⁵⁶
  • 抗第二原像性:2²⁵⁶

截至目前,SM3 未发现有效的密码分析攻击。

5.5 典型应用场景

  • 数字签名的消息摘要(配合 SM2 使用)
  • 文件完整性校验
  • 消息认证码(HMAC-SM3)
  • 密钥派生函数(KDF)
  • 区块链交易哈希
  • 口令存储与验证

六、SM4 算法:对标 AES 的分组密码

6.1 算法概述

SM4 是国密体系中最广泛使用的对称加密算法,于 2012 年正式发布为国家标准(GM/T 0002-2012),后成为 ISO/IEC 国际标准。其前身是用于无线局域网的 SMS4 算法。

6.2 技术规格

  • 分组长度:128 bit(16 字节)
  • 密钥长度:128 bit(16 字节)
  • 轮数:32 轮
  • 结构:广义 Feistel 网络(实际为 SPN 变体)
  • S 盒:基于有限域 GF(2⁸) 上的非线性变换

6.3 加密流程

  1. 将 128 位明文分为 4 个 32 位字 (X₀, X₁, X₂, X₃)
  2. 进行 32 轮迭代变换,每轮使用一个轮密钥 rkᵢ
  3. 每轮变换:Xᵢ₊₄ = Xᵢ ⊕ T(Xᵢ₊₁ ⊕ Xᵢ₊₂ ⊕ Xᵢ₊₃ ⊕ rkᵢ)
  4. 最后进行反序变换输出密文

其中 T 变换由非线性变换 τ(S 盒替换)和线性变换 L 组成。

6.4 工作模式

SM4 作为分组密码,需要配合工作模式使用:

  • ECB:电子密码本模式(不推荐,安全性低)
  • CBC:密码块链接模式(常用)
  • CFB:密文反馈模式
  • OFB:输出反馈模式
  • CTR:计数器模式(支持并行)
  • GCM:伽罗瓦计数器模式(认证加密)

6.5 性能特征

  • 软件实现效率高,适合各种平台
  • 硬件实现面积小,适合嵌入式设备
  • 32 轮迭代提供充足的安全余量
  • 支持位切片等优化技术,在 x86/ARM 上可达 GB/s 级吞吐

6.6 典型应用场景

  • 数据库字段加密
  • 文件加密
  • VPN/隧道加密
  • 移动支付通信加密
  • 物联网设备数据加密
  • 云存储加密

6.7 与 AES-128 的对比

维度SM4AES-128
分组长度128 bit128 bit
密钥长度128 bit128 bit
轮数32 轮10 轮
结构类 FeistelSPN
安全强度相当相当
标准化国标 + ISO全球广泛采用

七、SM7 算法:面向特定行业的对称加密

7.1 算法概述

SM7 是一种对称加密算法,与 SM1 类似,其算法细节不对外公开。它主要面向特定行业应用,尤其在以下领域有明确定位:

  • 智能电表/水表/气表等公用事业
  • 门禁系统与智能卡
  • 特定行业的数据保护

7.2 技术特征

  • 类型:对称分组密码
  • 公开程度:不公开
  • 实现方式:主要通过芯片/硬件模块实现
  • 安全等级:满足行业特定安全需求

7.3 与 SM1 的区别

虽然 SM1 和 SM7 都是不公开的对称加密算法,但它们面向的应用领域不同:

  • SM1 更偏向金融、政务等高安全通用场景
  • SM7 更偏向物联网终端、智能卡等资源受限场景

SM7 的设计可能在计算复杂度和资源消耗上做了更多优化,以适应低功耗设备。

7.4 典型应用场景

  • 智能电表数据加密
  • 门禁卡认证
  • 工业控制系统通信保护
  • 特定行业的密钥管理

八、SM9 算法:基于标识的密码体系

8.1 算法概述

SM9 是国密体系中最具创新性的算法之一,它基于标识密码(Identity-Based Cryptography, IBC)理论,于 2016 年发布。SM9 的最大特点是:用户的公钥就是其身份标识(如邮箱、手机号、身份证号),无需传统的数字证书和 PKI 基础设施。

SM9 于 2018 年成为 ISO/IEC 国际标准(ISO/IEC 14888-3),是中国首个成为国际标准的标识密码算法。

8.2 数学基础

SM9 基于椭圆曲线上的双线性对(Bilinear Pairing)运算,具体使用 BN 曲线(Barreto-Naehrig 曲线)。双线性对是一种特殊的数学映射:

1
e: G₁ × G₂ → Gₜ

满足双线性性质:e(aP, bQ) = e(P, Q)^(ab)

8.3 四大功能

8.3.1 SM9 数字签名

  • 签名者使用私钥(由 KGC 根据身份标识生成)对消息签名
  • 验证者使用签名者的身份标识和系统公钥验证签名
  • 无需证书,验证过程直接绑定身份

8.3.2 SM9 公钥加密

  • 加密方使用接收方的身份标识作为公钥加密数据
  • 接收方使用 KGC 分配的私钥解密
  • 无需事先获取对方证书

8.3.3 SM9 密钥交换

  • 双方基于各自身份标识协商共享密钥
  • 具有前向安全性
  • 无需证书认证

8.3.4 SM9 密钥封装

  • 用于安全传输对称密钥
  • 基于身份标识进行密钥封装和解封装

8.4 与 SM2 的核心区别

维度SM2SM9
公钥形式椭圆曲线点(64+字节)身份标识(字符串)
证书需求需要 PKI 证书无需证书
密钥管理用户自行管理密钥对KGC 统一生成私钥
数学基础ECDLP双线性对
适用场景通用非对称加密大规模身份认证
部署复杂度需要 CA 体系需要 KGC

8.5 典型应用场景

  • 大规模物联网设备认证(海量设备无需管理证书)
  • 电子邮件加密(用邮箱地址直接加密)
  • 视频会议/即时通讯端到端加密
  • 政务系统跨域身份认证
  • 车联网设备身份管理

8.6 SM9 的优势与挑战

优势

  • 消除了证书管理的复杂性
  • 天然适合大规模部署
  • 公钥即身份,简化了密钥分发

挑战

  • 依赖可信的密钥生成中心(KGC),存在密钥托管问题
  • 双线性对运算开销较大
  • 生态支持不如 SM2 成熟

九、祖冲之(ZUC)算法:面向移动通信的流密码

9.1 算法概述

ZUC(祖冲之算法)是国密体系中唯一的流密码算法,于 2011 年被 3GPP 采纳为 4G LTE 的国际加密标准(128-EEA3 和 128-EIA3),这是中国密码算法首次成为国际通信标准。

9.2 技术架构

ZUC 算法由三个核心组件构成:

9.2.1 线性反馈移位寄存器(LFSR)

  • 16 个 31 位的寄存器
  • 提供长周期的伪随机序列
  • 采用模 2³¹-1 运算

9.2.2 比特重组(BR)

  • 从 LFSR 中提取数据
  • 进行比特级别的重排
  • 输出 128 位数据给非线性函数

9.2.3 非线性函数 F

  • 包含 4 个 S 盒(与 AES S 盒不同)
  • 进行非线性混淆运算
  • 输出 32 位密钥流字

9.3 工作流程

  1. 初始化:加载 128 位密钥和 128 位初始向量(IV)
  2. 预热:运行若干轮但不输出密钥流
  3. 工作阶段:每轮输出 32 位密钥流字
  4. 加密:明文与密钥流逐比特异或

9.4 技术规格

  • 密钥长度:128 bit
  • IV 长度:128 bit(在 LTE 中为 32 bit)
  • 输出:32 bit/轮的密钥流
  • 安全强度:128 位

9.5 与分组密码的区别

流密码与分组密码的根本区别在于:

  • 分组密码(如 SM4):将数据分成固定长度的块,逐块加密
  • 流密码(如 ZUC):生成连续的密钥流,与明文逐比特异或

流密码的优势:

  • 无需填充(适合变长数据)
  • 硬件实现简单高效
  • 延迟低(逐比特处理)
  • 适合实时通信场景

9.6 在 4G/5G 中的应用

在 3GPP 标准中,ZUC 被用于:

  • 128-EEA3:用户面数据加密(保护通话内容、上网数据)
  • 128-EIA3:控制面完整性保护(防止信令篡改)

这意味着全球数十亿 4G 手机在使用 ZUC 算法保护通信安全。

9.7 典型应用场景

  • 4G/5G 移动通信加密
  • 卫星通信加密
  • 无线传感器网络
  • 实时音视频加密
  • 低延迟要求的加密场景

十、横向对比:七大算法的核心差异

10.1 按密码类型分类

对称加密(共享密钥)

  • SM1、SM4、SM7
  • 加解密使用同一密钥
  • 速度快,适合大数据量加密
  • 密钥分发是主要挑战

非对称加密(公钥密码)

  • SM2、SM9
  • 使用公钥/私钥对
  • 速度慢,适合密钥交换和签名
  • SM2 需要证书,SM9 不需要

哈希算法

  • SM3
  • 单向不可逆
  • 用于完整性校验和签名

流密码

  • ZUC
  • 生成密钥流逐比特加密
  • 适合实时通信

10.2 安全强度对比

算法安全强度等效 RSA 强度
SM1128 bit~3072 bit
SM2128 bit~3072 bit
SM3128 bit(抗碰撞)
SM4128 bit~3072 bit
SM7未公开未公开
SM9128 bit~3072 bit
ZUC128 bit~3072 bit

所有国密算法的安全强度均达到 128 位,这是当前商用密码的推荐安全等级。

10.3 性能特征对比

算法加密速度实现复杂度适用平台
SM1快(硬件)高(仅硬件)加密芯片
SM2通用
SM3通用
SM4通用
SM7快(硬件)高(仅硬件)特定芯片
SM9很慢服务器端
ZUC极快通用/硬件

十一、场景选型指南:如何选择合适的国密算法

11.1 数据存储加密

推荐:SM4(CBC/GCM 模式)

理由:数据量大,需要高效的对称加密;SM4 软件实现成熟,支持各种工作模式。

11.2 数字签名与身份认证

推荐:SM2(传统 PKI 场景)或 SM9(大规模无证书场景)

理由:SM2 适合已有 CA 体系的场景;SM9 适合设备数量巨大、证书管理困难的物联网场景。

11.3 通信链路加密

推荐:ZUC(移动通信)或 SM4-GCM(通用网络通信)

理由:ZUC 在 4G/5G 中有原生支持;SM4-GCM 提供认证加密,适合 IP


十二、相关代码应用参考

一、JavaScript 版本

推荐使用 sm-crypto-v2,基于 noble-curves 重构,性能优异,支持 ESM/CJS 双格式。

安装:

1
npm install --save sm-crypto-v2

SM2 签名验签:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import { sm2 } from 'sm-crypto-v2'

// 1. 生成密钥对
const keypair = sm2.generateKeyPairHex()
const { publicKey, privateKey } = keypair

// 2. 签名(带 SM3 杂凑)
const msg = 'Hello, SM2 Signature!'
const signature = sm2.doSignature(msg, privateKey, {
hash: true,
publicKey, // 传入公钥可跳过公钥推导,提升速度
})
console.log('签名值:', signature)

// 3. 验签
const isValid = sm2.doVerifySignature(msg, signature, publicKey, {
hash: true,
publicKey,
})
console.log('验签结果:', isValid) // true

SM4 加解密(CBC 模式):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { sm4 } from 'sm-crypto-v2'

const msg = 'Hello, SM4 Encryption!'
const key = '0123456789abcdeffedcba9876543210' // 128位密钥(32位hex)
const iv = 'fedcba98765432100123456789abcdef' // 128位IV

// 加密(CBC模式)
const encrypted = sm4.encrypt(msg, key, {
mode: 'cbc',
iv,
})
console.log('密文:', encrypted)

// 解密
const decrypted = sm4.decrypt(encrypted, key, {
mode: 'cbc',
iv,
})
console.log('明文:', decrypted) // Hello, SM4 Encryption!

SM4 GCM 模式(认证加密):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import { sm4 } from 'sm-crypto-v2'

const msg = 'Authenticated encryption test'
const key = '0123456789abcdeffedcba9876543210'
const iv = 'fedcba98765432100123456789abcdef'
const aad = 'additional-auth-data' // 可选的附加认证数据

// GCM 加密(输出密文 + Tag)
const result = sm4.encrypt(msg, key, {
mode: 'gcm',
iv,
associatedData: aad,
outputTag: true,
})
console.log('密文:', result.output)
console.log('Tag:', result.tag)

// GCM 解密
const decrypted = sm4.decrypt(result.output, key, {
mode: 'gcm',
iv,
associatedData: aad,
tag: result.tag,
})
console.log('明文:', decrypted)

二、Python 版本

推荐使用 easy-gmssl(基于北京大学 GmSSL 团队优化),安装时自动编译底层 C 库,接口友好。

安装:

1
pip install easy-gmssl

SM2 签名验签:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from easy_gmssl import EasySM2SignKey, EasySM2VerifyKey, SignatureMode

signer_id = 'test_signer'
message = b'Hello, SM2 Signature!'

# 1. 签名
signer = EasySM2SignKey(
signer_id=signer_id,
pem_private_key_file='./keys/sm2_private.pem',
password='123456' # 私钥密码,无密码传 None
)
signer.UpdateData(message)
sign_value = signer.GetSignValue(signature_mode=SignatureMode.RS)
print('签名值(hex):', sign_value.hex())

# 2. 验签
verifier = EasySM2VerifyKey(
signer_id=signer_id,
pem_public_key_file='./keys/sm2_public.pem'
)
verifier.UpdateData(message)
is_valid = verifier.VerifySignature(sign_value, signature_mode=SignatureMode.RS)
print('验签结果:', is_valid) # True

SM4 加解密(CBC 模式):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from easy_gmssl import EasySm4CBC
from easy_gmssl.gmssl import SM4_BLOCK_SIZE, SM4_CBC_IV_SIZE

key = b'x' * SM4_BLOCK_SIZE # 16字节密钥
iv = b'y' * SM4_CBC_IV_SIZE # 16字节IV
plaintext = b'Hello, SM4 Encryption!'

# 加密
enc = EasySm4CBC(key, iv, True) # True = 加密模式
cipher = enc.Update(plaintext) + enc.Finish()
print('密文(hex):', cipher.hex())

# 解密
dec = EasySm4CBC(key, iv, False) # False = 解密模式
decrypted = dec.Update(cipher) + dec.Finish()
print('明文:', decrypted) # b'Hello, SM4 Encryption!'

SM4 GCM 模式(认证加密):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from easy_gmssl import EasySm4GCM
from easy_gmssl.gmssl import SM4_BLOCK_SIZE, SM4_CBC_IV_SIZE, SM4_GCM_DEFAULT_TAG_SIZE

key = b'x' * SM4_BLOCK_SIZE
iv = b'y' * SM4_CBC_IV_SIZE
aad = b'additional-auth-data'
tag_len = SM4_GCM_DEFAULT_TAG_SIZE
plaintext = b'Authenticated encryption test'

# GCM 加密
enc = EasySm4GCM(key, iv, aad, tag_len, True)
cipher = enc.Update(plaintext) + enc.Finish()
print('密文长度:', len(cipher))

# GCM 解密(aad 和 tag_len 必须与加密时一致)
dec = EasySm4GCM(key, iv, aad, tag_len, False)
decrypted = dec.Update(cipher) + dec.Finish()
print('明文:', decrypted)

三、Golang 版本

推荐使用 github.com/tjfoc/gmsm,API 清晰,社区使用广泛,遵循 GM/T 系列标准。

安装:

1
go get github.com/tjfoc/gmsm

SM2 签名验签:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import (
"crypto/rand"
"fmt"
"log"

"github.com/tjfoc/gmsm/sm2"
)

func main() {
// 1. 生成密钥对
privKey, err := sm2.GenerateKey(rand.Reader)
if err != nil {
log.Fatal("生成密钥对失败:", err)
}
pubKey := &privKey.PublicKey

// 2. 签名
message := []byte("Hello, SM2 Signature!")
signature, err := privKey.Sign(rand.Reader, message, nil)
if err != nil {
log.Fatal("签名失败:", err)
}
fmt.Printf("签名值: %x\n", signature)

// 3. 验签
isValid := pubKey.Verify(message, signature)
fmt.Println("验签结果:", isValid) // true
}

SM4 加解密(ECB 模式):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import (
"fmt"
"log"

"github.com/tjfoc/gmsm/sm4"
)

func main() {
key := []byte("1234567890abcdef") // 16字节密钥
data := []byte("Hello, SM4 Encryption!")

// 加密(ECB模式,PKCS7填充)
cipher, err := sm4.Sm4Ecb(key, data, true) // true = 加密
if err != nil {
log.Fatal("加密失败:", err)
}
fmt.Printf("密文: %x\n", cipher)

// 解密
decrypted, err := sm4.Sm4Ecb(key, cipher, false) // false = 解密
if err != nil {
log.Fatal("解密失败:", err)
}
fmt.Println("明文:", string(decrypted))
}

SM3 哈希计算(常配合 SM2 签名使用):

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import (
"fmt"

"github.com/tjfoc/gmsm/sm3"
)

func main() {
data := []byte("Hello, SM3 Hash!")
digest := sm3.Sum256(data)
fmt.Printf("SM3摘要: %x\n", digest)
}

四、工程化避坑要点

要点说明
SM2 密文格式存在 C1C3C2(新标准)和 C1C2C3(旧标准)两种排列顺序,跨系统对接时必须统一约定
SM2 签名 userId国标默认 userId 为 "1234567812345678",签名和验签双方必须使用相同的 userId
SM4 工作模式生产环境推荐使用 CBC 或 GCM 模式,ECB 模式因相同明文块产生相同密文,存在数据模式泄露风险
密钥管理私钥切勿硬编码,生产环境应使用 KMS、HSM 或安全文件系统存储
跨语言互通不同语言的库对密钥/密文的编码格式(hex/base64/DER)可能不同,联调时需明确约定

以上代码均可直接复制运行,如需进一步了解 SM9(标识密码)或 ZUC(流密码)的集成示例,供参考。

【国密算法标准】国产(商用)密码算法之间的区别以及基本理解

https://www.wdft.com/8efd9936.html

Author

Jaco Liu

Posted on

2026-09-08

Updated on

2026-09-19

Licensed under