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 \equiv (a^x)^y \equiv (a^y)^x \ mod \ p\) 是一个联合密钥,可以做为通讯双方的会话密钥。
让我们先看一下 Diffie-Hellman 密钥交换协议是如何通过 \(Z_p^*\) 工作的。在这个协议中,通讯双方,A 与 B 希望建立一个共享密钥。我们可以通过一个置信第三方,通过它来选择密钥交换需要的公共参数,当然也可以由 A 与 B 生成公共参数。严格来说,DHKE 由两个协议组成,配置协议以及主协议,主协议进行真正的密钥交换。配置协议由下面步骤组成:
Diffie-Hellman 配置
- 选择一个大质数 \(p\)
- 选择一个整数 \(\alpha \in \{2,3,...,p-2\}\)
- 发布 \(p\) 与 \(\alpha\)
这两个值有时称作域参数。如果 A 与 B 都知道配置步骤中的公共参数 \(p\) 以及 \(\alpha\),那么他们可以使用下面的密钥交换协议生成一个联合密钥 \(k\):
Diffie-Hellman 密钥交换
A 选择 \(a = k_{pr,A} \in \{2,...,p-2\}\),计算 \(A = k_{pub,A} \equiv \alpha^a \ mod \ p\)
B 选择 \(b = k_{pr,B} \in \{2,...,p-2\}\),计算 \(B = k_{pub,B} \equiv \alpha^b \ mod \ p\)
A 将 \(k_{pub,A} = A\) 发送给 B,B 将 \(k_{pub,B} = B\) 发送给 A
A 计算得到 \(k_{AB} = k_{pub,B}^{k_pr,A} \equiv B^a \ mod p\),B 计算得到 \(k_{AB} = k_{pub,A}^{k_{pr},B} \equiv A^b \ mod \ p\)
下面证明 A 与 B 通过上面的协议计算得到的密钥是相同的会话密钥。
证明
A 计算得到
B 计算得到
这样 A 与 B 都得到了共享会话密钥 \(k_{AB} \equiv \alpha^{ab} \ mod \ p\)。这个密钥可以用在 A 与 B 之间进行安全通讯了,使用 \(K_{AB}\) 做为对称算法如 AES 或 DES 的密钥了。
我们现在看一个小的数值做为例子。
例 8.1 Diffie-Hellman 域参数为 \(p = 29,\alpha = 2\),协议处理如下:
A 选择 \(a = k_{pr,A} = 5\),\(A = k_{pub,A} = 2^5 \equiv 3 \ mod \ 29\)
B 选择 \(b = k_{pr,B} = 12\),\(B = k_{pub,B} = 2^{12} \equiv 7 \ mod \ 29\)
A 将 A = 3 交给 B,B 将 B = 7 交给 A
A 计算 \(K_{AB} = B^a \equiv 7^5 \equiv 16 \ mod \ 29\),B 计算 \(K_{AB} = A^b = 3^{12} \equiv 16 \ mod \ 29\)
在实际应用中,为了提供比较强的安全性能,DHKE 的 \(p\) 长度与 RSA 中的模数 \(n\) 长度相似,都是 1024 位以上。整数 \(\alpha\) 需要具有特殊属性:它需要是一个原始元素 primitive element。协议中计算的会话密钥 \(k_{AB}\) 位长与 \(p\) 相同。如果我们希望使用它做为如 AES 算法的对称密钥,我们可以简单取最高 128 位,也可以使用对 \(k_{AB}\) 做哈希利用哈希输出做为对称密钥。
在真实的协议中,我们会首先生成私钥 \(a\) 与 \(b\),出于安全性考虑,它们应该来自于真随机数生成器。计算公钥 A 与 B 以及会话密钥,可以使用重复平方乘算法。
8.2 一些代数
下面我们介绍一些基础的抽象代数问题,诸如群、子群、有限群与循环群。
8.2.1 群
让我们回顾群的定义。
定义 8.2.1 群
群是一个元素 \(G\) 的集合,并伴有将 \(G\) 中两个元素组合的操作 \(\circ\),群具有下面的特性:
- 群操作 \(\circ\) 是闭合的,既对所有的 \(a,b\in G\),满足 \(a \circ b = c \in G\)
- 群操作 \(\circ\) 满足结合律,既 \(a\circ (b \circ c) = (a \circ b)\circ c;a,b,c\in G\)
- 具有元素 \(e\in G\),称为零元素,满足 \(a\circ e = e\circ a = a,a\in G\)
- 对于 \(a\in G\) 存在 \(a^{-1} \in G\) 称作 \(a\) 的逆,满足 \(a \circ a^{-1} = a^{-1}\circ a = 1\)
- 如果 \(a \circ b = b \circ a;a,b \in G\),那么这个群是阿贝尔群
注意到,在加密运算应用中,我们会同时使用乘法群与加法群,在乘法群中操作数 \(\circ\) 表示为乘法,而在加法群中操作数 \(\circ\) 表示为加法。
例 8.2 为了阐述群定义,我们考虑下面的例子
-
\((Z,+)\) 是一个群,既整数集 \(Z = \{...,-2,-1,0,1,2,...\}\) 并使用加法做为操作,组成一个阿贝尔群,其中零元素 \(e = 0\),\(-a\) 是 \(a \in Z\) 的逆
-
\((Z,\cdot),0 \notin Z\) 不是一个群,既排除元素 0 的整数集不构成群,因为除了 \(-1,1\),不存在 \(a \in Z\) 的逆存在使 \(a \cdot a^{-1} = 1\)
-
\((C,\cdot)\) 是一个群,既复数 \(u + iv;u,v \in R\) 使用乘法操作,有 \(i^2 = -1\),并伴随有下面的复数乘法操作:
\[(u_1 + iv_1)\cdot(u_2+iv_2) = (u_1u_2 - v_1v_2) + i(u_1v_2 + v_1u_2) \]形成一个阿贝尔群,群的零元素 \(e = 1\),元素 \(a = u + iv \in C\) 逆为 \(a^{-1} = (u - i)/(u^2 + v^2)\)
不过,上面提到的几个群,并不在密码学中使用,因为我们需要一个具有有限元素的群。
定理 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 的表:
$\times \ 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,\circ)\) 是有限群。我们将这个群 \(G\) 的基数或阶表示为 \(|G|\)
例 8.4 有限群例:
- \((Z_n,+)\):\(Z_n\) 的基数是 \(|Z_n| = n\) 因为 \(Z_n = \{0,1,2,...,n-1\}\)
- \((Z_n^*,\cdot)\):\(Z_n^*\) 定义为小于 \(n\) 的正整数集,集合中的元素与 \(n\) 互质,因此 \(Z_n^*\) 的基数等于 \(n\) 的欧拉 Phi 函数,\(|Z_n^*| = \Phi(n)\),比如,群 \(Z_9^*\) 的基数为 \(3^2 - 3^1 = 6\),群的元素是 \(\{1,2,4,5,7,8\}\)
定义 8.2.3 元素的阶
一个群 \((G,\circ)\) 的元素 \(a\) 的阶 \(ord(a)\),是最小的正整数 \(k\) ,满足:
其中 \(1\) 为群 \(G\) 的零元素。
例 8.5 在群 \(Z_{11}^*\) 中,我们可以尝试元素 \(a = 3\) 的阶,我们可以穷举直到得到零元素 1
可以得到元素 \(a = 3\) 的阶是 \(ord(3) = 5\)。
我们让这个乘法继续下去:
定义 8.2.4 循环群
群 \(G\) 包含一个元素 \(\alpha\),它具有阶 \(ord(\alpha) = |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^*,\cdot)\) 是阿贝尔有限循环群
定理 8.2.3 \(G\) 是一个有限群,那么对于每一个 \(a \in G\) 必然满足:
- \(a^{|G|} = 1\)
- \(ord(a)\) 能够整除 \(|G|\)
例 8.7 我们考虑群 \(Z_{11}^*\) 它的阶是 10,这个群中的元素的阶分别是 1,2,5,10,因为只有这些整数能够整除 10,我们可以验证这一特性
定理 8.2.4 令 \(G\) 是有限循环群,那么它必满足:
- \(G\) 的原始元素的数量是 \(\Phi(|G|)\)
- 若 \(|G|\) 是质数,那么所有 \(a \neq 1 \in G\) 元素都是原始元素
8.2.3 子群
定理 8.2.5 循环子群定理
令 \((G,\circ)\) 做为一个循环群,那么每一个元素 \(a \in G\),具有 \(ord(a) = s\) 是具有 \(s\) 个元素的循环子群的原始元素
例 8.8 考虑 \(G = Z_{11}^*\) 的子群,在前面,我们看到 \(ord(3) = 5\),元素 3 能够生成子集 \(H = \{1,3,4,5,9\}\),通过穷举其运算:
\(\times \ 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\in G\) 产生一些子群 \(H\),由定理 8.2.3 有下面定理存在:
定理 8.2.6 拉格朗日定理
\(H\) 为 \(G\) 的子群,那么 \(|H|\) 整除 \(|G|\)
例 8.9 循环群 \(Z_{11}^*\) 的阶为 \(|Z_{11}^*| = 10 = 1\cdot 2\cdot 5\),因此它的子群的阶有 1、2、5、10,因为它们能够整除 10,所有 \(Z_{11}^*\) 子群 \(H\) 以及它们的原始元素 \(\alpha\) 如下:
子群 | 元素 | 原始元素 |
---|---|---|
\(H_1\) | \(\alpha = 1\) | |
\(H_2\) | \(\alpha = 10\) | |
\(H_3\) | \(\alpha = 3,4,5,9\) |
下面是本节的最后一个定理,全面阐述有限循环群的子群特性。
定理 8.2.7
\(G\) 是一个有限循环群,阶是 \(n\),\(\alpha\) 是 \(G\) 的原始元素,那么对于每一个能够整除 \(n\) 的整数 \(k\),存在一个 \(G\) 的阶为 \(k\) 的循环子群。这个子群由 \(\alpha^{n/k}\) 生成,\(H\) 由满足 \(a\in G,a^k = 1\) 的元素组成,没有其他子群
这个定理给了我们一个从一个循环群构建直接构建子群的方法。我们唯一需要知道的就是群的阶 \(n\),以及一个原始元素,知道这些,我们就可以计算 \(\alpha^{n/k}\) 并获得具有 \(k\) 个元素的子群。
例 8.10 考虑循环群 \(Z_{11}^*\),在之前的例子中,我们知道 \(\alpha = 8\) 是群的一个原始元素,如果我们希望有一个阶为 2 的原始元素 \(\beta\),可以计算
我们现在可以验证元素 10 实际上生成具有两个元素的子群 \(\beta^1 = 10,\beta^2 = 100 \equiv 1 \ mod \ 11,\beta^3 \equiv 10 \ mod \ 11\)。
8.3 离散对数问题
在 DHKE
算法下的单向函数,是离散对数问题 DLP: discrete logarithm problem
,这一问题可以直接使用循环群解释。
8.3.1 质数域的离散对数问题
我们以 \(Z_p^*\) 开始讨论 DLP
问题,其中 \(p\) 为质数。
定义 8.3.1
给到有限群 \(Z_p^*\) 的阶为 \(p-1\),有原始元素 \(\alpha \in Z_p^*\) 以及另一个元素 \(\beta \in Z_p^*\),那么 DLP 问题是,是否能够确定整数 \(1 \leq x \leq p-1\) 有:
从 8.2.2 小节中,可以知道这样的整数 \(x\) 必然存在,因为 \(\alpha\) 是一个原始元素,且每一个群元素可以表示为任何原始元素的指数。这个整数 \(x\) 称作 \(\beta\) 对基底 \(\alpha\) 的离散对数,我们可以正式写成:
如果参数足够大,那么计算理算对数模质数是十分困难的工作。由于指数 \(\alpha^x \equiv \beta \ mod \ p\) 计算是十分简单的,这形成了一个单向函数。
例 8.11 我们考虑 \(Z_{47}^*\) 中的离散对数,其中 \(\alpha = 5\) 是其中的原始元素,对于 \(\beta = 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,\(\alpha = 2\) 是具有 23 个元素的子群中的一个元素,因为 23 是一个质数, \(\alpha\) 是子群中的一个质数元素,一个可能的离散对数问题是:给到 \(\beta = 36\) (子群中的一个元素),找到正整数 \(x\),\(1 \leq x \leq 23\),有:
使用暴力破解,我们得到解为 \(x = 17\)。
8.3.2 广义离散对数问题
DLP 特性并不限制在 \(p\) 为质数的乘法群 \(Z_p^*\),它可以在任何循环群中定义,这称作广义离散对数问题 GDLP: generalized discrete logarithm problem
描述如下:
定义 8.3.2 广义离散对数问题
给定一个有限循环群 \(G\) 群操作为 \(\circ\) 阶为 \(n\),我们考虑一个质数元素 \(\alpha \in G\),以及另一个元素 \(\beta \in G\),离散对数问题是:找到整数 \(x\),\(1\leq x \leq n\),有:
在 \(Z_p^*\) 的 DLP 问题中,这样的整数必然存在,因为 \(\alpha\) 是一个原始元素,因此群 \(G\) 的每一个元素都可以由 \(\alpha\) 的产物生成。
需要注意的是,在一些循环群中 DLP 问题并不复杂,这样的群不能用在公钥算法中,因为这样的 DLP 不再是单向函数,考虑下面的问题:
例 8.13 这次我们选择整数对质数模的加法群做为用例,我们选择质数 \(p = 11,G = (Z_{11},+)\) 是一个有限循环群,具有原始元素 \(\alpha = 2\),下面是 \(\alpha\) 如何生成群的:
\(i\) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
\(i\alpha\) | 2 | 4 | 6 | 8 | 10 | 1 | 3 | 5 | 7 | 9 | 0 |
我们尝试对 \(\beta = 3\) 解 DLP 问题,我们必须计算整数 \(1 \leq x \leq 11\) 有:
下面是对 DLP 的攻击,即便群操作是加法,我们也可以使用乘法表示 \(\alpha\) 与 \(\beta\) 以及离散对数 \(x\) 之间的关系:
为求解 \(x\),可以简单对 \(\alpha\) 求逆:
使用扩展欧几里得算法,我们可以计算 \(2^{-1} \equiv 6 \ mod \ 11\),从而有:
查看上面列出的表格,可以确定我们的计算是正确的。
我们可以一般化上面的技巧,以处理任意的群 \((Z_n,+)\),因此,我们可以得出广义 DLP 问题在 \(Z_n\) 的情况下是易于计算的。
现在我们列出在密码学中已经提出的离散对数问题:
- 质数阶乘法群 \(Z_p\) 或它的一个子群。经典 DHKE、Elgamal 加密或数字签名算法
DSA: Digital Signature Algorithm
使用这个群,这是最经典且是最广泛使用的离散对数系统 - 由椭圆曲线形成的循环群,椭圆曲线加密系统会在第九章介绍,它们在最近十年十分流行
- 伽罗瓦域 \(GF(2^m)\) 乘法群或它的子群,这些群完全可以用来模拟质数域的乘法群,DHKE 策略可以基于这些群,实际中它们并不流行,因为对它们的攻击更加强劲,因此这样的群中的 D·LP 需要更长的比特位长,来提供与其他群一样的安全等级
- 超椭圆曲线或代数变量,可以视为广义的椭圆曲线,实际中一般不用,不过某些超椭圆曲线具有一些优点比如操作数比较短
8.3.3 对离散对数的攻击
本小节介绍求解离散对数问题的方法。只对构造使用 DL 策略的读者,可以跳过这一部分。
我们已经看到,离散对数的非对称算法安全性基于在循环群中计算 DLP 问题,既,给定一个群 \(G\) 及其元素 \(\alpha\)、\(\beta\),计算出 \(x\),使得:
到目前为止,我们还不知道在一个实际群中计算离散对数 \(x\) 的难度。这里的意思是,虽然一些攻击方式是已知的,但我们并不清楚是否有更好更强有力的求解 DLP 的算法。这个情况在整数因数分解也是一样的。
暴力搜索
简单穷举所有的指数,直到得到结果 \(\beta\):
对于随机的 \(x\),我们期望查找一半数量的可能 \(x\),得到正确的结果,复杂度将与 \(|G|\) 相关,\(|G|\) 是群的阶。为了对抗基于 DL 加密的暴力攻击,\(|G|\) 应该足够大,比如在实际案例中,\(Z_p^*\) (\(p\) 为质数),\(|G| = p-1\) 应该至少为 \(2^{80}\)。
大步小步算法(Shanks' baby-step giant-step method)
将离散对数算法 \(x = log_{\alpha}\beta\) 重写为两个数值表示:
\(m = \sqrt{|G|}\) 现在,可重新表示为 \(\beta = \alpha^x = \alpha^{x_gm+x_b}\) 可以得到:
算法目标是查找一对 \((x_g,x_b)\),算法的可以单独搜索 \(x_g\) 与 \(x_b\),在算法的第一步,我们计算并存储所有 \(\alpha^{x_b}\),其中 \(0 \leq x_b < m\),这是算法的小步阶段,需要 \(m \approx \sqrt{|G|}\) 步,并需要存储 \(m \approx \sqrt{|G|}\) 的结果。
在大步阶段,算法编历所有的 \(x_g,0 \leq x_g < m\),查看下面的等式是否满足:
如果满足这个等式,那么对于满足等式的参数对 \(x_{g,b},x_{b,0}\),有:
大步小步算法复杂度是 \(\sqrt{|G|}\),并需要等量的内存,在阶为 \(2^{80}\) 的群中,攻击者只需要约 \(2^{40}\) 时间复杂度与空间复杂度,这对于现今的计算机是可行的。因此,我们需要的阶至少为 \(2^{160}\),在 \(G = Z_p^*\) 群中,质数 \(p\) 至少要有 160 位长。
普利-罗尔算法(Pollard's Rho method)
普利-罗尔算法与大步小步算法具有相同的时间复杂度,但其需要的空间复杂度是很小的。这个算法是一类概率算法,基于生日悖论。这里我们仅简单介绍这个算法。基本的思想是伪随机生成群元素 \(\alpha^i \cdot \beta^j\),对于每一个元素,我们追踪 \(i\) 与 \(j\),直到我们获得两个元素满足:
如果我们替换 \(\beta = \alpha^x\) 并比较等式两侧的等式,会得出 \(i_1 + xj_1 \equiv i_2 + xj_2 \ mod \ |G|\) (我们在循环群中),这里,离散对数算法可以简单计算为:
波利格-海尔曼算法(Pohlig-Hellman Algorithm)
波利格-海尔曼算法基于中国剩余定理,对群的阶进行可能的因数分解。令:
做为群阶的质因数分解,我们可以利用这个质因数分解,将大的离散对数算法分割成小的离散对数算法。可以对小的离散对数问题,可以使用前面介绍的算法进行求解。
非一般化算法:指数-对数算法(Index-Calculus method)
前面介绍的算法都是与这个群是什么样的群无关的,它们可以求解任何循环群中的离散对数算法问题。而非一般算法则针对某一类特群进行高效攻击。最重要的非一般化算法是指数-对数算法。
8.4 Diffie-Hellman 密钥交换的安全性
在介绍离散对数问题后,我们现在可以讨论 DHKE 的安全性了。首先,需要注意的,基础版本的 DHKE 的协议不能抵抗中间人攻击。
现在我们考虑被动攻击,既,攻击者只能监听但不能修改信息。攻击者的目标是计算会话双方共享的会话密钥 \(K_{AB}\)。攻击者知道 \(\alpha\) 以及 \(p\),因为这些是在协议配置时公开的信息。另外,攻击者可以在密钥交换协议执行期间监听通道,可以获取到 \(k_{pub,A}\) 与 \(k_{pub,B}\) 的值。因此,问题变为攻击者是否能够从已知信息 \(\alpha\)、\(p\)、\(A\equiv \alpha^a \ mod \ p\)、\(B \equiv \alpha^b \ mod \ p\) 计算出 \(k = \alpha^{ab}\),这个问题称作 Diffie-Hellman 问题 DHP: Diffie-Hellman problem
。下面是对 DHP
的正式描述:
定义 8.4.1 广义 DHP
给到有限循环群 \(G\) 阶为 \(n\),原始元素 \(\alpha \in G\) 以及两个元素 \(A = \alpha^a\) 与 \(B = \alpha^b\),DHP 问题是寻找群元素 \(\alpha^{ab}\)
我们考虑 DHP 是在乘法群 \(Z_p^*\) 中。攻击者知道高效计算 \(Z_p^*\) 中的离散对数,那么他可以解 DHP 并通过下面两个步骤获取到密钥 \(k_{AB}\):
- 通过求解离散对数问题 \(a \equiv log_{\alpha}A \ mod \ p\),计算私钥 \(a = k{pr,A}\)
- 计算会话密钥 \(k_{AB}\equiv B^a \ 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 密钥交换来得到共享密钥 \(k_M\)。我们假设大的质数 \(p\) 与原始元素 \(\alpha\) 已经生成了。A 对消息进行加密 \(y \equiv x\cdot k_M \ mod \ p\)。
(a) B 选择 \(d = k_{pr,B} \in \{2,...,p-2\}\)
(b) B 计算 \(\beta = k{pub,B} \equiv \alpha^d \ mod \ p\),并将 \(\beta\) 给到 A
(c) A 选择 \(i = k_{pr,A} \in \{2,...,p-2\}\)
(d) A 计算 \(k_E = k_{pub,A} \equiv \alpha^i \ mod \ p\),并将 \(k_E\) 给到 B
(e) A 计算 \(k_M \equiv \beta^i \ mod \ p\)
(f) B 计算 \(k_M \equiv k_E^d \ mod \ p\)
(g) A 加密信息 \(x \in Z_p^*\),\(y \equiv x\cdot k_M \ mod \ p\),并将密文发送给 B
(h) B 解密密文得到 \(x \equiv y \cdot k_M^{-1} \ mod \ p\)
协议由两个部分组成,经典的 DHKE 算法,以及信息加密与解密步骤。B 计算他的私钥 \(d\) 与公钥 \(\beta\)。这个密钥对并不会变化,可以用来加密任何信息。A 生成一个新的公-私钥对,来加密信息。他的私钥表示为 \(i\),公钥表示为 \(k_E\),公钥只临时存在,真正使用的密钥是 \(k_M\) 用来对信息进行加密。
8.5.2 Elgamal 协议
Elgamal 加密协议
- B 选择大质数 \(p\),选择原始元素 \(\alpha \in Z_p^*\) 或其子群 \(Z_p^*\) 的元素,选择 \(k_pr = d \in \{2,...,p-2\}\) 计算 \(k_{pub} = \beta = \alpha^d \ mod \ p\),并将 \(k_{pub} = (p,\alpha,\beta)\) 给到 A
- A 选择 \(i \in {2,...,p-2}\),计算临时密钥 \(k_E \equiv \alpha^i \ mod \ p\) 计算密钥 \(k_M \equiv \beta^i \ mod \ p\),并加密信息 \(x \in Z_p^*\),\(y \equiv x \cdot k_M \ mod \ p\),并将 \((k_E,y)\) 发送给 B
- B 计算密钥 \(k_M \equiv k_E^d \ mod \ p\) 并解密密文 \(x \equiv y \cdot y \cdot k_M^{-1} \ mod \ p\)
密文由两个部分组成,临时密钥 \(k_E\) 与密文 \(y\),因为实际上所有参数位长为 \(log_2p\),密文 \((k_E,y)\) 长度是两倍的信息长度。
下面我们证明 Elgamal 协议的正确性:
证明 我们必须证明 \(k_{pr}(k_E,y)\) 能够得到原始信息 \(x\)
例 8.14 这里例子中,B 计算 Elgamal 密钥 A 加密信息 \(x = 26\)
- B 生成质数 \(p = 29\),以及 \(\alpha = 2\),选择 \(k_{pr,B} = d = 12\) 计算 \(\beta = \alpha^d = 7 \ mod \ 29\),并将 \(k_{pub,B} = (p,\alpha,\beta)\) 给到 A
- A 选择 \(i = 5\),计算 \(k_E = \alpha^i \equiv 3 \ mod \ 29\),计算 \(k_M = \beta^i \equiv 16 \ mod \ 29\),加密 \(y = x \cdot k_M \equiv 10 \ mod \ 29\),将 \((y,k_E)\) 发送给 B
- B 计算 \(k_M = k_E^d \equiv 16 \mod 29\) 解密 \(x = y \cdot k_M^{-1} \equiv 10 \cdot 20 \equiv 26 \ mod \ 29\)
8.5.3 计算方面
密钥生成 在接收者生成密钥时,必须生成一个质数、计算公钥与私钥。因为 Elgamal 算法也依赖于离散对数问题,因此也需要选择一个比较大的质数 \(p\),可以使用质数搜索算法生成这样的质数。私钥需要由真随机数生成,公钥需要一个指数运算,可以使用重复平方乘计算
加密数据 在加密过程中,计算临时密钥与加密密钥以及加密数据,需要进行两次模指运算以及一次模乘运算。涉及的所有操作数位长都是 \(log_2p\),为了高效进行指数运算,我们可以使用重复平方乘法,注意到那两次指数运算,是与原文无关的,因此一些应用可以预先计算存储,以备加密时使用
解密数据 解密的第一步是通过指数运算 \(k_M = k^d \ mod \ p\),可以使用重复平方乘法,接着计算 \(k_M\) 的你,可以使用扩展欧几里得算法。不过,有基于费马小定理捷径,可以将两个步骤合并成一个步骤,从 6.3.4 小节中,有:
对于所有的 \(k_E \in Z_p^*\),我们可以将两个步骤组合:
这允许我们使用单个指数运算计算 \(k_M\) 的逆,之后使用模乘运算进行解密 \(x \equiv y \cdot k_M^{-1} \ mod \ p\),这样,解密数据需要的就是一次重复平方乘运算与一次模乘运算。
8.5.4 安全性
被动攻击
从 \(p,\alpha,\beta = \alpha^d,k_E = \alpha^i,y = x \cdot \beta^i\) 中恢复出 \(x\),这依赖于 Diffie-Hellman 问题的求解,假设攻击者具有解决 DLP 的方法,那么他又两种攻击 Elgamal 算法的方法。
-
通过 B 的¥ \(d\) 恢复 \(x\):
\[d = log_{\alpha}\beta \ mod \ p \]这个步骤解 DLP 问题,如果何理选择参数,那么这个计算将是不可能的。如果攻击者成功计算了这个内容,那么他可以像接收者那样解密出原文:
\[x \equiv y \cdot(k_E^d)^{-1} \ mod \ p \] -
另一个方法,不计算 B 的 \(d\),攻击者可以尝试恢复发送者 A 的随机指数 \(i\):
\[i = log_{\alpha}k \ mod \ p \]这个步骤需要求解离散对数问题,如果攻击者成功做到了,他可以计算原文:
\[x \equiv y \cdot (\beta^i)^{-1} \ mod \ p \]
主动攻击
像所有的非对称算法中,必须确保公钥是认证的。这意味着加密一方 A 所持有的公钥确实是属于 B 的。如果攻击者企图欺骗 A 他的公钥是 B 的,他可以轻松攻击这个算法。为了防止这个攻击,可以使用证书,这会在第 13 章讨论。
第二个弱点是,Elgamal 加密的中使用的指数 \(i\) 不能重复使用,假设 A 使重复在两条信息 \(x_1\) 与 \(x_2\) 中使用同一个值 \(i\),那么 \(k_M = \beta^i\) 是相同的,同样的,临时密钥也是相同的,这样就会在通道上发送两条 \((y_1,k_E)\) 与 \(y_1,k_E\) 信息,如果攻击者了解了这个情景,并知道第一条信息内容,或可以猜到第一条内容,他科技计算 \(k_M = y_1x_1^{-1} \ mod \ p\),并解密 \(x_2\):
另一个针对 Elgamal 的主动攻击是攻击它的可塑性,如果攻击者观测到 \((k_E,y)\),他可以替换为:
其中 \(s\) 为整数,接收者解密: