8 - 基于离散对数问题的公钥加密系统
基于离散对数问题的公钥运算
原书:《Understanding Cryptography: A Text book for Students and Practitioners》
前面介绍的 RSA 算法,我们利用了大整数的因数分解极其困难这一特性,以此构建了单向函数。大部分非 RSA 公钥加密算法,是基于另一类单向函数,离散对数问题。
8.1 Diffie-Hellman 密钥交换
Diffie-Hellman 密钥交换 DHKE: Diffie-Hellman key exchange
,由 Whitfield Diffie 与 Martin Hellman 于 1976 年提出,是第一个在公开刊物上发布的非对称策略。两位发明者受到 Ralph Merkle 工作的影响。它提供了实际情况下的密钥分发策略,可以为沟通双方在非安全通道中建立共有密钥。DHKE 是离散对数问题的典型应用。这个基本的密钥建立技术,应用在很多开源的商务加密协议比如 SSH: Secure Shell
、TLS: Transport Layer Security
以及 IPSec: Internet Protocol Security
中。在 DHKE 背后是 Z∗p 的指数(p 是质数)是一个单向函数。指数是可交换的。
k≡(ax)y≡(ay)x mod p 是一个联合密钥,可以做为通讯双方的会话密钥。
让我们先看一下 Diffie-Hellman 密钥交换协议是如何通过 Z∗p 工作的。在这个协议中,通讯双方,A 与 B 希望建立一个共享密钥。我们可以通过一个置信第三方,通过它来选择密钥交换需要的公共参数,当然也可以由 A 与 B 生成公共参数。严格来说,DHKE 由两个协议组成,配置协议以及主协议,主协议进行真正的密钥交换。配置协议由下面步骤组成:
Diffie-Hellman 配置
- 选择一个大质数 p
- 选择一个整数 α∈{2,3,...,p−2}
- 发布 p 与 α
这两个值有时称作域参数。如果 A 与 B 都知道配置步骤中的公共参数 p 以及 α,那么他们可以使用下面的密钥交换协议生成一个联合密钥 k:
Diffie-Hellman 密钥交换
A 选择 a=kpr,A∈{2,...,p−2},计算 A=kpub,A≡αa mod p
B 选择 b=kpr,B∈{2,...,p−2},计算 B=kpub,B≡αb mod p
A 将 kpub,A=A 发送给 B,B 将 kpub,B=B 发送给 A
A 计算得到 kAB=kkpr,Apub,B≡Ba modp,B 计算得到 kAB=kkpr,Bpub,A≡Ab mod p
下面证明 A 与 B 通过上面的协议计算得到的密钥是相同的会话密钥。
证明
A 计算得到
B 计算得到
这样 A 与 B 都得到了共享会话密钥 kAB≡αab mod p。这个密钥可以用在 A 与 B 之间进行安全通讯了,使用 KAB 做为对称算法如 AES 或 DES 的密钥了。
我们现在看一个小的数值做为例子。
例 8.1 Diffie-Hellman 域参数为 p=29,α=2,协议处理如下:
A 选择 a=kpr,A=5,A=kpub,A=25≡3 mod 29
B 选择 b=kpr,B=12,B=kpub,B=212≡7 mod 29
A 将 A = 3 交给 B,B 将 B = 7 交给 A
A 计算 KAB=Ba≡75≡16 mod 29,B 计算 KAB=Ab=312≡16 mod 29
在实际应用中,为了提供比较强的安全性能,DHKE 的 p 长度与 RSA 中的模数 n 长度相似,都是 1024 位以上。整数 α 需要具有特殊属性:它需要是一个原始元素 primitive element。协议中计算的会话密钥 kAB 位长与 p 相同。如果我们希望使用它做为如 AES 算法的对称密钥,我们可以简单取最高 128 位,也可以使用对 kAB 做哈希利用哈希输出做为对称密钥。
在真实的协议中,我们会首先生成私钥 a 与 b,出于安全性考虑,它们应该来自于真随机数生成器。计算公钥 A 与 B 以及会话密钥,可以使用重复平方乘算法。
8.2 一些代数
下面我们介绍一些基础的抽象代数问题,诸如群、子群、有限群与循环群。
8.2.1 群
让我们回顾群的定义。
定义 8.2.1 群
群是一个元素 G 的集合,并伴有将 G 中两个元素组合的操作 ∘,群具有下面的特性:
- 群操作 ∘ 是闭合的,既对所有的 a,b∈G,满足 a∘b=c∈G
- 群操作 ∘ 满足结合律,既 a∘(b∘c)=(a∘b)∘c;a,b,c∈G
- 具有元素 e∈G,称为零元素,满足 a∘e=e∘a=a,a∈G
- 对于 a∈G 存在 a−1∈G 称作 a 的逆,满足 a∘a−1=a−1∘a=1
- 如果 a∘b=b∘a;a,b∈G,那么这个群是阿贝尔群
注意到,在加密运算应用中,我们会同时使用乘法群与加法群,在乘法群中操作数 ∘ 表示为乘法,而在加法群中操作数 ∘ 表示为加法。
例 8.2 为了阐述群定义,我们考虑下面的例子
-
(Z,+) 是一个群,既整数集 Z={...,−2,−1,0,1,2,...} 并使用加法做为操作,组成一个阿贝尔群,其中零元素 e=0,−a 是 a∈Z 的逆
-
(Z,⋅),0∉Z 不是一个群,既排除元素 0 的整数集不构成群,因为除了 −1,1,不存在 a∈Z 的逆存在使 a⋅a−1=1
-
(C,⋅) 是一个群,既复数 u+iv;u,v∈R 使用乘法操作,有 i2=−1,并伴随有下面的复数乘法操作:
(u1+iv1)⋅(u2+iv2)=(u1u2−v1v2)+i(u1v2+v1u2)形成一个阿贝尔群,群的零元素 e=1,元素 a=u+iv∈C 逆为 a−1=(u−i)/(u2+v2)
不过,上面提到的几个群,并不在密码学中使用,因为我们需要一个具有有限元素的群。
定理 8.2.1
集合 Z∗n 由满足 gcd(i,n)=1 的整数 i=0,1,...,n−1 组成,在整数乘模 n 操作下组成阿贝尔群,零元素是 e=1
例 8.3 如果我们选择 n=9,Z∗n 由元素 {1,2,4,5,7,8} 组成,下表展示了这个集合的乘法模 9 的表:
× mod 9 | 1 | 2 | 4 | 5 | 7 | 8 |
---|---|---|---|---|---|---|
1 | 1 | 2 | 4 | 5 | 7 | 8 |
2 | 2 | 4 | 8 | 1 | 4 | 7 |
4 | 4 | 8 | 7 | 2 | 1 | 5 |
5 | 5 | 1 | 2 | 7 | 8 | 4 |
7 | 7 | 5 | 1 | 8 | 4 | 2 |
8 | 8 | 7 | 5 | 4 | 2 | 1 |
通过将 Z∗9 的全部元素计算出来,我们可以轻松得出它是阿贝尔群。
8.2.2 循环群
在密码学中,我们总是考虑有限结构,比如在 AES 中我们需要使用有限域。我们现在提供一个有限群的直接定义:
定义 8.2.2 有限群
如果一个群具有有限元素数,这个群 (G,∘) 是有限群。我们将这个群 G 的基数或阶表示为 |G|
例 8.4 有限群例:
- (Zn,+):Zn 的基数是 |Zn|=n 因为 Zn={0,1,2,...,n−1}
- (Z∗n,⋅):Z∗n 定义为小于 n 的正整数集,集合中的元素与 n 互质,因此 Z∗n 的基数等于 n 的欧拉 Phi 函数,|Z∗n|=Φ(n),比如,群 Z∗9 的基数为 32−31=6,群的元素是 {1,2,4,5,7,8}
定义 8.2.3 元素的阶
一个群 (G,∘) 的元素 a 的阶 ord(a),是最小的正整数 k ,满足:
其中 1 为群 G 的零元素。
例 8.5 在群 Z∗11 中,我们可以尝试元素 a=3 的阶,我们可以穷举直到得到零元素 1
可以得到元素 a=3 的阶是 ord(3)=5。
我们让这个乘法继续下去:
定义 8.2.4 循环群
群 G 包含一个元素 α,它具有阶 ord(α)=|G|,那么我们说它是循环的,具有这个最大阶的元素,称作原始元素或生成元素。
例 8.6 我们检验一下 a=2 是否是 Z∗11={1,2,3,4,5,6,7,8,9,10} 的原始元素,注意到群 |Z∗11|=10
可知 a=2 元素是 Z∗11 的原始元素,且这个群是循环群。从上面的穷举中,我们也可以看到,它生成了群中的所有元素,而且这个生成的顺序看起来是任意的,这也是 Diffie-Hellman 密钥交换的基础。
循环群具有有趣的特性。
在密码学应用中,十分重要的一个特性是:
定理 8.2.2 对于每一个质数 p,(Z∗p,⋅) 是阿贝尔有限循环群
定理 8.2.3 G 是一个有限群,那么对于每一个 a∈G 必然满足:
- a|G|=1
- ord(a) 能够整除 |G|
例 8.7 我们考虑群 Z∗11 它的阶是 10,这个群中的元素的阶分别是 1,2,5,10,因为只有这些整数能够整除 10,我们可以验证这一特性
定理 8.2.4 令 G 是有限循环群,那么它必满足:
- G 的原始元素的数量是 Φ(|G|)
- 若 |G| 是质数,那么所有 a≠1∈G 元素都是原始元素
8.2.3 子群
定理 8.2.5 循环子群定理
令 (G,∘) 做为一个循环群,那么每一个元素 a∈G,具有 ord(a)=s 是具有 s 个元素的循环子群的原始元素
例 8.8 考虑 G=Z∗11 的子群,在前面,我们看到 ord(3)=5,元素 3 能够生成子集 H={1,3,4,5,9},通过穷举其运算:
× mod 11 | 1 | 3 | 4 | 5 | 9 |
---|---|---|---|---|---|
1 | 1 | 3 | 4 | 5 | 9 |
3 | 3 | 9 | 1 | 4 | 5 |
4 | 5 | 1 | 5 | 9 | 3 |
5 | 5 | 4 | 9 | 3 | 1 |
9 | 9 | 5 | 3 | 1 | 4 |
从上面穷举计算可见,H 在乘模 11 运算上是闭合的,满足结合律,具有零元素 1,每个元素都有对应的逆元素,因此 H 是 Z∗11 的子群。
更精群地说,它是质数阶 5 的子群。不仅 3 是 H 的原始元素,4、5、9 也是。
一个重要的特例是,子群的阶是质数阶。从定理 8.2.4 可知,如果这个子群的阶表示为 q,所有不是零元素的元素具有阶 q。
从循环子群定理,我们知道每一个元素 a∈G 产生一些子群 H,由定理 8.2.3 有下面定理存在:
定理 8.2.6 拉格朗日定理
H 为 G 的子群,那么 |H| 整除 |G|
例 8.9 循环群 Z∗11 的阶为 |Z∗11|=10=1⋅2⋅5,因此它的子群的阶有 1、2、5、10,因为它们能够整除 10,所有 Z∗11 子群 H 以及它们的原始元素 α 如下:
子群 | 元素 | 原始元素 |
---|---|---|
H1 | α=1 | |
H2 | α=10 | |
H3 | α=3,4,5,9 |
下面是本节的最后一个定理,全面阐述有限循环群的子群特性。
定理 8.2.7
G 是一个有限循环群,阶是 n,α 是 G 的原始元素,那么对于每一个能够整除 n 的整数 k,存在一个 G 的阶为 k 的循环子群。这个子群由 αn/k 生成,H 由满足 a∈G,ak=1 的元素组成,没有其他子群
这个定理给了我们一个从一个循环群构建直接构建子群的方法。我们唯一需要知道的就是群的阶 n,以及一个原始元素,知道这些,我们就可以计算 αn/k 并获得具有 k 个元素的子群。
例 8.10 考虑循环群 Z∗11,在之前的例子中,我们知道 α=8 是群的一个原始元素,如果我们希望有一个阶为 2 的原始元素 β,可以计算
我们现在可以验证元素 10 实际上生成具有两个元素的子群 β1=10,β2=100≡1 mod 11,β3≡10 mod 11。
8.3 离散对数问题
在 DHKE
算法下的单向函数,是离散对数问题 DLP: discrete logarithm problem
,这一问题可以直接使用循环群解释。
8.3.1 质数域的离散对数问题
我们以 Z∗p 开始讨论 DLP
问题,其中 p 为质数。
定义 8.3.1
给到有限群 Z∗p 的阶为 p−1,有原始元素 α∈Z∗p 以及另一个元素 β∈Z∗p,那么 DLP 问题是,是否能够确定整数 1≤x≤p−1 有:
从 8.2.2 小节中,可以知道这样的整数 x 必然存在,因为 α 是一个原始元素,且每一个群元素可以表示为任何原始元素的指数。这个整数 x 称作 β 对基底 α 的离散对数,我们可以正式写成:
如果参数足够大,那么计算理算对数模质数是十分困难的工作。由于指数 αx≡β mod p 计算是十分简单的,这形成了一个单向函数。
例 8.11 我们考虑 Z∗47 中的离散对数,其中 α=5 是其中的原始元素,对于 β=41,离散对数问题是:找到正整数 x 有:
就算是小的数值,确定 x 也不是直观的。使用暴力攻击,系统尝试所有可能的 x 值,我们得到解 x=15。
实际上,一般期望在 DLP 问题中使用质数阶,以防止 Pohlig-Hellman 攻击。因为群 Z∗p 具有阶 p−1,显然不是质数,我们通常使用 Z∗p 带有质数阶的子群,而不是 Z∗p 自身,下面用一个例子阐述。
例 8.12 我们考虑群 Z∗47,它的阶为 46,Z∗47 的子群的阶有 23、2、1,α=2 是具有 23 个元素的子群中的一个元素,因为 23 是一个质数, α 是子群中的一个质数元素,一个可能的离散对数问题是:给到 β=36 (子群中的一个元素),找到正整数 x,1≤x≤23,有:
使用暴力破解,我们得到解为 x=17。
8.3.2 广义离散对数问题
DLP 特性并不限制在 p 为质数的乘法群 Z∗p,它可以在任何循环群中定义,这称作广义离散对数问题 GDLP: generalized discrete logarithm problem
描述如下:
定义 8.3.2 广义离散对数问题
给定一个有限循环群 G 群操作为 ∘ 阶为 n,我们考虑一个质数元素 α∈G,以及另一个元素 β∈G,离散对数问题是:找到整数 x,1≤x≤n,有:
在 Z∗p 的 DLP 问题中,这样的整数必然存在,因为 α 是一个原始元素,因此群 G 的每一个元素都可以由 α 的产物生成。
需要注意的是,在一些循环群中 DLP 问题并不复杂,这样的群不能用在公钥算法中,因为这样的 DLP 不再是单向函数,考虑下面的问题:
例 8.13 这次我们选择整数对质数模的加法群做为用例,我们选择质数 p=11,G=(Z11,+) 是一个有限循环群,具有原始元素 α=2,下面是 α 如何生成群的:
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
iα | 2 | 4 | 6 | 8 | 10 | 1 | 3 | 5 | 7 | 9 | 0 |
我们尝试对 β=3 解 DLP 问题,我们必须计算整数 1≤x≤11 有:
下面是对 DLP 的攻击,即便群操作是加法,我们也可以使用乘法表示 α 与 β 以及离散对数 x 之间的关系:
为求解 x,可以简单对 α 求逆:
使用扩展欧几里得算法,我们可以计算 2−1≡6 mod 11,从而有:
查看上面列出的表格,可以确定我们的计算是正确的。
我们可以一般化上面的技巧,以处理任意的群 (Zn,+),因此,我们可以得出广义 DLP 问题在 Zn 的情况下是易于计算的。
现在我们列出在密码学中已经提出的离散对数问题:
- 质数阶乘法群 Zp 或它的一个子群。经典 DHKE、Elgamal 加密或数字签名算法
DSA: Digital Signature Algorithm
使用这个群,这是最经典且是最广泛使用的离散对数系统 - 由椭圆曲线形成的循环群,椭圆曲线加密系统会在第九章介绍,它们在最近十年十分流行
- 伽罗瓦域 GF(2m) 乘法群或它的子群,这些群完全可以用来模拟质数域的乘法群,DHKE 策略可以基于这些群,实际中它们并不流行,因为对它们的攻击更加强劲,因此这样的群中的 D·LP 需要更长的比特位长,来提供与其他群一样的安全等级
- 超椭圆曲线或代数变量,可以视为广义的椭圆曲线,实际中一般不用,不过某些超椭圆曲线具有一些优点比如操作数比较短
8.3.3 对离散对数的攻击
本小节介绍求解离散对数问题的方法。只对构造使用 DL 策略的读者,可以跳过这一部分。
我们已经看到,离散对数的非对称算法安全性基于在循环群中计算 DLP 问题,既,给定一个群 G 及其元素 α、β,计算出 x,使得:
到目前为止,我们还不知道在一个实际群中计算离散对数 x 的难度。这里的意思是,虽然一些攻击方式是已知的,但我们并不清楚是否有更好更强有力的求解 DLP 的算法。这个情况在整数因数分解也是一样的。
暴力搜索
简单穷举所有的指数,直到得到结果 β:
对于随机的 x,我们期望查找一半数量的可能 x,得到正确的结果,复杂度将与 |G| 相关,|G| 是群的阶。为了对抗基于 DL 加密的暴力攻击,|G| 应该足够大,比如在实际案例中,Z∗p (p 为质数),|G|=p−1 应该至少为 280。
大步小步算法(Shanks' baby-step giant-step method)
将离散对数算法 x=logαβ 重写为两个数值表示:
m=√|G| 现在,可重新表示为 β=αx=αxgm+xb 可以得到:
算法目标是查找一对 (xg,xb),算法的可以单独搜索 xg 与 xb,在算法的第一步,我们计算并存储所有 αxb,其中 0≤xb<m,这是算法的小步阶段,需要 m≈√|G| 步,并需要存储 m≈√|G| 的结果。
在大步阶段,算法编历所有的 xg,0≤xg<m,查看下面的等式是否满足:
如果满足这个等式,那么对于满足等式的参数对 xg,b,xb,0,有:
大步小步算法复杂度是 √|G|,并需要等量的内存,在阶为 280 的群中,攻击者只需要约 240 时间复杂度与空间复杂度,这对于现今的计算机是可行的。因此,我们需要的阶至少为 2160,在 G=Z∗p 群中,质数 p 至少要有 160 位长。
普利-罗尔算法(Pollard's Rho method)
普利-罗尔算法与大步小步算法具有相同的时间复杂度,但其需要的空间复杂度是很小的。这个算法是一类概率算法,基于生日悖论。这里我们仅简单介绍这个算法。基本的思想是伪随机生成群元素 αi⋅βj,对于每一个元素,我们追踪 i 与 j,直到我们获得两个元素满足:
如果我们替换 β=αx 并比较等式两侧的等式,会得出 i1+xj1≡i2+xj2 mod |G| (我们在循环群中),这里,离散对数算法可以简单计算为:
波利格-海尔曼算法(Pohlig-Hellman Algorithm)
波利格-海尔曼算法基于中国剩余定理,对群的阶进行可能的因数分解。令:
做为群阶的质因数分解,我们可以利用这个质因数分解,将大的离散对数算法分割成小的离散对数算法。可以对小的离散对数问题,可以使用前面介绍的算法进行求解。
非一般化算法:指数-对数算法(Index-Calculus method)
前面介绍的算法都是与这个群是什么样的群无关的,它们可以求解任何循环群中的离散对数算法问题。而非一般算法则针对某一类特群进行高效攻击。最重要的非一般化算法是指数-对数算法。
8.4 Diffie-Hellman 密钥交换的安全性
在介绍离散对数问题后,我们现在可以讨论 DHKE 的安全性了。首先,需要注意的,基础版本的 DHKE 的协议不能抵抗中间人攻击。
现在我们考虑被动攻击,既,攻击者只能监听但不能修改信息。攻击者的目标是计算会话双方共享的会话密钥 KAB。攻击者知道 α 以及 p,因为这些是在协议配置时公开的信息。另外,攻击者可以在密钥交换协议执行期间监听通道,可以获取到 kpub,A 与 kpub,B 的值。因此,问题变为攻击者是否能够从已知信息 α、p、A≡αa mod p、B≡αb mod p 计算出 k=αab,这个问题称作 Diffie-Hellman 问题 DHP: Diffie-Hellman problem
。下面是对 DHP
的正式描述:
定义 8.4.1 广义 DHP
给到有限循环群 G 阶为 n,原始元素 α∈G 以及两个元素 A=αa 与 B=αb,DHP 问题是寻找群元素 αab
我们考虑 DHP 是在乘法群 Z∗p 中。攻击者知道高效计算 Z∗p 中的离散对数,那么他可以解 DHP 并通过下面两个步骤获取到密钥 kAB:
- 通过求解离散对数问题 a≡logαA mod p,计算私钥 a=kpr,A
- 计算会话密钥 kAB≡Ba mod p
如果 p 选的足够大,那么计算离散对数问题是不可能的。因此,现在我们需要确定的是,是否求解 DLP 是解决 DHP 的唯一途径。理论上,是存在其他方法求解 DHP 的。不过,即便我们不能从数学层面上证明,但会假设求解 DLP 问题是求解 DHP 的唯一方法。
因此为了确保实践中 DHKE 的安全性,我们必须确保对应的 DLP 不能被求解,这是通过选择足够大的 p 实现的。
8.5 Elgamal 加密策略
8.5.1 由 Diffie-Hellman 密钥交换到 Elgamal 加密
我们考虑通讯双方,A 与 B,如果 A 希望发送一条加密信息 x 给 B,双方首先需要执行 Diffie-Hellman 密钥交换来得到共享密钥 kM。我们假设大的质数 p 与原始元素 α 已经生成了。A 对消息进行加密 y≡x⋅kM mod p。
(a) B 选择 d=kpr,B∈{2,...,p−2}
(b) B 计算 β=kpub,B≡αd mod p,并将 β 给到 A
(c) A 选择 i=kpr,A∈{2,...,p−2}
(d) A 计算 kE=kpub,A≡αi mod p,并将 kE 给到 B
(e) A 计算 kM≡βi mod p
(f) B 计算 kM≡kdE mod p
(g) A 加密信息 x∈Z∗p,y≡x⋅kM mod p,并将密文发送给 B
(h) B 解密密文得到 x≡y⋅k−1M mod p
协议由两个部分组成,经典的 DHKE 算法,以及信息加密与解密步骤。B 计算他的私钥 d 与公钥 β。这个密钥对并不会变化,可以用来加密任何信息。A 生成一个新的公-私钥对,来加密信息。他的私钥表示为 i,公钥表示为 kE,公钥只临时存在,真正使用的密钥是 kM 用来对信息进行加密。
8.5.2 Elgamal 协议
Elgamal 加密协议
- B 选择大质数 p,选择原始元素 α∈Z∗p 或其子群 Z∗p 的元素,选择 kpr=d∈{2,...,p−2} 计算 kpub=β=αd mod p,并将 kpub=(p,α,β) 给到 A
- A 选择 i∈2,...,p−2,计算临时密钥 kE≡αi mod p 计算密钥 kM≡βi mod p,并加密信息 x∈Z∗p,y≡x⋅kM mod p,并将 (kE,y) 发送给 B
- B 计算密钥 kM≡kdE mod p 并解密密文 x≡y⋅y⋅k−1M mod p
密文由两个部分组成,临时密钥 kE 与密文 y,因为实际上所有参数位长为 log2p,密文 (kE,y) 长度是两倍的信息长度。
下面我们证明 Elgamal 协议的正确性:
证明 我们必须证明 kpr(kE,y) 能够得到原始信息 x
例 8.14 这里例子中,B 计算 Elgamal 密钥 A 加密信息 x=26
- B 生成质数 p=29,以及 α=2,选择 kpr,B=d=12 计算 β=αd=7 mod 29,并将 kpub,B=(p,α,β) 给到 A
- A 选择 i=5,计算 kE=αi≡3 mod 29,计算 kM=βi≡16 mod 29,加密 y=x⋅kM≡10 mod 29,将 (y,kE) 发送给 B
- B 计算 kM=kdE≡16mod29 解密 x=y⋅k−1M≡10⋅20≡26 mod 29
8.5.3 计算方面
密钥生成 在接收者生成密钥时,必须生成一个质数、计算公钥与私钥。因为 Elgamal 算法也依赖于离散对数问题,因此也需要选择一个比较大的质数 p,可以使用质数搜索算法生成这样的质数。私钥需要由真随机数生成,公钥需要一个指数运算,可以使用重复平方乘计算
加密数据 在加密过程中,计算临时密钥与加密密钥以及加密数据,需要进行两次模指运算以及一次模乘运算。涉及的所有操作数位长都是 log2p,为了高效进行指数运算,我们可以使用重复平方乘法,注意到那两次指数运算,是与原文无关的,因此一些应用可以预先计算存储,以备加密时使用
解密数据 解密的第一步是通过指数运算 kM=kd mod p,可以使用重复平方乘法,接着计算 kM 的你,可以使用扩展欧几里得算法。不过,有基于费马小定理捷径,可以将两个步骤合并成一个步骤,从 6.3.4 小节中,有:
对于所有的 kE∈Z∗p,我们可以将两个步骤组合:
这允许我们使用单个指数运算计算 kM 的逆,之后使用模乘运算进行解密 x≡y⋅k−1M mod p,这样,解密数据需要的就是一次重复平方乘运算与一次模乘运算。
8.5.4 安全性
被动攻击
从 p,α,β=αd,kE=αi,y=x⋅βi 中恢复出 x,这依赖于 Diffie-Hellman 问题的求解,假设攻击者具有解决 DLP 的方法,那么他又两种攻击 Elgamal 算法的方法。
-
通过 B 的¥ d 恢复 x:
d=logαβ mod p这个步骤解 DLP 问题,如果何理选择参数,那么这个计算将是不可能的。如果攻击者成功计算了这个内容,那么他可以像接收者那样解密出原文:
x≡y⋅(kdE)−1 mod p -
另一个方法,不计算 B 的 d,攻击者可以尝试恢复发送者 A 的随机指数 i:
i=logαk mod p这个步骤需要求解离散对数问题,如果攻击者成功做到了,他可以计算原文:
x≡y⋅(βi)−1 mod p
主动攻击
像所有的非对称算法中,必须确保公钥是认证的。这意味着加密一方 A 所持有的公钥确实是属于 B 的。如果攻击者企图欺骗 A 他的公钥是 B 的,他可以轻松攻击这个算法。为了防止这个攻击,可以使用证书,这会在第 13 章讨论。
第二个弱点是,Elgamal 加密的中使用的指数 i 不能重复使用,假设 A 使重复在两条信息 x1 与 x2 中使用同一个值 i,那么 kM=βi 是相同的,同样的,临时密钥也是相同的,这样就会在通道上发送两条 (y1,kE) 与 y1,kE 信息,如果攻击者了解了这个情景,并知道第一条信息内容,或可以猜到第一条内容,他科技计算 kM=y1x−11 mod p,并解密 x2:
另一个针对 Elgamal 的主动攻击是攻击它的可塑性,如果攻击者观测到 (kE,y),他可以替换为:
其中 s 为整数,接收者解密:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具