从群到 ElGamal 加密算法
原文由零音在 MoeCTF 2025 时完成。CrystaRin镜雨亭 迁移时,GPT-6.1-Sol 负责了对本文的审阅和部分修改。
ElGamal 加密的核心思路,是让发送方和接收方算出同一个秘密,再用它掩蔽消息。为什么接收方能撤销这层掩蔽?这与群中的 逆元 有关。至于旁观者为什么难以破解,则是另一个关于计算难度的问题。
我们先从群和模逆元出发,理解算法为什么能正确解密,再讨论它需要什么安全前提。
群
群的定义和性质
一个群是一个有序对 , 其中 是一个非空集合, 是定义在 上的二元运算。我们要求该运算须满足以下四条公理:
- 封闭性(Closure):对于任意 ,都有 。一般地,当我们说 是定义在 上的二元运算时,封闭性通常已经隐含。
- 结合律(Associativity):对于任意的 ,都有 。
- 单位元(Identity element):存在某个元素 ,使得对于任意 ,都有 。
- 逆元(Inverse element):对于任意 ,存在某个元素 使得 。
群不能只看作一个集合或一个运算,它必须是两者的结合,同时满足上面的公理。如果一个群满足交换律(即 对于任意 成立),则我们称该群为 阿贝尔群(Abelian group)。
群可以分为有限群和无限群。有限群的集合 中元素个数有限,记作 ,称为群的阶,即群的集合内元素的数量:例如 ,即模 的整数加法群,其阶为 。无限群的集合元素个数无限:例如 ,即整数加法群。
对于一个群 ,其中 是群的二元运算,如果 是 的一个非空子集,并且 在运算 下也构成一个群,则称 为 的一个 子群,记作 。
我们判定一个群 的非空子集 是子群,当且仅当同时满足以下三个条件:
- 封闭性:对于任意 ,有 。
- 单位元: 的单位元 也属于 。
- 逆元:对于任意 ,有 的逆元 。
设 是一个群, 是 的一个非空子集。所有包含 的 的子群中最小的那个记作 ,它由所有形如 的元素构成,其中 ,, 为任意非负整数; 时的空乘积约定为单位元。如果 ,我们就称 是群 的一个生成集。如果一个元素 就能生成整个群,即 ,则称 为循环群, 为这个群的一个生成元。一般生成集中的元素不一定能单独生成整个群。
ElGamal 可以定义在循环群上。本文从模素数乘法群 入手:它的元素严格说是模 的非零剩余类,我们用 作为代表。群运算是模 的乘法,即将两个代表数相乘后取模 。我们将在下文证明它满足群的四条公理;算法部分则会选用它的一个合适的子群。
一个经典结论是:对于任意素数 ,群 都是循环群。本文引用这一结论,不展开证明。这意味着,存在一个原根,也就是整个群的生成元 ,使得
恰好覆盖 集合中的所有元素。
模 p 乘法群的运算满足四条公理
以下固定素数 ,记 ,并继续用 表示其中的元素。
封闭性
群的封闭性要求一个集合中的两个数经过运算后,其结果一定还在这个集合里。
对于任意 ,都有 且 。根据素数的性质,若 ,就必有 或 ,因此这里 。所以 不为 ,仍在 中,即
结合律
形式上,一个在集合 上的二元运算 满足结合律,是指
模乘法继承了整数的结合律 ,而模运算和乘法操作是良好兼容的,也就是说,在乘法运算中无论何时取模,最终的计算结果都是一致的。即,我们有
下面给出一个证明:我们设
其中 。
注意到
因此 ,从而
注意, 和 虽然都小于 ,它们的乘积却未必小于 ,所以不能省略最后一次取模。由此结合整数乘法的结合律,可得
这就证明了模 乘法的结合律。
单位元
因为 ,且对任意 都有
所以 就是单位元。
逆元
类比通常的乘法中 ,模乘法中的逆元也用来撤销一次乘法。区别在于,模 的逆元不是通常意义下的分数,而是群中的另一个元素。
我们要证明:对于任意 ,存在 ,使得 。这里可以使用 裴蜀定理(Bézout’s lemma):
设 为不全为 的整数。对于任意 ,都有 ;而且,存在整数 ,使得 。完整证明见文末附录。
由于 是素数,任意 都满足 ,因此存在整数 ,使得
对上式两侧取模 ,可得
令 ,则 。这里 不可能为 ,否则 将与 同余,因此 。模乘法满足交换律,所以也有 ,即 是 的逆元。
例如,,因此 ,所以 在模 下的逆元是 。上面的存在性证明,也能通过附录中的扩展欧几里得算法转化为求逆元的方法。
ElGamal 算法浅析
从共享秘密到消息掩蔽
设 Bob 的私钥为 ,公钥中的一个元素为 。Alice 加密时另外选取随机数 ,并发送 。于是,两人可以分别算出
这里先用群中的幂运算表示;在下文选取的模乘法群中,所有结果都要取模 。
两人算出的同一个群元素记为 。Alice 用乘法把它与消息结合,得到 ;Bob 则乘上 ,撤销这层掩蔽。这说明了逆元为什么能保证解密的正确性。但旁观者从 中能否得到 ,以及密文是否泄露消息的信息,需要另行讨论。
选取群与参数
为了把算法和后面的安全讨论统一起来,我们选用模素数乘法群中的一个素数阶子群:
其中 都是素数, 足够大, 的阶恰好为 ,即 且 。此处的 只需要生成子群 ,不再要求它是整个 的原根。
具体参数不能仅凭「 都很大」就认定安全,还需要所选群中的相关计算问题足够困难。本文先在这样的群中说明算法,再解释安全假设。
消息必须是一个群元素 ,而不是任意整数、文本或文件。如何把一般消息编码到群中并无歧义地恢复,是另外需要处理的问题,不能简单地把任意数据取模 。实际应用通常采用经过安全分析的混合加密方案。
密钥生成
Bob 使用合适的公开群参数 ,然后生成密钥:
- 使用密码学安全的随机数生成器,均匀选取私钥 ;
- 计算 。
Bob 公开公钥 ,并将私钥 保密。群参数可以由协议统一规定,不必由每个接收方重新生成。
加密
Alice 要向 Bob 发送消息 :
- 获取 Bob 的公钥 ,并通过可信方式确认它确实属于 Bob;
- 使用密码学安全的随机数生成器,独立、均匀地选取临时随机指数 ;
- 计算第一部分密文 ;
- 计算共享秘密 ,以及第二部分密文 ;
- 将密文 发送给 Bob。
每次加密都要重新采样 ,不能复用以前的值。独立随机采样理论上仍可能碰撞,因此随机空间也必须足够大。 通常不随密文发送,密文中公开的是 。
解密与正确性
对于按上述方式生成的合法密文,Bob 使用私钥 解密:
- 计算共享秘密 ;
- 计算 的模 逆元 ,使得 ;
- 恢复消息 。
为什么双方能得到同一个 ?因为
而 ,所以逆元一定存在。于是
由于我们用 中的数代表群元素, 就恰好等于原消息 。
一个小例子
为了便于手算,取 。因为 ,,而 是素数,所以 的阶为 。
Bob 选取私钥 ,得到 。Alice 要发送 ,它确实属于 ,因为 。选取 后,
Bob 收到 后,算出 。由于 ,所以 ,最终恢复
能正确解密,不等于已经安全
安全性依赖什么
如果旁观者能从 和 求出 ,也就是解决 离散对数问题,就能得到 Bob 的私钥。但「离散对数难求」还不足以直接推出完整的消息保密结论。
这里需要区分两个相关问题:
- 计算 Diffie–Hellman 问题(CDH):给定 ,计算 。这与旁观者能否直接算出共享秘密有关。
- 判定 Diffie–Hellman 问题(DDH):给定 和一个候选元素 ,判断 是 ,还是独立均匀选取的群元素。
在合适的群中,若 DDH 假设成立,即对适当随机选取的指数,上述两种情况在计算上难以区分,基础 ElGamal 可以达到 选择明文攻击下的语义安全(IND-CPA)。直观地说,即使攻击者能选择两条候选消息,也难以从挑战密文判断加密的是哪一条。这里不展开形式化安全实验与证明。
这也是不能随便选群的原因。对于奇素数 ,整个 上的 DDH 可以利用二次剩余性质来区分。一个非零元素如果能写成某个非零元素的平方,就叫作 二次剩余;这一性质可以高效判定。若 是整个群的原根,则 是二次剩余,当且仅当 为偶数。于是,公开的 和 会暴露 的奇偶性,进而暴露掩码 的二次剩余性质,再结合 ,就能判断 是否为二次剩余。
因此,直接在整个 中掩蔽任意非零消息,虽然可以正确解密,却会泄露消息的一项性质,不能满足上述安全要求。选用合适的素数阶子群可以避开这里的二次剩余区分,但 素数阶本身并不自动保证 DDH 困难,仍需使用经过分析的群和参数。
为什么不能复用加密随机数
若同一公钥下两次加密使用了相同的 ,就会使用相同的掩码 。设两条消息分别为 ,则
所以
这会暴露两条明文之间的关系。一旦其中一条明文 已知,就可以直接恢复另一条:
基础 ElGamal 不提供什么
基础 ElGamal 本身不提供消息完整性或发送者身份认证,也不具备选择密文安全性。例如,攻击者可以选取 ,把密文 改为
接收方解密得到的就会是 。这种可以有规律地改变明文的性质,称为 可塑性。而且公钥是公开的,任何人都可以向 Bob 加密,解密成功并不能证明消息来自 Alice。
实际实现还必须处理公钥和密文的群成员检查、参数验证、侧信道等问题。对于任意文本或文件,通常使用经过安全分析的混合加密方案,将公钥机制与密钥派生、认证加密等组件正确组合,而不是直接套用这里的乘法公式,也不能假定随意增加一个组件就能补齐安全性。
总结起来:群和逆元解释了 ElGamal 为什么能正确解密;计算困难性假设、随机数和协议设计,才决定它能提供怎样的安全保障。
附录:裴蜀定理的证明
欧几里得算法 / 辗转相除法
先设 为正整数,不妨设 。对 除以 ,写成
我们要证明
设 为正整数。若 且 ,则 ,即 。反过来,若 且 ,则 ,即 。因此, 和 拥有完全相同的正公约数,最大公约数自然相同。
反复应用这个等式,就得到欧几里得算法。非零余数构成严格递减的正整数序列,所以算法必然在有限步后结束,最后一个非零余数就是最大公约数。如果一开始 ,则第一步余数为 ,直接得到 。
裴蜀定理的正式证明
设 为不全为 的整数,记 。因为 ,其中 为整数,所以对任意整数 ,都有
因此 。下面证明存在整数 ,使得 。
如果 ,则 且 。当 时取 ;当 时取 。 的情形类似。
如果 都非零,可以先对 证明:因为 ,对绝对值得到的系数可以通过调整符号转化为原整数对应的系数。因此以下只需考虑 都为正数的情况,交换两者后不妨设 。
若 ,直接取 即可。否则,令 ,将欧几里得算法统一写为
记最后一个非零余数为 ,下一步余数为 。根据前面证明的最大公约数不变性,
现在要说明,每一个余数都能表示成 的整数线性组合。先为初始两项选取系数:
假设前两项已写成 和 ,则
因此可以递推定义整数系数
从上述初值出发,归纳可得每个 都满足 ,特别地,
取 就得到了所需的整数解,裴蜀定理得证。沿着欧几里得算法同时递推这些系数,就是 扩展欧几里得算法。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!



