2. 密码学工程基础

在国密算法与密码应用工程中,真正决定系统安全性的往往不是“选了哪个算法”,而是四类基础密码原语如何组合、密钥如何流转、以及工程约束是否被正确满足。本节围绕对称加密、非对称加密、哈希、数字签名与密钥管理,从原理到工程落地建立一条完整认知链。

一、四类原语的分工与本质差异

对称加密使用同一把密钥完成加密与解密,典型代表是 SM4。它的优势是速度快、适合大数据量加密,工程上常用于数据加密、会话密钥保护、磁盘与数据库字段加密。其核心约束是:通信双方必须共享同一密钥,而密钥分发本身不能靠对称加密解决。

非对称加密使用公钥加密、私钥解密,或私钥签名、公钥验签,典型代表是 SM2。它解决了密钥分发与身份绑定问题,但运算速度远低于对称加密,因此工程中通常只用于加密短数据(如会话密钥)或做数字签名,不直接加密大文件。

哈希函数(如 SM3)把任意长度输入压缩为固定长度摘要,具备单向性、抗碰撞性和雪崩效应。它不提供机密性,但用于完整性校验、口令存储、消息摘要和签名前的消息压缩。

数字签名是“哈希 + 非对称加密”的组合:先对消息做 SM3 摘要,再用 SM2 私钥对摘要签名,验证方用公钥验签。它同时提供完整性、身份认证和不可否认性,是电子合同、证书、代码签名和交易防篡改的基础。

四类密码原语的分工与组合关系 对称加密 SM4 同一密钥加解密 速度快 · 适合大数据量 约束:密钥需安全共享 非对称加密 SM2 公钥加密 · 私钥解密 解决密钥分发与身份绑定 约束:速度慢 · 只加密短数据 哈希 SM3 任意输入 → 固定摘要 单向 · 抗碰撞 · 雪崩效应 约束:不提供机密性 数字签名 SM3 摘要 + SM2 私钥签名 完整性 · 认证 · 不可否认 约束:依赖私钥安全 工程组合模式:SM2 保护 SM4 会话密钥 → SM4 加密业务数据 → SM3 校验完整性 → SM2 签名防抵赖 非对称解决“密钥怎么安全给”,对称解决“数据怎么快速加密”,哈希解决“有没有被改”,签名解决“谁发的、能否否认” 密钥管理生命周期与工程约束 生成 存储 分发 使用 轮换 销毁 • 生成:使用国密认证的随机数发生器,SM2 私钥必须由可信环境产生 • 存储:私钥加密存储或放入 HSM/密码机,禁止明文落盘;对称密钥用 KEK 保护 • 分发:SM2 加密传输会话密钥,或通过密钥协商协议生成共享密钥 • 轮换与销毁:按周期或事件触发轮换,旧密钥归档后安全销毁,保留审计记录

二、工程约束:从算法参数到系统边界

算法正确不等于系统安全。工程中必须关注以下约束。

密钥长度与安全强度。SM4 分组长度 128 位、密钥长度 128 位;SM3 输出 256 位摘要;SM2 推荐使用 256 位素域曲线。这些参数决定了抗暴力破解的下限,但真正影响安全的是密钥是否随机、是否泄露、是否复用。

模式与填充。SM4 是分组密码,直接加密超过 16 字节的数据需要工作模式。ECB 模式会暴露明文模式,工程中应使用 CBC、CTR 或 GCM 等模式。CBC 需要随机 IV,GCM 需要唯一 nonce,否则会严重削弱安全性。示例中若使用 CBC,IV 应为 16 字节随机数,并与密文一起传输。

签名与验签的格式。SM2 签名结果通常为 DER 编码的 r、s 值,验签方需要按相同曲线参数和用户标识计算。工程中常见问题是双方对“签名原文”理解不一致:一方对原始消息签名,另一方对摘要签名,导致验签失败。正确做法是明确签名输入是消息本身还是消息摘要,并在接口文档中固定。

性能与并发。SM2 签名和验签的耗时通常是 SM4 加解密的数十倍以上。高并发场景下,应把非对称运算集中在密钥交换和签名环节,业务数据走 SM4;同时注意密码机或 HSM 的吞吐上限,避免成为瓶颈。

三、一个可落地的混合加密流程

假设 A 要向 B 发送一份敏感文件,工程上可采用如下流程:

  1. A 生成一次性 SM4 会话密钥 K,使用 SM4-GCM 加密文件,得到密文 C 和认证标签 T。
  2. A 用 B 的 SM2 公钥加密 K,得到密钥密文 EK。
  3. A 对“C + T + EK”计算 SM3 摘要,再用自己的 SM2 私钥签名,得到签名 S。
  4. A 将 EK、C、T、S 以及自己的 SM2 公钥证书一起发送给 B。
  5. B 先验证证书,再用 A 的公钥验签,确认数据来源和完整性。
  6. B 用自己的 SM2 私钥解密 EK 得到 K,再用 K 解密 C 并校验 T。

这个流程同时满足机密性、完整性、身份认证和不可否认性。工程实现时,K 必须每次随机生成,不能复用;GCM 的 nonce 不能重复;签名前要明确对哪些字段拼接后做摘要,避免歧义。

工程检查要点:密钥是否由合规随机源生成;私钥是否在受保护环境;SM4 是否使用安全模式;IV/nonce 是否唯一;签名输入是否双方一致;密钥是否有轮换和销毁策略;密码运算是否可审计。

四、密钥管理:最容易被低估的环节

密钥管理贯穿生成、存储、分发、使用、轮换、销毁六个阶段。工程上最常见的失败不是算法被攻破,而是密钥硬编码在代码里、私钥明文放在配置文件中、会话密钥长期不换、离职人员仍持有密钥。

建议的工程约束包括:SM2 私钥必须存放在 HSM 或密码机中,至少要用口令加密保护;对称密钥使用 KEK 分层保护,KEK 本身由硬件保护;密钥分发优先使用 SM2 加密或密钥协商,不通过明文通道;建立密钥轮换周期,例如会话密钥每次会话更换、数据密钥按季度轮换;销毁时覆盖存储介质并保留审计日志。

只有把算法原理、组合方式和密钥生命周期约束放在一起设计,国密应用才具备真正的工程安全性。