1. 背景介绍
本篇主要关注常见的Diffie-Hellman的底层数学原理,从事隐私计算行业的同学,肯定会发现DH的身影无处不在,被广泛使用,比如基于ECDH的PSI安全求交算法【1】,因其实现简单,原理易于讲解,成为了PSI领域的LR算法般存在(形同程序员熟悉的hello word示例)。另外,还有基于DH实现隐私求并的方案【2,3】。接下来,我们以DHKE来描述DH原理以及底层数学分析。
2. Diffie-Hellman 密钥交换(DHKE)
Diffie-Hellman 密钥交换协议(Diffie-Hellman Key Exchange),简称 DHKE,是离散对数问题的一个典型应用。使用这个协议,通信双方可以在完全没有对方任何预先信息的条件下,通过不安全信道创建起一个密钥。这个密钥只有通信双方知道,其他人无法获得,可以在后续的通信中作为对称密钥来加密通信内容。
2.1 DHKE 的基本流程
选择参数:
通信双方(Alice 和 Bob)首先在不安全信道中交换对群 选取的公有参数 p 和 g,其中 p 是大素数,g 是模 p 的原根,是某个子群的生成元, 该概念在前述文章有介绍,g 的不同幂次模 p 的结果可以生成群中的所有元素。该步骤可以公开进行,无需保密。
各自生成私钥和公钥:
Alice 随机选择私钥 a,计算公钥 ,并将公钥 A 发送给 Bob。
Bob 随机选择私钥 b,计算公钥 ,并将公钥 B 发送给 Alice。
Alice 和 Bob 分别选择的私钥 a 和 b 是这个群中的元素,即它们取值在 1 到 p-1 之间。公钥 A 和 B 是生成元 g 的幂次模 p 的结果。
生成共享密钥:
Alice 收到 B 后,计算共享密钥 。
Bob 收到 A后,计算共享密钥 。
最终,Alice 和 Bob 都计算出相同的共享密钥 S,用于后续加密通信。
图来自wikipedia【4】
2.2 安全性分析
离散对数难题:
攻击者若要破解密钥 S,必须求解 的离散对数问题,这在当前计算能力下非常困难。特别是当 p 和 g 的选择合适时(例如 p 为1024比特或更大),破解这种离散对数问题会非常耗时,因此保证了 DHKE 的安全性。
目前已破解的最大离散对数记录是在一个795比特大小的素数 p 下完成的【5,6】。以 Intel Xeon Gold 6130 CPU 为例,需要 3100 个核心年(core-year)的计算量。这意味着使用2048比特的参数 p 目前仍然足够安全。
DHKE 的安全性依赖于大素数 p 和原根 g 的选择。虽然密钥交换过程中公有参数 p 和 g 是公开的,但私钥 a 和 b 是私密的,只有各自的持有者知道。即使攻击者拦截到公钥 A 和 B,在没有私钥的情况下无法计算出共享密钥 S,因此协议具备较高的安全性。
3. 离散对数问题及快速幂模运算
3.1 离散对数问题
定义:
在给定群 G 中,若存在 (其中 g 是群的生成元,x 是整数),那么求解 x 的问题就是离散对数问题,记为 或 。也就是找到一个指数 x,使得 g 的 x次幂等于 h。这与实数域中的对数类似,但在群结构中实现。
群的选择:
离散对数问题定义在群 G 上,并且当群的生成元 g 存在时,才有意义。通常在 Diffie-Hellman 密钥交换中使用的是模 p 的乘法群。密钥学中常用的群是基于质数阶 p 的乘法群 或者其子群。这种群结构保证了在没有私钥的情况下,无法在合理时间内计算出 \log_g h,即计算离散对数的逆问题难度很高。
3.2 快速幂模运算
从DH的计算流程,可以看到主要涉及形如的计算,针对这种计算,可以引入快速幂模运算(Exponentiation by Squaring),其是一种用于计算形如 的高效算法。它在时间复杂度上比直接计算幂次然后取模的方式要低很多。
3.2.1 基本思想
快速幂模运算的核心思想是将指数的幂次按二进制分解,通过不断平方和减少乘法运算的次数来实现快速计算。
例如,要计算 ,可以按以下步骤进行:
- 如果 b 是偶数,那么 。此时,可以将问题转化为计算 并平方后取模。
- 如果 b 是奇数,那么 。此时,可以将问题转化为计算 ,再乘上 a 后取模。
这种分解方式可以在 的时间内计算出结果,比直接计算幂次的 O(b) 要高效得多。
3.2.2 算法步骤
以下是快速幂模运算的具体实现步骤:
初始化:
- 设定结果
result = 1
,表示当前的幂次结果。- 将基数
a
设为a % m
,将指数b
和模数m
保持不变。循环操作:
当 b > 0 时,重复以下步骤:
- 将
b
更新为 b = b // 2,即将指数减半。- 将
a
更新为 ,即计算下一次的平方。- 如果 b 是奇数,将
result
更新为result = (result * a) % m
。结束条件:
当 b = 0 时,循环结束,此时
result
就是 的结果。
3.2.3 代码示例
python
import time
def mod_exp(a, b, m):
result = 1 # 初始化结果
a = a % m # 取模操作,简化 a 的大小
while b > 0:
# 如果 b 是奇数,将 result 更新为 (result * a) % m
if b % 2 == 1:
result = (result * a) % m
# 更新 a 为 a^2 % m
a = (a * a) % m
# 将 b 减半
b = b // 2
return result
#测试示例:计算 3^130000 mod 7
# 普通方法
s_t = time.time()
a = 3**130000 % 7
print(a)
print(time.time() - s_t) # time cost: 0.006815910339355469
# 快速幂模运算
s_t = time.time()
print(mod_exp(3, 130000, 7))
print(time.time() - s_t) # 7.867813110351562e-06
4 群论基础以及整数模 n 乘法群
【6,7】讨论了群论相关的基础知识,这里做一些笔记,帮助自己更好的理解。
4.1 群的定义
群(Group):群是一个集合和一个满足四条群公理的二元运算组成的代数结构。它必须满足以下四个基本公理:
封闭性(Closure):
对于群 G 中任意的两个元素 a 和 b,其运算结果 也必须属于群 G。这意味着在群内进行运算时不会跳出该集合。
结合律(Associativity):
对于任意 ,满足 。结合律保证了运算的结果不依赖于运算的顺序。
单位元(Identity Element):
存在一个特殊的元素 ,使得对于任意 ,有 。这个元素 e 被称为群的单位元或恒等元。
逆元(Inverse Element):
对于每个元素 ,存在一个元素 ,使得 ,其中 e 是单位元。这个元素 b 称为 a 的逆元,记作 。
4.2 群的阶(Order of a Group and an Element)
群的阶(Order of a Group):
一个群 G 的阶(order)表示群中元素的总数,记作 |G| 或 ord(G)。群的阶可以是有限的(有限群)或者无限的(无限群)。
元素的阶(Order of an Element):
群中一个元素 a 的阶是指满足 的最小正整数 m,其中 e 为单位元。若不存在这样的 m,则称 a 的阶为无限大。
4.3 子群(Subgroup)
子群的定义:
一个群 H 是群 G 的子群,如果 H 是 G 的一个子集,并且 H 本身也是一个群。即 H 必须满足封闭性、结合律、单位元和逆元存在的四条群公理。
子群的记号为,表示 H 是 G 的子群。
子群检验准则(Subgroup Test):
若要验证一个非空集合 H 是否为群 G 的子群,只需满足以下三条:
对于任意 ,则 (封闭性)。
对于任意 ,则 (逆元存在)。
H 包含 G 的单位元 e。
4.4 求幂(Exponentiation in Groups)
在群 G 中,求幂表示对某个元素 a 进行 n 次二元运算,即 (共 n 个 a)。注意在不同的群中,幂的定义和性质可能有所不同。
当 n 为负数时, 表示 a 的逆元 的 n 次幂。
在乘法群中,幂次指代通常的乘法运算,例如 。
在加法群中(如整数群),幂次对应重复的加法运算,例如 。
4.5 阿贝尔群(Abelian Group)
定义:
一个群 G 被称为阿贝尔群,如果它的群运算满足交换律,即对于任意 ,有 。
特性:
阿贝尔群的所有元素之间的运算都是可交换的。经典例子包括整数加法群、实数加法群 等。
4.6. 循环群(Cyclic Group)
定义:
循环群是由一个元素 g的幂生成的群。若 G 的每个元素都可以表示为 g 的某个幂次 ,则称 G 是由 g 生成的循环群,记作 。
生成元:
g 称为循环群 G 的生成元。若 G 是一个有限群,则它的阶等于生成元 g 的阶。若 G 是无限群,则 g 的阶也为无限。
结构:
循环群可以是有限的,如 表示的整数模 n 加法群,也可以是无限的,如 。
例子:
模 n 的加法群,它是一个有限的循环群,生成元为 1。
4.7 整数模 n 乘法群
4.7.1 整数模 n 乘法群的定义
模 n 的整数乘法群(Multiplicative group of integers modulo nnn)由模 n 的所有与 n互质的整数构成。在这个乘法群中,元素是模 n 的不同同余类,例如整数 a的同余类表示为 。
符号表示 :整数模 n 乘法群通常记作 或,表示所有与 n 互质的模 n 的同余类的集合。
4.7.2 整数模 n 乘法群的元素
一个整数 a 在模 n 中的同余类可以表示为 。如果 ,则 a 和 n 是互质的,a 的模 n 同余类形成一个单位元在模 n 中的乘法群元素。例如,当 n = 8 时,模 8 的乘法群元素 为,即所有与 8 互质的正整数同余类。
4.7.3 模 n 乘法群的证明
模 n 乘法群是一个群的证明,具体包含以下四条公理:
封闭性:
对于任意 ,它们的乘积 仍然是模 n 乘法群的元素。这是因为 且 ,根据数论性质,。
结合性:
整数模 n下的乘法运算满足结合律,因此模 n 的乘法群也自然满足结合律。
存在单位元:
单位元在群中总是存在的,单位元即同余类 ,它在所有元素 a 中满足 。
存在逆元:
每个元素 都存在一个逆元素 ,满足 。由于 ,根据数论中的Bézout's identity,可以找到整数 x 和 k,使得:, 意味着存在整数 x,使得 ,因此 x 就是 a 的模 n 逆元,即 。
5. 参考材料
【1】The semi-honest DH-PSI protocol
【2】Private Matching for Compute
【3】Vertical Federated Learning without RevealingIntersection Membership
【4】Diffie--Hellman key exchange
【5】RSA, integer factorization, Diffie--Hellman, discrete logarithm computatio
【6】Group Theory