ElGamal 数字签名算法:从 DLP 到可证明安全的先驱

算法原理 · 2026-09-22

概述

1985 年,Taher ElGamal 在 *IEEE Transactions on Information Theory* 发表论文 *\"A Public-Key Cryptosystem and a Signature Scheme Based on the Discrete Logarithm Problem\"*,首次将公钥密码学的核心思想应用于数字签名。这是历史上第一个被证明存在性安全(Existential Unforgeability, EUF-CMA)的数字签名方案。

与 RSA 签名(基于大整数分解)不同,ElGamal 签名基于离散对数问题(Discrete Logarithm Problem, DLP)。这种构造思路启发了后续的 DSA(数字签名算法)和 ECDSA(椭圆曲线 DSA),并最终催生了国密 SM2 签名标准(GM/T 0003.2-2012)。

对比维度ElGamal 签名DSAECDSASM2 签名
提出年份19851991 (NIST)19922010 (GM/T)
数学基础DLP in $\mathbb{Z}_p^*$DLP in $\mathbb{Z}_p^*$ECDLPECDLP
安全性证明EUF-CMAEUF-CMAEUF-CMAEUF-CMA
签名长度2×$q$ 位$2 \times 160$ 位$2 \times n$ 位64 字节
注意:ElGamal 既有加密方案,也有签名方案,二者共享相同的数学基础(DLP),但构造思路不同。加密方案(elgamal-encryption-scheme)侧重于加密通信,签名方案侧重于身份认证与消息完整性。

数学基础:离散对数问题

形式化定义

设 $p$ 为大素数,$g$ 为 $\mathbb{Z}_p^*$ 的生成元(或阶为素数 $q | (p-1)$ 的元素),离散对数问题定义为:

$$\text{给定 } p, g, h = g^x \bmod p, \text{ 求 } x \in [0, q-1]$$

该问题的计算困难性是 ElGamal 签名的安全基础。对于 2048 位素数 $p$,已知最有效的通用算法是数域筛法(Number Field Sieve, NFS),其复杂度为:

$$L_p\left[\frac{1}{3}, \sqrt[3]{\frac{64}{9}}\right] = \exp\left(\left(\sqrt[3]{\frac{64}{9}} + o(1)\right)(\ln p)^{1/3}(\ln \ln p)^{2/3}\right)$$

要达到 128 位安全强度,$p$ 至少需要 3072 位(NIST SP 800-57 Part 1 Rev. 5 推荐)。

参数选择

根据 RFC 2447 和 RFC 5114,推荐参数如下:

安全级别$p$ 位数$q$ 位数建议使用场景
80 位1024160已不建议使用
112 位2048224过渡期可用
128 位3072256当前推荐
192 位7680384长期安全需求

签名方案构造

密钥生成

参数:

  • 大素数 $p$(如 3072 位)
  • 素数 $q | (p-1)$(如 256 位)
  • 生成元 $g \in \mathbb{Z}_p^*$,满足 $g^q \equiv 1 \pmod{p}$
步骤:
  • 随机选取私钥 $x \in_R [1, q-1]$
  • 计算公钥 $y = g^x \bmod p$
密钥对: 公钥 $(p, q, g, y)$,私钥 $x$

签名生成

对消息 $M$ 进行签名:

  • 计算消息哈希 $e = H(M)$,其中 $H$ 为密码学哈希函数(如 SHA-256)
  • 随机选取 ephemeral key $k \in_R [1, q-1]$,满足 $\gcd(k, q) = 1$
  • 计算 $r = g^k \bmod p$
  • 计算 $s = k^{-1}(e - xr) \bmod q$
签名输出: $(r, s)$

约束条件:

  • $r \neq 0$ 且 $r \neq 1$(否则签名无效)
  • $s \neq 0$(否则签名无效)
  • $k$ 必须每次随机选取,重复使用会导致私钥泄露

签名验证

给定消息 $M$ 和签名 $(r, s)$:

  • 验证 $0 < r < p$ 且 $0 < s < q$
  • 计算 $e = H(M)$
  • 计算 $w = s^{-1} \bmod q$
  • 计算 $u_1 = ew \bmod q$
  • 计算 $u_2 = rw \bmod q$
  • 计算 $v = (g^{u_1} \cdot y^{u_2} \bmod p) \bmod q$
  • 若 $v = r$,则签名有效;否则无效

正确性证明

验证过程的正确性基于模运算的代数性质:

$$g^{u_1} \cdot y^{u_2} \equiv g^{ew} \cdot (g^x)^{rw} \pmod{p}$$

$$\equiv g^{w(e + xr)} \pmod{p}$$

由于 $s = k^{-1}(e - xr) \bmod q$,则 $w = s^{-1}$,代入得:

$$e + xr = sk \bmod q$$

因此:

$$g^{w(e+xr)} = g^{sk} = g^{k \cdot k^{-1}(e-xr) \cdot k} = g^e \pmod{p}$$

最终得到 $v = r$,验证通过。

安全性分析

EUF-CMA 安全性证明

ElGamal 签名方案在随机预言模型(Random Oracle Model, ROM)下被证明具有 EUF-CMA(Existential Unforgeability under Chosen Message Attack)安全性:

定理(Shoup, 2000):若离散对数问题在群 $\mathbb{Z}_p^*$ 中是困难的,且 $H$ 可理想化为随机预言机,则 ElGamal 签名方案在自适应选择消息攻击下存在性不可伪造。

证明思路:

  • 假设攻击者能在 CMA 下伪造签名,则可通过归约算法求解 DLP
  • 归约过程利用"forking lemma"技术,通过两次查询同一消息的不同随机 $k$ 值来提取离散对数

