密码学基础概念:对称加密、非对称加密与哈希函数

密码学概念 · 2026-05-31

概述

密码学(Cryptography)是研究信息保护的科学,其核心目标是在不安全的信道上实现安全通信。现代密码学建立在计算复杂性理论基础之上——不是让解密在物理上不可能,而是在计算上不可行

密码学提供四大核心安全服务:

安全服务含义典型机制
机密性(Confidentiality)防止未授权的信息泄露对称加密、公钥加密
完整性(Integrity)防止未授权的数据篡改哈希函数、MAC、数字签名
认证性(Authentication)验证通信实体的身份数字签名、证书、MAC
不可否认性(Non-repudiation)防止发送方否认已发送的消息数字签名
实现这些安全服务依赖三大基础原语(Primitive):

  • 对称加密(Symmetric Encryption)— 加密和解密使用同一密钥
  • 非对称加密(Asymmetric Encryption)— 加密和解密使用不同密钥(公钥/私钥对)
  • 密码学哈希函数(Cryptographic Hash Function)— 将任意长度输入映射为固定长度输出

对称加密

定义与历史

对称加密是最古老的加密形式:发送方和接收方共享一个秘密密钥 $K$,加密和解密都使用该密钥。

形式化定义:对称加密方案是一个三元组 $(Gen, Enc, Dec)$:

$$Gen(1^n) \rightarrow K \quad \text{(密钥生成)}$$ $$Enc_K(M) \rightarrow C \quad \text{(加密)}$$ $$Dec_K(C) = M \quad \text{(解密)}$$

历史上著名的对称加密算法包括:

算法年份分组长度密钥长度状态
DES197764 bit56 bit❌ 已破解(暴力)
3DES199864 bit168 bit⚠️ 逐步淘汰
AES2001128 bit128/192/256 bit✅ 当前标准
SM42006/2012128 bit128 bit✅ 国密标准

AES 算法核心原理

AES(Advanced Encryption Standard)采用 SPN(Substitution-Permutation Network)结构。加密过程为:

$$C = AddRoundKey \circ \left[\prod_{i=1}^{N_r-1}(MixColumns \circ SubBytes \circ ShiftRows)\right] \circ SubBytes \circ ShiftRows \circ AddRoundKey$$

其中 $N_r$ 为轮数(10/12/14 轮,取决于密钥长度)。AES 的四种操作:

  • SubBytes:字节替换,通过 S 盒实现非线性变换
  • ShiftRows:行移位,实现字节级别的扩散
  • MixColumns:列混合,实现列间的线性混合
  • AddRoundKey:轮密钥加,将轮密钥与状态异或

SM4 算法核心原理

SM4 采用 非平衡 Feistel 结构,与 AES 截然不同:

$$X_{i+4} = X_i \oplus T(X_{i+1} \oplus X_{i+2} \oplus X_{i+3} \oplus rk_i), \quad i = 0, 1, \ldots, 31$$

合成置换 $T = \tau \circ L$,其中 $\tau$ 是 4 个 S 盒并行查表,$L$ 是 32-bit 线性变换。SM4 的 32 轮迭代提供了充分的安全边际。

对称加密的工作模式

分组密码只能加密固定长度的数据块,实际数据往往远超一个分组。工作模式(Mode of Operation)定义了如何将分组密码扩展为任意长度数据的加密方案:

模式公式特点
ECB$C_i = E_K(P_i)$❌ 不安全,相同明文产生相同密文
CBC$C_i = E_K(P_i \oplus C_{i-1})$需要 IV,串行加密
CTR$C_i = P_i \oplus E_K(Nonce \Counter)$✅ 并行,最常用
GCMCTR + GHASH✅ 认证加密,同时保证机密性和完整性
关键安全原则:永远不要使用 ECB 模式。CBC 和 CTR 只提供机密性,不提供完整性保护。生产环境应优先使用 AEAD 模式(如 GCM、CCM)。

密钥管理挑战

对称加密的核心挑战是密钥分发——如何在不安全的信道上安全地共享密钥?假设 Alice 和 Bob 从未见面,他们如何协商出一个共享的秘密密钥?这就是著名的 密钥分发问题(Key Distribution Problem),它直接催生了非对称加密的诞生。

非对称加密

核心思想

非对称加密(也称公钥密码)由 Diffie 和 Hellman 在 1976 年提出,是密码学历史上最重要的突破之一。其核心思想是:

  • 每个用户生成一对密钥:公钥(Public Key)公开,私钥(Private Key)保密
  • 公钥加密的内容只能用对应的私钥解密
  • 从公钥推导私钥在计算上不可行
形式化定义:公钥加密方案是一个三元组 $(Gen, Enc, Dec)$:

$$Gen(1^n) \rightarrow (pk, sk) \quad \text{(密钥对生成)}$$ $$Enc_{pk}(M) \rightarrow C \quad \text{(公钥加密)}$$ $$Dec_{sk}(C) = M \quad \text{(私钥解密)}$$

三大困难问题

所有公钥密码方案的安全性都建立在以下数学困难问题之上:

困难问题基于该问题的算法数学描述
大整数分解(IFP)RSA给定 $n = p \times q$,求 $p, q$
离散对数(DLP)DSA、ElGamal、ECDH给定 $g, h$,求 $x$ 使 $g^x \equiv h \pmod{p}$
椭圆曲线离散对数(ECDLP)ECDSA、SM2、X25519给定椭圆曲线上的点 $G, Q$,求 $k$ 使 $Q = kG$
ECDLP 的亚指数时间算法不存在(目前最好的算法是指数时间的),因此椭圆曲线密码学可以用更短的密钥提供同等安全性。具体对比:

安全强度RSA 密钥长度ECC 密钥长度SM2 密钥长度
80 bit1024 bit160 bit
112 bit2048 bit224 bit
128 bit3072 bit256 bit256 bit
256 bit15360 bit512 bit512 bit
关键洞察:SM2 使用 256-bit 椭圆曲线,提供约 128-bit 安全强度,与 RSA 3072-bit 相当,但密钥长度仅为后者的 1/12。

主要公钥加密方案对比

算法年份基于问题主要用途安全状态
RSA1977IFP加密、签名⚠️ 需长密钥
ElGamal1985DLP加密、签名✅ 安全
ECDSA2005ECDLP签名✅ 安全
SM22006ECDLP签名、加密、密钥交换✅ 国密标准

SM2 国密算法概要

SM2 是中国国家密码管理局发布的椭圆曲线公钥密码算法,标准编号为 GM/T 0003-2012(系列标准)/ GB/T 32918-2016(国家标准)。SM2 推荐使用 256-bit 椭圆曲线 $E: y^2 = x^3 + ax + b$,其曲线参数在 GM/T 0003.5-2012 和 GB/T 32918.5-2016 中定义。

SM2 包含三个核心功能:

  • 数字签名:基于 ECDSA 的变体,增加了用户 ID 绑定和 SM3 哈希
  • 密钥交换:类似 ECDH,但增加了相互认证和密钥确认
  • 公钥加密:基于椭圆曲线的混合加密方案
⚠️ 重要提示:SM2 与 NIST P-256(SECP256R1)使用完全不同的曲线参数。两者不能互通,使用 ec.SECP256R1() 生成的密钥不兼容 SM2 标准。实际开发中需要使用 gmssl 库或支持国密的 OpenSSL 分支(如 Tongsuo/BabaSSL)。

密码学哈希函数

定义

密码学哈希函数(Cryptographic Hash Function)是一种将任意长度的输入映射为固定长度输出的函数,且满足特定的安全性质。

形式化定义:哈希函数 $H: \{0,1\}^* \rightarrow \{0,1\}^n$ 必须满足以下三个安全性要求:

1. 抗原像性(Pre-image Resistance):给定 $h = H(x)$,难以找到 $x'$ 使得 $H(x') = h$

$$\forall \text{PPT 敌手 } \Pr[H(x') = h : x' \leftarrow \mathcal{A}(h)] \leq negl(n)$$

2. 抗第二原像性(Second Pre-image Resistance):给定 $x$,难以找到 $x' \neq x$ 使得 $H(x) = H(x')$

3. 抗碰撞性(Collision Resistance):难以找到任何 $x \neq x'$ 使得 $H(x) = H(x')$

经典哈希算法对比

算法输出长度结构设计年份安全状态
MD5128 bitMerkle-Damgård1992❌ 已被破解(碰撞)
SHA-1160 bitMerkle-Damgård1995❌ 已被破解(碰撞)
SHA-256256 bitMerkle-Damgård2001✅ 安全
SHA-3 (Keccak)可变海绵结构2015✅ 安全
SM3256 bitMerkle-Damgård2008✅ 国密标准

SM3 算法核心

SM3 是中国国家密码管理局发布的密码杂凑算法(GM/T 0004-2012 / GB/T 32905-2016 配套标准),输出长度为 256 比特。

SM3 采用 Merkle-Damgård 结构,其核心流程:

  • 消息填充(Padding):将消息长度填充至 512-bit 的倍数
- 附加一个 1 比特,然后填充 0 直到长度 $\equiv 448 \pmod{512}$ - 最后 64 比特存放原始消息长度(以比特为单位)

  • 迭代压缩:$CV_i = CF(CV_{i-1}, M_i)$,其中 $CV_0 = IV$(初始值固定为 7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e
  • 压缩函数 $CF$:包含 64 轮运算,使用 6 个布尔函数($FF_j$ 和 $GG_j$)和一个置换函数($P_1$)
SM3 的安全强度与 SHA-256 相当,提供 128-bit 的抗碰撞安全性。

哈希函数的应用场景

哈希函数在现代密码学中的应用远超单纯的"摘要"功能:

应用说明示例
数据完整性验证文件未被篡改软件发布校验、Git commit hash
数字签名先哈希后签名,效率更高对长消息签名
密码存储加盐哈希存储用户密码bcrypt、Argon2
消息认证码HMAC = Hash + 密钥API 签名、JWT
密钥派生从密码/共享秘密派生密钥PBKDF2、HKDF
默克尔树构建高效的数据完整性证明区块链、CT 日志

三大原语的协同

在实际系统中,三大基础原语从不单独使用。典型的安全通信协议(如 TLS)会组合使用所有三种原语:

  • 非对称加密:用于密钥交换(协商对称加密的会话密钥)或身份认证(数字签名)
  • 对称加密:用于加密实际传输的数据(高效)
  • 哈希函数:用于消息完整性校验(MAC)、证书指纹、密钥派生
例如,TLS 1.3 握手的基本流程:

CODE
Client                                          Server
  |                                               |
  |--- ClientHello (支持的密码套件列表) -------->|
  |<-- ServerHello (选定的密码套件) --------------|
  |<-- Certificate (服务器证书 + 公钥) ----------|
  |<-- ServerFinished ----------------------------|
  |--- ClientFinished ---------------------------->|
  |                                               |
  |==== 对称加密通道(会话密钥) ==================|

这个流程中:

  • 数字签名(非对称加密):服务器用私钥签名证明身份
  • 密钥交换(非对称加密):双方安全协商出会话密钥
  • 对称加密:后续所有数据加密传输
  • 哈希函数:证书指纹、握手消息完整性验证

参考来源

相关实践