许多公钥密码系统都依赖于离散对数计算十分困难的特性,离散对数越难计算,那么密码系统就越安全。离散对数的安全性跟它所基于的群关系非常大,通常来说群的阶越高,计算离散对数越困难。但是除了阶的大小,群本身的结构也会影响离散对数的安全性。

为了安全性,离散对数通常定义在模 乘法群 上,其中 为质数。针对离散对数密码系统的攻击,表示找到一种高效的算法,求解 使其满足 ,其中 的生成元,。本文我们讲解的攻击方法都基于这个群。

暴力破解法

穷举 1 到 ,直到找到一个数使 成立。由于 ,因此这种算法的复杂度为

看起来 是一个可以接受的复杂度,但是在密码学中 一般会取一个很大的数字,因此我们一般用 的二进制位数来衡量复杂度,假如 个二进制位,那么复杂度为 ,这就是一个指数级的复杂度了。因此暴力破解法是个很低效的办法。对于大于 100 位的数就已经很难解了,对于大于上千位的数,暴力破解法消耗的时间甚至超过了太阳的寿命,因此认为不可解。

大步小步法

大步小步法(Baby-Step Giant-Step)是对暴力破解法的一个改进,是算法如下:

  1. 计算
  2. 假设 ,其中
  3. 因此有 ,有
  4. 对于在 范围内的每个 ,计算 ,并且存储起来。
  5. 计算 的值。
  6. 循环,计算 ,每计算一次,就查找第 4 步中有没有相等的 。如果找到,则退出循环,离散对数的解为

该算法的时间复杂度和空间复杂度为,也即 。虽然比暴力算法快很多,但是当 足够大时,该算法也不可解。

算法中对 循环一次相当于走了一小步,对 循环一次相当于一大步,大步小步法因此而得名。

Pohlig-Hellman 算法

前面两种算法对群的阶没有要求,适用于任何群,但是效率不高,对于阶太大的群不适用。密码学家 Pohlig 与 Hellman 在 1978 年发明一种算法,可以用于破解群的阶为光滑数的离散对数,这个算法以两位作者的名字命名为 Pohlig-Hellman 算法

在理解这个算法之前,先要理解什么是光滑数(Smooth Integer)。

光滑数

在数论中,如果一个数的所有质因数都小于等于 B,就称这个数为B-光滑数(B-Smooth Integer)。例如 ,因此 是一个 7-光滑数。

需要注意的是,一个数被称作是B-光滑数,并不需要 B 是这个数的质因数,只需要 B 大于或等于这个数的每一个质因数就行。例如上面的 15750 也可以被叫做 8-光滑数、9-光滑数、11-光滑数,等等。

算法思想

设群 的阶为 ,根据群的性质可知 ,设其质因数分解为如下形式:

对如下等式:

我们将两边同时求 次幂得到:

交换一下右边的指数得到:

,则有:

因为 的阶为 ,所以上述等式是在一个 阶的子群上求离散对数,满足等式的解都模 同余,设其中一个解为 ,则解可以表示为:

对于 的每个 都做如上操作,可以得到如下方程组:

利用中国剩余定理,可以求得满足上诉线性方程组的解,方程组的每个解都模所有 的乘积同余,也即模 同余,设其某一个解为 ,则通解可以表示如下:

通过这种方式我们就求得了 的解。

在求解 时可以利用大步小步法,时间复杂度为 ,但是如果 太大,算法效率还是不够高。

好在对于阶为一个质数的幂的情况,有一个效率很高的算法。为了简化符号,令 。将 进制展开:

其中任意 满足 。只要想办法求出每个 ,我们就可以得到

其中 。当 时,令

由此我们可以看到 满足一个递推的关系:

下面我们对 次幂:

最终我们得到如下等式

其中 的阶为 。因此通过上述等式求 相当于在一个 阶的群上求解离散对数,利用大步小步法,其时间复杂度为 。求出所有 的复杂度为 ,这比之前的复杂度 要好太多。另外由于计算 涉及到升幂操作,可以利用逐次平方,其复杂度为

对于 的每个因子 都用上诉算法求解,最终 Pohlig-Hellman 的算法复杂度为

从这个复杂度可以看出,只要 的阶是一个 B 足够小的 B-光滑数,使用 Pohlig-Hellman 算法求解离散对数问题将会变得非常简单。

防范针对离散对数的攻击

要使离散对数是安全的,首先要保证 的阶足够大。其次,根据 Pohlig-Hellman 算法, 的阶还需要至少有一个很大的质因数,也就是在上面的描述中, 中至少有一个数非常大。从群论的角度讲, 需要有一个阶非常大的子群。

的阶为 ,假设它有一个非常大的质因数 ,设 为一个整数,且根据质数的性质, 一定为偶数,这样 可以表示为 。在设计离散对数的时候,需要精心挑选 ,计算 ,使得 落入阶为 的子群中。这样根据 ,求离散对数 才会很困难。有时候为了方便,我们选择的生成元 甚至不是 的生成元,而是 阶子群的生成元。

安全质数

对于 这种形式的质数,当 时,称为安全质数(Safe Prime),也就是质数 可以写成 的形式,其中 也为质数, 也被称为Sophie Germain 质数(Sophie Germain prime)

使用安全质数的群 ,其子群结构非常简单,其子群的阶只可能为:、或者 ,其中 实际上为 本身的阶。 阶子群的生成元只有一个,就是 ,因为 。因此,只要随机从 选一个数,其要么是 阶子群的生成元,要么是 阶子群的生成元。在实际工程应用中,通常选择 作为生成元,这会使计算 变得很简单。求解离散对数将会是在 阶子群或者 阶子群上求解,如果是在 阶子群上求解,攻击者最多只能知道 的值,能泄露的信息非常少,不足以求解离散对数。

因此使用非常大的安全质数(通常大于1024比特位)将会使离散对数变得十分安全。

参考文献
[1] Baby-step giant-step: https://en.wikipedia.org/wiki/Baby-step_giant-step
[2] An Improved Algorithm for Computing Logarithms over GP(p) and Its Cryptographic Significance: https://ee.stanford.edu/~hellman/publications/28.pdf
[3] Smooth number: https://en.wikipedia.org/wiki/Smooth_number
[4] The Pohlig-Hellman Algorithm: http://anh.cs.luc.edu/331/notes/PohligHellmanp_k2p.pdf
[5] Safe and Sophie Germain primes: https://en.wikipedia.org/wiki/Safe_and_Sophie_Germain_primes
[6] How to Backdoor Diffie-Hellman: https://eprint.iacr.org/2016/644.pdf