关键安全缺陷

#### 1. 随机数重用攻击

若签名过程中 $k$ 值被重复使用,攻击者可通过两个签名恢复私钥:

已知:

  • 签名 $(r, s_1)$ 对应消息 $M_1$,使用相同 $k$
  • 签名 $(r, s_2)$ 对应消息 $M_2$,使用相同 $k$($r$ 值相同)
推导: $$s_1 = k^{-1}(e_1 - xr) \bmod q$$ $$s_2 = k^{-1}(e_2 - xr) \bmod q$$

相减得: $$s_1 - s_2 = k^{-1}(e_1 - e_2) \bmod q$$ $$k = (e_1 - e_2)(s_1 - s_2)^{-1} \bmod q$$

一旦获取 $k$,即可计算私钥: $$x = (e_1 - sk)r^{-1} \bmod q$$

历史案例:2010 年 Sony PS3 破解事件即因 HMAC-SHA1 签名中重用随机数导致私钥泄露。

#### 2. 小群攻击(Small Subgroup Attack)

若参数选择不当($q$ 过小或存在小因子),攻击者可利用 Pohlig-Hellman 算法降低 DLP 难度。应确保 $q$ 为大素数,且 $p = 2q + 1$(安全素数)。

#### 3. 确定性变体:DSA 的改进

ElGamal 签名的随机数依赖问题导致 DSA(FIPS 186-1)采用确定性构造:$k$ 由消息哈希和私钥派生,而非随机选取。但这引入了新的安全考虑(如 NIST 推荐的 $k$ 生成机制)。

与国密 SM2 签名的关系

技术演进路径

CODE
ElGamal 签名 (1985)
    ↓ DLP 基础,EUF-CMA 可证明安全
    ↓ RFC 2409 (IKE) 采用
    ↓ DSA (1991) 标准化
        ↓ 椭圆曲线扩展
        ↓ ECDSA (1992)
            ↓ 国密适配
            ↓ SM2 签名 (GM/T 0003.2-2012)

SM2 签名对 ElGamal 的改进

特性ElGamal 签名SM2 签名
数学群$\mathbb{Z}_p^*$椭圆曲线群 $E(\mathbb{F}_p)$
私钥长度与 $p$ 同长256 位($n$ 为曲线阶)
随机数要求必须保密必须保密(RFC 6979 确定性派生)
ZA 预处理无有(身份标识预处理)
签名长度2 × 256 位64 字节(r, s 各 32 字节)
核心公式对比:

ElGamal 签名: $$s = k^{-1}(H(M) - xr) \bmod q$$

SM2 签名: $$s = \frac{(1 + d_A)^{-1}(k - r \cdot d_A) \bmod n}{\bmod n}$$

其中 $d_A$ 为私钥,$(1 + d_A)^{-1}$ 项是 SM2 的独特设计,用于增强安全性。

工程实践要点

参数生成示例(Python)

常见实现陷阱

  • 使用 pow(g, k, p) 而非 pow(g, k, p):需确保 $k < q$,避免溢出
  • 忽略 $r = 1$ 的无效情况:某些实现未检查 $r \neq 1$
  • 哈希函数选择不当:应使用带安全属性的哈希(如 SHA-256),而非 MD5
  • 随机数熵不足:$k$ 必须密码学安全随机,不得使用 random.randint()

性能特征

签名与验证速度

操作时间复杂度典型延迟(3072 位)
密钥生成$O(\log^3 p)$~50ms
签名生成$O(\log^3 p)$~100ms
签名验证$O(\log^3 p)$~150ms
哈希计算$O(n)$~1μs
注:以上数据基于 Intel Xeon Gold 6248R @ 3.0GHz,OpenSSL 3.0。实际性能因实现优化而异。

与国密算法对比

算法密钥长度签名长度签名速度验证速度
ElGamal (3072位)3072 位512 位~100ms~150ms
SM2256 位64 字节~0.5ms~1ms
RSA-30723072 位384 字节~50ms~5ms
SM2 签名因使用 256 位椭圆曲线,性能显著优于同等安全级别的 ElGamal 签名(有限域 3072 位)。

应用场景与局限

适用场景

  • 理论教学:第一个可证明安全的签名方案,适合讲解 EUF-CMA 概念
  • 历史分析:理解 DSA/ECDSA/SM2 的技术渊源
  • 学术研究:签名安全证明方法学(forking lemma、ROM 归约)

不推荐使用场景

  • 生产系统:已被 DSA/ECDSA/EdDSA 等更高效的方案取代
  • 资源受限设备:3072 位参数导致签名冗长(512 位),带宽开销大
  • 高并发场景:有限域运算比椭圆曲线运算慢一个数量级

现代替代方案

场景推荐方案理由
通用签名Ed25519确定性签名,无随机数依赖,速度快
国密合规SM2 签名GM/T 0003.2-2012 标准,密评通过
后量子安全SLH-DSA / Dilithium抵御量子计算机攻击

相关标准与参考

标准引用

  • RFC 2409:Internet Key Exchange (IKE) 协议中采用 ElGamal 签名
  • GM/T 0003.2-2012:SM2 数字签名算法规范(国密标准)
  • FIPS 186-5:Digital Signature Standard(DSA)

理论参考

  • ElGamal, T. (1985). "A Public-Key Cryptosystem and a Signature Scheme Based on the Discrete Logarithm Problem." *IEEE Trans. Info. Theory*, 31(4): 469-472.
  • Shoup, V. (2000). "On Formal Models for Secure Signature Schemes." *Crypto '91*.
  • RFC 6979: Deterministic Usage of the Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA).

相关实践链接


延伸阅读: