Typesetting math: 100%

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 ShellTLS: Transport Layer Security 以及 IPSec: Internet Protocol Security 中。在 DHKE 背后是 Zp 的指数(p 是质数)是一个单向函数。指数是可交换的。

k=(ax)y(ay)x mod p

k(ax)y(ay)x mod p 是一个联合密钥,可以做为通讯双方的会话密钥。

让我们先看一下 Diffie-Hellman 密钥交换协议是如何通过 Zp 工作的。在这个协议中,通讯双方,A 与 B 希望建立一个共享密钥。我们可以通过一个置信第三方,通过它来选择密钥交换需要的公共参数,当然也可以由 A 与 B 生成公共参数。严格来说,DHKE 由两个协议组成,配置协议以及主协议,主协议进行真正的密钥交换。配置协议由下面步骤组成:

Diffie-Hellman 配置

  1. 选择一个大质数 p
  2. 选择一个整数 α{23...p2}
  3. 发布 pα

这两个值有时称作域参数。如果 A 与 B 都知道配置步骤中的公共参数 p 以及 α,那么他们可以使用下面的密钥交换协议生成一个联合密钥 k

Diffie-Hellman 密钥交换

A 选择 a=kprA{2...p2},计算 A=kpubAαa mod p

B 选择 b=kprB{2...p2},计算 B=kpubBαb mod p

A 将 kpubA=A 发送给 B,B 将 kpubB=B 发送给 A

A 计算得到 kAB=kkprApubBBa modp,B 计算得到 kAB=kkprBpubAAb mod p

下面证明 A 与 B 通过上面的协议计算得到的密钥是相同的会话密钥。

证明

A 计算得到

Ba(αb)aαab mod p

B 计算得到

Ab(αa)bαab mod p

这样 A 与 B 都得到了共享会话密钥 kABαab mod p。这个密钥可以用在 A 与 B 之间进行安全通讯了,使用 KAB 做为对称算法如 AES 或 DES 的密钥了。

我们现在看一个小的数值做为例子。

例 8.1 Diffie-Hellman 域参数为 p=29α=2,协议处理如下:

A 选择 a=kprA=5A=kpubA=253 mod 29

B 选择 b=kprB=12B=kpubB=2127 mod 29

A 将 A = 3 交给 B,B 将 B = 7 交给 A

A 计算 KAB=Ba7516 mod 29,B 计算 KAB=Ab=31216 mod 29

在实际应用中,为了提供比较强的安全性能,DHKE 的 p 长度与 RSA 中的模数 n 长度相似,都是 1024 位以上。整数 α 需要具有特殊属性:它需要是一个原始元素 primitive element。协议中计算的会话密钥 kAB 位长与 p 相同。如果我们希望使用它做为如 AES 算法的对称密钥,我们可以简单取最高 128 位,也可以使用对 kAB 做哈希利用哈希输出做为对称密钥。

在真实的协议中,我们会首先生成私钥 ab,出于安全性考虑,它们应该来自于真随机数生成器。计算公钥 A 与 B 以及会话密钥,可以使用重复平方乘算法。

8.2 一些代数

下面我们介绍一些基础的抽象代数问题,诸如群、子群、有限群与循环群。

8.2.1 群

让我们回顾群的定义。

定义 8.2.1 群

群是一个元素 G 的集合,并伴有将 G 中两个元素组合的操作 ,群具有下面的特性:

  1. 群操作 是闭合的,既对所有的 abG,满足 ab=cG
  2. 群操作 满足结合律,既 a(bc)=(ab)cabcG
  3. 具有元素 eG,称为零元素,满足 ae=ea=aaG
  4. 对于 aG 存在 a1G 称作 a 的逆,满足 aa1=a1a=1
  5. 如果 ab=baabG,那么这个群是阿贝尔群

注意到,在加密运算应用中,我们会同时使用乘法群与加法群,在乘法群中操作数 表示为乘法,而在加法群中操作数 表示为加法。

