2. 密码学基础回顾:对称加密与非对称加密、哈希函数、数字签名、密钥交换协议、椭圆曲线密码学(ECC)基础

本章作为《密码算法安全通信:国密算法实现源码实战》的基础铺垫,系统回顾现代密码学的核心构件。理解这些基础概念是掌握国密算法(SM2/SM3/SM4/SM9)的前提。我们将从对称加密与非对称加密的对比开始,逐步深入到哈希函数、数字签名、密钥交换协议,最后建立椭圆曲线密码学(ECC)的数学直觉。

2.1 对称加密与非对称加密

加密算法根据密钥的使用方式分为两大类:对称加密与非对称加密。对称加密使用同一个密钥进行加密和解密,速度快,适合大量数据加密;非对称加密使用公钥加密、私钥解密,解决了密钥分发问题,但性能较慢。

特性 对称加密 非对称加密
密钥数量 1 个(共享密钥) 2 个(公钥 + 私钥)
密钥分发 困难,需安全信道 公钥可公开,私钥本地保管
计算速度 快(硬件加速友好) 慢(大数运算)
典型算法 SM4, AES, DES SM2, RSA, ECC
主要用途 数据加密 密钥交换、数字签名
安全基础 置换/代换/扩散 数学难题(离散对数/大整数分解)
实战要点: 国密体系中,SM4 作为对称加密算法,SM2 作为非对称加密算法。实际通信中通常采用“混合加密”:用 SM2 加密 SM4 的会话密钥,再用 SM4 加密业务数据。

2.2 哈希函数

哈希函数将任意长度的输入数据映射为固定长度的输出(摘要),具有单向性、抗碰撞性和雪崩效应。哈希函数不是加密算法(不可逆),而是数据完整性校验的核心工具。

  • SM3:国密哈希标准,输出 256 位(32 字节)摘要,安全强度等同于 SHA-256。
  • 应用场景:数字签名(先哈希后签名)、消息认证码(HMAC)、密码存储、区块链。
  • 安全要求:抗强碰撞(找到两个不同输入产生相同摘要)需达到 2^(n/2) 计算复杂度。
代码示例:SM3 哈希计算(Python + gmssl)
from gmssl import sm3

data = b"Hello, 国密世界!"
digest = sm3.sm3_hash(data)
print(digest.hex())  # 输出 64 位十六进制字符串

2.3 数字签名

数字签名提供身份认证、数据完整性和不可否认性。签名者使用私钥对消息的哈希值进行签名,验证者使用签名者的公钥验证签名。

数字签名流程 发送方(签名者) 原始消息 M 哈希值 H(M) 私钥签名 → 签名值 S 传输 (M, S) 接收方(验证者) 接收消息 M' 哈希值 H(M') 公钥验证 (S, H(M')) 验证结果 H(M) == H(M') 且签名有效 → 通过
常见误区: 数字签名不是对原始消息加密,而是对消息的哈希值进行签名。签名值本身不隐藏消息内容,只提供认证和完整性保护。

2.4 密钥交换协议

密钥交换协议允许通信双方在不安全的信道上协商出一个共享密钥。经典的 Diffie-Hellman(DH)协议基于离散对数难题,而 ECDH 将其迁移到椭圆曲线上,效率更高。

  • DH 协议:双方各自生成私钥 a、b,计算公钥 A = g^a mod p、B = g^b mod p,交换公钥后计算共享密钥 K = B^a = A^b = g^(ab) mod p。
  • ECDH 协议:在椭圆曲线上,私钥为整数 d,公钥为点 Q = d * G(G 为基点),共享密钥为双方私钥与对方公钥的点乘结果。
  • 国密实现:SM2 密钥交换协议基于 ECDH,并增加了身份认证和密钥确认步骤,防止中间人攻击。

2.5 椭圆曲线密码学(ECC)基础

ECC 是目前最高效的公钥密码体系之一,在同等安全强度下,ECC 的密钥长度远小于 RSA。国密 SM2 算法正是基于 ECC 的椭圆曲线数字签名算法(ECDSA)和椭圆曲线密钥交换协议(ECDH)。

2.5.1 椭圆曲线方程

密码学中使用的椭圆曲线是定义在有限域上的 Weierstrass 方程:

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

其中:
- p 为大素数,定义有限域 Fp
- a, b 为域内常数,满足 4a³ + 27b² ≠ 0 (mod p)
- 所有点 (x, y) 加上无穷远点 O 构成阿贝尔群

2.5.2 点加与标量乘法

ECC 的核心运算是点加和标量乘法。标量乘法 k * P 表示将点 P 自加 k 次,这是 ECC 安全性的数学基础——椭圆曲线离散对数问题(ECDLP):已知基点 G 和公钥 Q = d * G,求解私钥 d 在计算上不可行。

ECC 标量乘法:Q = d * G 基点 G(公开参数) 私钥 d(随机大整数) 标量乘法运算 公钥 Q(椭圆曲线点) ECDLP:已知 Q 和 G,求 d 在计算上不可行(指数级复杂度) 这是 ECC 安全性的数学基石

2.5.3 国密 SM2 使用的曲线参数

SM2 推荐使用一条 256 位素域上的椭圆曲线,参数如下(十六进制):

参数 值(十六进制) 说明
p FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF 素数模数
a FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC 曲线系数 a
b 28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93 曲线系数 b
Gx 32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7 基点 x 坐标
Gy BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0 基点 y 坐标
n FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123 基点阶(素数)
实战提示: 在实现 SM2 时,务必验证公钥 Q 是否在曲线上(检查 Q 是否满足曲线方程且不是无穷远点),这是防止无效曲线攻击的基本措施。

2.6 本章小结

本章回顾了密码学的五大基础构件:

  • 对称加密(SM4)—— 高效数据加密
  • 非对称加密(SM2)—— 密钥分发与数字签名
  • 哈希函数(SM3)—— 数据完整性校验
  • 数字签名 —— 身份认证与不可否认性
  • 密钥交换协议(ECDH)—— 安全协商共享密钥
  • ECC 基础 —— 椭圆曲线离散对数问题与 SM2 曲线参数