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 背后是 \(Z_p^*\) 的指数(\(p\) 是质数)是一个单向函数。指数是可交换的。

\[k = (a^x)^y \equiv (a^y)^x \ mod \ p \]

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

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

Diffie-Hellman 配置

  1. 选择一个大质数 \(p\)
  2. 选择一个整数 \(\alpha \in \{2,3,...,p-2\}\)
  3. 发布 \(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 \equiv (\alpha^b)^a \equiv \alpha^{ab} \ mod \ p \\ \]

B 计算得到

\[A^b \equiv (\alpha^a)^b \equiv \alpha^{ab} \ mod \ p \]

这样 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\),群具有下面的特性:

  1. 群操作 \(\circ\) 是闭合的,既对所有的 \(a,b\in G\),满足 \(a \circ b = c \in G\)
  2. 群操作 \(\circ\) 满足结合律,既 \(a\circ (b \circ c) = (a \circ b)\circ c;a,b,c\in G\)
  3. 具有元素 \(e\in G\),称为零元素,满足 \(a\circ e = e\circ a = a,a\in G\)
  4. 对于 \(a\in G\) 存在 \(a^{-1} \in G\) 称作 \(a\) 的逆,满足 \(a \circ a^{-1} = a^{-1}\circ a = 1\)
  5. 如果 \(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\) ,满足:

\[a^k = a\circ a \circ a ... \circ a = 1 \]

其中 \(1\) 为群 \(G\) 的零元素。

例 8.5 在群 \(Z_{11}^*\) 中,我们可以尝试元素 \(a = 3\) 的阶,我们可以穷举直到得到零元素 1

\[a^1 = 3 \\ a^2 = a\cdot a = 3 \cdot 3 = 9 \\ a^3 = a^2\cdot a = 9 \cdot 3 = 27 \equiv 5 \ mod \ 11 \\ a^4 = a^3\cdot a = 5\cdot 3 = 15 \equiv 4 \ mod \ 11 \\ a^5 = a^4\cdot a = 4 \cdot 3 = 12 \equiv 1 \ mod \ 11 \]

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

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

\[a^6 = a^5 \cdot a \equiv 1 \cdot a \equiv 3 \ mod \ 11 \\ a^7 = a^5 \cdot a^2 \equiv 1 \cdot a^2 \equiv 9 \ mod \ 11 \\ a^8 = a^5 \cdot a^3 \equiv 1 \cdot a^3 \equiv 5 \ mod \ 11 \\ a^9 = a^5 \cdot a^4 \equiv 1 \cdot a^4 \equiv 4 \ mod \ 11 \\ a^{10} = a^5\cdot a^5 \equiv 1 \cdot 1 \equiv 1 \ mod \ 11 \\ a^{11} = a^10 \cdot a \equiv 1 \cdot a \equiv 3 \ mod \ 11 \\ \]

定义 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 \\ a^2 = 4 \\ a^3 = 8 \\ a^4 \equiv 5 \ mod \ 11 \\ a^5 \equiv 10 \ mod \ 11 \\ a^6 \equiv 9 \ mod \ 11 \\ a^7 \equiv 7 \ mod \ 11 \\ a^8 \equiv 3 \ mod \ 11 \\ a^9 \equiv 6 \ mod \ 11 \\ a^{10} \equiv 1 \ mod \ 11 \\ \]

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

循环群具有有趣的特性。

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

定理 8.2.2 对于每一个质数 \(p\)\((Z_p^*,\cdot)\) 是阿贝尔有限循环群

定理 8.2.3 \(G\) 是一个有限群,那么对于每一个 \(a \in G\) 必然满足:

  1. \(a^{|G|} = 1\)
  2. \(ord(a)\) 能够整除 \(|G|\)

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

\[ord(1) = 1,ord(2) = 10,ord(3) = 5,ord(4) = 5,ord(5) = 5 \\ ord(6) = 10,ord(7) = 10,ord(8) = 10,ord(9) = 5,ord(10) = 2 \]

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

  1. \(G\) 的原始元素的数量是 \(\Phi(|G|)\)
  2. \(|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\),可以计算

\[\beta = \alpha^{n/k} = 8^{10/2} = 8^5 = 32768 \equiv 10 \ mod \ 11 \]

我们现在可以验证元素 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\) 有:

\[\alpha^x \equiv \beta \ mod \ p \]

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

\[x = log_{\alpha}\beta \ mod \ p \]

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

例 8.11 我们考虑 \(Z_{47}^*\) 中的离散对数,其中 \(\alpha = 5\) 是其中的原始元素,对于 \(\beta = 41\),离散对数问题是:找到正整数 \(x\) 有:

\[5^x \equiv 41 \ mod \ 47 \]

就算是小的数值,确定 \(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\),有:

\[2^x \equiv 36 \ mod \ 47 \]

使用暴力破解,我们得到解为 \(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\),有:

\[\beta = a^x \]

\(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\) 有:

\[x\cdot 2 = 2 + 2 + ... + 2 \equiv 3 \ mod \ 11 \]

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

\[x\cdot 2 \equiv 3 \ mod \ 11 \]

为求解 \(x\),可以简单对 \(\alpha\) 求逆:

\[x \equiv 2^{-1}3 \ mod \ 11 \]

使用扩展欧几里得算法,我们可以计算 \(2^{-1} \equiv 6 \ mod \ 11\),从而有:

\[x \equiv 2^{-1}3 \equiv 7 \ mod \ 11 \]

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

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

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

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

8.3.3 对离散对数的攻击

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

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

\[\beta = \alpha^x \]

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

暴力搜索

简单穷举所有的指数,直到得到结果 \(\beta\)

\[\alpha^1 \ ?= \beta \\ \alpha^2 \ ?= \beta \\ ... \\ \alpha^x \ ?= \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\) 重写为两个数值表示:

\[x = x_g m + x_b \quad 0 \leq x_g,x_b < m \]

\(m = \sqrt{|G|}\) 现在,可重新表示为 \(\beta = \alpha^x = \alpha^{x_gm+x_b}\) 可以得到:

\[\beta\cdot(\alpha^{-m})^{x_g} = \alpha^{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\),查看下面的等式是否满足:

\[\beta\cdot(\alpha^{-m})^{x_g} = \alpha^{x_b} \]

如果满足这个等式,那么对于满足等式的参数对 \(x_{g,b},x_{b,0}\),有:

\[x = x_{g,0}m + 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\),直到我们获得两个元素满足:

\[\alpha^{i_1}\cdot \beta^{j_1} = \alpha^{i_2}\cdot\beta^{j_2} \]

如果我们替换 \(\beta = \alpha^x\) 并比较等式两侧的等式,会得出 \(i_1 + xj_1 \equiv i_2 + xj_2 \ mod \ |G|\) (我们在循环群中),这里,离散对数算法可以简单计算为:

\[x\equiv (i_2 - i_1)/(j_1 - j_2) \ mod \ |G| \]

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

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

\[|G| = p_1^{e_1}\cdot p_2^{e_2}\cdot ... \cdot p_l^{e_l} \]

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

非一般化算法:指数-对数算法(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}\)

  1. 通过求解离散对数问题 \(a \equiv log_{\alpha}A \ mod \ p\),计算私钥 \(a = k{pr,A}\)
  2. 计算会话密钥 \(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 加密协议

  1. 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
  2. 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
  3. 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\)

\[d_{k_{pr}}(k_E,y) \equiv y \cdot (k_M)^{-1} \ mod \ p \\ \equiv [x\cdot k_M]\cdot (k_E^d)^{-1} \ mod \ p \\ \equiv [x\cdot (\alpha^d)^i][(\alpha^i)^d]^{-1} \ mod \ p \\ \equiv x\cdot \alpha^{d\cdot i - d\cdot i} \equiv x \ mod \ p \]

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

  1. B 生成质数 \(p = 29\),以及 \(\alpha = 2\),选择 \(k_{pr,B} = d = 12\) 计算 \(\beta = \alpha^d = 7 \ mod \ 29\),并将 \(k_{pub,B} = (p,\alpha,\beta)\) 给到 A
  2. 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
  3. 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^{p-1} \equiv 1 \ mod \ p \]

对于所有的 \(k_E \in Z_p^*\),我们可以将两个步骤组合:

\[k_M^{-1} \equiv (k_E^d)^{-1} \ mod \ p \\ \equiv (k_E^d)^{-1}k_E^{p-1} \ mod \ p \\ \equiv k_E^{p - d - 1}\ mod \ 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\)

\[x_2 \equiv y_2k_M^{-1} \ mod \ p \]

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

\[(k_E,sy) \]

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

\[d_{k_{pr}}(k_E,sy) \equiv sy \cdot k_M^{-1} \ mod \ p \\ \equiv s(x\cdot k_M)\cdot k_M^{-1} \ mod \ p \\ \equiv sx \ mod \ p \]

posted @ 2023-03-31 23:42  ArvinDu  阅读(188)  评论(0编辑  收藏  举报