例 8.2 为了阐述群定义,我们考虑下面的例子

  • (Z+) 是一个群,既整数集 Z={...21012...} 并使用加法做为操作,组成一个阿贝尔群,其中零元素 e=0aaZ 的逆

  • (Z)0Z 不是一个群,既排除元素 0 的整数集不构成群,因为除了 11,不存在 aZ 的逆存在使 aa1=1

  • (C) 是一个群,既复数 u+ivuvR 使用乘法操作,有 i2=1,并伴随有下面的复数乘法操作:

    (u1+iv1)(u2+iv2)=(u1u2v1v2)+i(u1v2+v1u2)

    形成一个阿贝尔群,群的零元素 e=1,元素 a=u+ivC 逆为 a1=(ui)/(u2+v2)

不过,上面提到的几个群,并不在密码学中使用,因为我们需要一个具有有限元素的群。

定理 8.2.1

集合 Zn 由满足 gcd(in)=1 的整数 i=01...n1 组成,在整数乘模 n 操作下组成阿贝尔群,零元素是 e=1

例 8.3 如果我们选择 n=9Zn 由元素 {124578} 组成,下表展示了这个集合的乘法模 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

通过将 Z9 的全部元素计算出来,我们可以轻松得出它是阿贝尔群。

8.2.2 循环群

在密码学中,我们总是考虑有限结构,比如在 AES 中我们需要使用有限域。我们现在提供一个有限群的直接定义:

定义 8.2.2 有限群

如果一个群具有有限元素数,这个群 (G) 是有限群。我们将这个群 G 的基数或阶表示为 |G|

例 8.4 有限群例:

  • (Zn+)Zn 的基数是 |Zn|=n 因为 Zn={012...n1}
  • (Zn)Zn 定义为小于 n 的正整数集,集合中的元素与 n 互质,因此 Zn 的基数等于 n 的欧拉 Phi 函数,|Zn|=Φ(n),比如,群 Z9 的基数为 3231=6,群的元素是 {124578}

定义 8.2.3 元素的阶

一个群 (G) 的元素 a 的阶 ord(a),是最小的正整数 k ,满足:

ak=aaa...a=1

其中 1 为群 G 的零元素。

例 8.5 在群 Z11 中,我们可以尝试元素 a=3 的阶,我们可以穷举直到得到零元素 1

a1=3a2=aa=33=9a3=a2a=93=275 mod 11a4=a3a=53=154 mod 11a5=a4a=43=121 mod 11

可以得到元素 a=3 的阶是 ord(3)=5

我们让这个乘法继续下去:

a6=a5a1a3 mod 11a7=a5a21a29 mod 11a8=a5a31a35 mod 11a9=a5a41a44 mod 11a10=a5a5111 mod 11a11=a10a1a3 mod 11

定义 8.2.4 循环群

G 包含一个元素 α,它具有阶 ord(α)=|G|,那么我们说它是循环的,具有这个最大阶的元素,称作原始元素或生成元素。

例 8.6 我们检验一下 a=2 是否是 Z11={12345678910} 的原始元素,注意到群 |Z11|=10

a=2a2=4a3=8a45 mod 11a510 mod 11a69 mod 11a77 mod 11a83 mod 11a96 mod 11a101 mod 11

可知 a=2 元素是 Z11 的原始元素,且这个群是循环群。从上面的穷举中,我们也可以看到,它生成了群中的所有元素,而且这个生成的顺序看起来是任意的,这也是 Diffie-Hellman 密钥交换的基础。

循环群具有有趣的特性。

在密码学应用中,十分重要的一个特性是:

定理 8.2.2 对于每一个质数 p(Zp) 是阿贝尔有限循环群

定理 8.2.3 G 是一个有限群,那么对于每一个 aG 必然满足:

  1. a|G|=1
  2. ord(a) 能够整除 |G|

例 8.7 我们考虑群 Z11 它的阶是 10,这个群中的元素的阶分别是 1,2,5,10,因为只有这些整数能够整除 10,我们可以验证这一特性

ord(1)=1ord(2)=10ord(3)=5ord(4)=5ord(5)=5ord(6)=10ord(7)=10ord(8)=10ord(9)=5ord(10)=2

定理 8.2.4G 是有限循环群,那么它必满足:

  1. G 的原始元素的数量是 Φ(|G|)
  2. |G| 是质数,那么所有 a1G 元素都是原始元素

8.2.3 子群

定理 8.2.5 循环子群定理

(G) 做为一个循环群,那么每一个元素 aG,具有 ord(a)=s 是具有 s 个元素的循环子群的原始元素

例 8.8 考虑 G=Z11 的子群,在前面,我们看到 ord(3)=5,元素 3 能够生成子集 H={13459},通过穷举其运算:

× 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,每个元素都有对应的逆元素,因此 HZ11 的子群。

更精群地说,它是质数阶 5 的子群。不仅 3 是 H 的原始元素,4、5、9 也是。

一个重要的特例是,子群的阶是质数阶。从定理 8.2.4 可知,如果这个子群的阶表示为 q,所有不是零元素的元素具有阶 q

从循环子群定理,我们知道每一个元素 aG 产生一些子群 H,由定理 8.2.3 有下面定理存在:

定理 8.2.6 拉格朗日定理

HG 的子群,那么 |H| 整除 |G|

例 8.9 循环群 Z11 的阶为 |Z11|=10=125,因此它的子群的阶有 1、2、5、10,因为它们能够整除 10,所有 Z11 子群 H 以及它们的原始元素 α 如下:

子群 元素 原始元素
H1 α=1
H2 α=10
H3 α=3459

下面是本节的最后一个定理,全面阐述有限循环群的子群特性。

定理 8.2.7

G 是一个有限循环群,阶是 nαG 的原始元素,那么对于每一个能够整除 n 的整数 k,存在一个 G 的阶为 k 的循环子群。这个子群由 αn/k 生成,H 由满足 aGak=1 的元素组成,没有其他子群

这个定理给了我们一个从一个循环群构建直接构建子群的方法。我们唯一需要知道的就是群的阶 n,以及一个原始元素,知道这些,我们就可以计算 αn/k 并获得具有 k 个元素的子群。

例 8.10 考虑循环群 Z11,在之前的例子中,我们知道 α=8 是群的一个原始元素,如果我们希望有一个阶为 2 的原始元素 β,可以计算

β=αn/k=810/2=85=3276810 mod 11

我们现在可以验证元素 10 实际上生成具有两个元素的子群 β1=10β2=1001 mod 11β310 mod 11

8.3 离散对数问题

DHKE 算法下的单向函数,是离散对数问题 DLP: discrete logarithm problem,这一问题可以直接使用循环群解释。

8.3.1 质数域的离散对数问题

我们以 Zp 开始讨论 DLP 问题,其中 p 为质数。

定义 8.3.1

给到有限群 Zp 的阶为 p1,有原始元素 αZp 以及另一个元素 βZp,那么 DLP 问题是,是否能够确定整数 1xp1 有:

αxβ mod p

从 8.2.2 小节中,可以知道这样的整数 x 必然存在,因为 α 是一个原始元素,且每一个群元素可以表示为任何原始元素的指数。这个整数 x 称作 β 对基底 α 的离散对数,我们可以正式写成:

x=logαβ mod p

如果参数足够大,那么计算理算对数模质数是十分困难的工作。由于指数 αxβ mod p 计算是十分简单的,这形成了一个单向函数。

例 8.11 我们考虑 Z47 中的离散对数,其中 α=5 是其中的原始元素,对于 β=41,离散对数问题是:找到正整数 x 有:

5x41 mod 47

就算是小的数值,确定 x 也不是直观的。使用暴力攻击,系统尝试所有可能的 x 值,我们得到解 x=15

实际上,一般期望在 DLP 问题中使用质数阶,以防止 Pohlig-Hellman 攻击。因为群 Zp 具有阶 p1,显然不是质数,我们通常使用 Zp 带有质数阶的子群,而不是 Zp 自身,下面用一个例子阐述。

例 8.12 我们考虑群 Z47,它的阶为 46,Z47 的子群的阶有 23、2、1,α=2 是具有 23 个元素的子群中的一个元素,因为 23 是一个质数, α 是子群中的一个质数元素,一个可能的离散对数问题是:给到 β=36 (子群中的一个元素),找到正整数 x1x23,有:

2x36 mod 47

使用暴力破解,我们得到解为 x=17

8.3.2 广义离散对数问题

DLP 特性并不限制在 p 为质数的乘法群 Zp,它可以在任何循环群中定义,这称作广义离散对数问题 GDLP: generalized discrete logarithm problem 描述如下:

定义 8.3.2 广义离散对数问题

给定一个有限循环群 G 群操作为 阶为 n,我们考虑一个质数元素 αG,以及另一个元素 βG,离散对数问题是:找到整数 x1xn,有:

β=ax

Zp 的 DLP 问题中,这样的整数必然存在,因为 α 是一个原始元素,因此群 G 的每一个元素都可以由 α 的产物生成。

需要注意的是,在一些循环群中 DLP 问题并不复杂,这样的群不能用在公钥算法中,因为这样的 DLP 不再是单向函数,考虑下面的问题:

例 8.13 这次我们选择整数对质数模的加法群做为用例,我们选择质数 p=11G=(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 问题,我们必须计算整数 1x11 有:

x2=2+2+...+23 mod 11

下面是对 DLP 的攻击,即便群操作是加法,我们也可以使用乘法表示 αβ 以及离散对数 x 之间的关系:

x23 mod 11

为求解 x,可以简单对 α 求逆:

x213 mod 11

使用扩展欧几里得算法,我们可以计算 216 mod 11,从而有:

x2137 mod 11

查看上面列出的表格,可以确定我们的计算是正确的。

我们可以一般化上面的技巧,以处理任意的群 (Zn+),因此,我们可以得出广义 DLP 问题在 Zn 的情况下是易于计算的。

现在我们列出在密码学中已经提出的离散对数问题:

  1. 质数阶乘法群 Zp 或它的一个子群。经典 DHKE、Elgamal 加密或数字签名算法 DSA: Digital Signature Algorithm 使用这个群,这是最经典且是最广泛使用的离散对数系统
  2. 由椭圆曲线形成的循环群,椭圆曲线加密系统会在第九章介绍,它们在最近十年十分流行
  3. 伽罗瓦域 GF(2m) 乘法群或它的子群,这些群完全可以用来模拟质数域的乘法群,DHKE 策略可以基于这些群,实际中它们并不流行,因为对它们的攻击更加强劲,因此这样的群中的 D·LP 需要更长的比特位长,来提供与其他群一样的安全等级
  4. 超椭圆曲线或代数变量,可以视为广义的椭圆曲线,实际中一般不用,不过某些超椭圆曲线具有一些优点比如操作数比较短

8.3.3 对离散对数的攻击

本小节介绍求解离散对数问题的方法。只对构造使用 DL 策略的读者,可以跳过这一部分。

我们已经看到,离散对数的非对称算法安全性基于在循环群中计算 DLP 问题,既,给定一个群 G 及其元素 αβ,计算出 x,使得:

β=αx

到目前为止,我们还不知道在一个实际群中计算离散对数 x 的难度。这里的意思是,虽然一些攻击方式是已知的,但我们并不清楚是否有更好更强有力的求解 DLP 的算法。这个情况在整数因数分解也是一样的。

暴力搜索

简单穷举所有的指数,直到得到结果 β

α1 ?=βα2 ?=β...αx ?=β

对于随机的 x,我们期望查找一半数量的可能 x,得到正确的结果,复杂度将与 |G| 相关,|G| 是群的阶。为了对抗基于 DL 加密的暴力攻击,|G| 应该足够大,比如在实际案例中,Zp (p 为质数),|G|=p1 应该至少为 280

大步小步算法(Shanks' baby-step giant-step method)

将离散对数算法 x=logαβ 重写为两个数值表示:

x=xgm+xb0xgxb<m

m=|G| 现在,可重新表示为 β=αx=αxgm+xb 可以得到:

β(αm)xg=αxb

算法目标是查找一对 (xgxb),算法的可以单独搜索 xgxb,在算法的第一步,我们计算并存储所有 αxb,其中 0xb<m,这是算法的小步阶段,需要 m|G| 步,并需要存储 m|G| 的结果。

在大步阶段,算法编历所有的 xg0xg<m,查看下面的等式是否满足:

β(αm)xg=αxb

如果满足这个等式,那么对于满足等式的参数对 xgbxb0,有:

x=xg0m+xb0

大步小步算法复杂度是 |G|,并需要等量的内存,在阶为 280 的群中,攻击者只需要约 240 时间复杂度与空间复杂度,这对于现今的计算机是可行的。因此,我们需要的阶至少为 2160,在 G=Zp 群中,质数 p 至少要有 160 位长。

普利-罗尔算法(Pollard's Rho method)

普利-罗尔算法与大步小步算法具有相同的时间复杂度,但其需要的空间复杂度是很小的。这个算法是一类概率算法,基于生日悖论。这里我们仅简单介绍这个算法。基本的思想是伪随机生成群元素 αiβj,对于每一个元素,我们追踪 ij,直到我们获得两个元素满足:

αi1βj1=αi2βj2

如果我们替换 β=αx 并比较等式两侧的等式,会得出 i1+xj1i2+xj2 mod |G| (我们在循环群中),这里,离散对数算法可以简单计算为:

x(i2i1)/(j1j2) mod |G|

波利格-海尔曼算法(Pohlig-Hellman Algorithm)

波利格-海尔曼算法基于中国剩余定理,对群的阶进行可能的因数分解。令:

|G|=pe11pe22...pell

做为群阶的质因数分解,我们可以利用这个质因数分解,将大的离散对数算法分割成小的离散对数算法。可以对小的离散对数问题,可以使用前面介绍的算法进行求解。

非一般化算法:指数-对数算法(Index-Calculus method)

前面介绍的算法都是与这个群是什么样的群无关的,它们可以求解任何循环群中的离散对数算法问题。而非一般算法则针对某一类特群进行高效攻击。最重要的非一般化算法是指数-对数算法。

8.4 Diffie-Hellman 密钥交换的安全性

在介绍离散对数问题后,我们现在可以讨论 DHKE 的安全性了。首先,需要注意的,基础版本的 DHKE 的协议不能抵抗中间人攻击。

现在我们考虑被动攻击,既,攻击者只能监听但不能修改信息。攻击者的目标是计算会话双方共享的会话密钥 KAB。攻击者知道 α 以及 p,因为这些是在协议配置时公开的信息。另外,攻击者可以在密钥交换协议执行期间监听通道,可以获取到 kpubAkpubB 的值。因此,问题变为攻击者是否能够从已知信息 αpAαa mod pBαb mod p 计算出 k=αab,这个问题称作 Diffie-Hellman 问题 DHP: Diffie-Hellman problem。下面是对 DHP 的正式描述:

定义 8.4.1 广义 DHP

给到有限循环群 G 阶为 n,原始元素 αG 以及两个元素 A=αaB=αb,DHP 问题是寻找群元素 αab

我们考虑 DHP 是在乘法群 Zp 中。攻击者知道高效计算 Zp 中的离散对数,那么他可以解 DHP 并通过下面两个步骤获取到密钥 kAB

  1. 通过求解离散对数问题 alogαA mod p,计算私钥 a=kprA
  2. 计算会话密钥 kABBa 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 对消息进行加密 yxkM mod p

(a) B 选择 d=kprB{2...p2}

(b) B 计算 β=kpubBαd mod p,并将 β 给到 A

(c) A 选择 i=kprA{2...p2}

(d) A 计算 kE=kpubAαi mod p,并将 kE 给到 B

(e) A 计算 kMβi mod p

(f) B 计算 kMkdE mod p

(g) A 加密信息 xZpyxkM mod p,并将密文发送给 B

(h) B 解密密文得到 xyk1M mod p

协议由两个部分组成,经典的 DHKE 算法,以及信息加密与解密步骤。B 计算他的私钥 d 与公钥 β。这个密钥对并不会变化,可以用来加密任何信息。A 生成一个新的公-私钥对,来加密信息。他的私钥表示为 i,公钥表示为 kE,公钥只临时存在,真正使用的密钥是 kM 用来对信息进行加密。

8.5.2 Elgamal 协议

Elgamal 加密协议

  1. B 选择大质数 p,选择原始元素 αZp 或其子群 Zp 的元素,选择 kpr=d{2...p2} 计算 kpub=β=αd mod p,并将 kpub=(pαβ) 给到 A
  2. A 选择 i2...p2,计算临时密钥 kEαi mod p 计算密钥 kMβi mod p,并加密信息 xZpyxkM mod p,并将 (kEy) 发送给 B
  3. B 计算密钥 kMkdE mod p 并解密密文 xyyk1M mod p

密文由两个部分组成,临时密钥 kE 与密文 y,因为实际上所有参数位长为 log2p,密文 (kEy) 长度是两倍的信息长度。

下面我们证明 Elgamal 协议的正确性:

证明 我们必须证明 kpr(kEy) 能够得到原始信息 x

dkpr(kEy)y(kM)1 mod p[xkM](kdE)1 mod p[x(αd)i][(αi)d]1 mod pxαdidix mod p

例 8.14 这里例子中,B 计算 Elgamal 密钥 A 加密信息 x=26

  1. B 生成质数 p=29,以及 α=2,选择 kprB=d=12 计算 β=αd=7 mod 29,并将 kpubB=(pαβ) 给到 A
  2. A 选择 i=5,计算 kE=αi3 mod 29,计算 kM=βi16 mod 29,加密 y=xkM10 mod 29,将 (ykE) 发送给 B
  3. B 计算 kM=kdE16mod29 解密 x=yk1M102026 mod 29

8.5.3 计算方面

密钥生成 在接收者生成密钥时,必须生成一个质数、计算公钥与私钥。因为 Elgamal 算法也依赖于离散对数问题,因此也需要选择一个比较大的质数 p,可以使用质数搜索算法生成这样的质数。私钥需要由真随机数生成,公钥需要一个指数运算,可以使用重复平方乘计算

加密数据 在加密过程中,计算临时密钥与加密密钥以及加密数据,需要进行两次模指运算以及一次模乘运算。涉及的所有操作数位长都是 log2p,为了高效进行指数运算,我们可以使用重复平方乘法,注意到那两次指数运算,是与原文无关的,因此一些应用可以预先计算存储,以备加密时使用

解密数据 解密的第一步是通过指数运算 kM=kd mod p,可以使用重复平方乘法,接着计算 kM 的你,可以使用扩展欧几里得算法。不过,有基于费马小定理捷径,可以将两个步骤合并成一个步骤,从 6.3.4 小节中,有:

kp1E1 mod p

对于所有的 kEZp,我们可以将两个步骤组合:

k1M(kdE)1 mod p(kdE)1kp1E mod pkpd1E mod p

这允许我们使用单个指数运算计算 kM 的逆,之后使用模乘运算进行解密 xyk1M mod p,这样,解密数据需要的就是一次重复平方乘运算与一次模乘运算。

8.5.4 安全性

被动攻击

pαβ=αdkE=αiy=xβi 中恢复出 x,这依赖于 Diffie-Hellman 问题的求解,假设攻击者具有解决 DLP 的方法,那么他又两种攻击 Elgamal 算法的方法。

  • 通过 B 的¥ d 恢复 x:

    d=logαβ mod p

    这个步骤解 DLP 问题,如果何理选择参数,那么这个计算将是不可能的。如果攻击者成功计算了这个内容,那么他可以像接收者那样解密出原文:

    xy(kdE)1 mod p

  • 另一个方法,不计算 B 的 d,攻击者可以尝试恢复发送者 A 的随机指数 i

    i=logαk mod p

    这个步骤需要求解离散对数问题,如果攻击者成功做到了,他可以计算原文:

    xy(βi)1 mod p

主动攻击

像所有的非对称算法中,必须确保公钥是认证的。这意味着加密一方 A 所持有的公钥确实是属于 B 的。如果攻击者企图欺骗 A 他的公钥是 B 的,他可以轻松攻击这个算法。为了防止这个攻击,可以使用证书,这会在第 13 章讨论。

第二个弱点是,Elgamal 加密的中使用的指数 i 不能重复使用,假设 A 使重复在两条信息 x1x2 中使用同一个值 i,那么 kM=βi 是相同的,同样的,临时密钥也是相同的,这样就会在通道上发送两条 (y1kE)y1kE 信息,如果攻击者了解了这个情景,并知道第一条信息内容,或可以猜到第一条内容,他科技计算 kM=y1x11 mod p,并解密 x2

x2y2k1M mod p

另一个针对 Elgamal 的主动攻击是攻击它的可塑性,如果攻击者观测到 (kEy),他可以替换为:

(kEsy)

其中 s 为整数,接收者解密:

dkpr(kEsy)syk1M mod ps(xkM)k1M mod psx mod p

posted @   ArvinDu  阅读(245)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示