证明与计算(2): Discrete logarithm

上一篇:证明与计算(1): D, L, P and NP
下一篇:证明与计算(3): Binary Decision Diagram(BDD)

离散对数问题,英文是Discrete logarithm Problem,有时候简写为Discrete log,该问题是十几个开放数学问题(Open Problems in Mathematics, [0.a], [0.b])中的一个。为什么要从离散对数问题说起?因为后面的内容中会反复使用到,因此我们希望用独立的一节分析来消除理解上的不确定性。

0x01 背景

对数\(\log_{b}(a)\)是由John Napier发明(1614)的符号([1],[2.a],[2.b]),选择不同的基底,就有不同的对数,例如:

  • 以10为底数的对数是\(\log_{10}(x)\),也叫做常用对数(Common logarithm [5]),常用对数是由Henry Briggs([3])在Napier之后提出的,因此也叫Briggs对数。
  • 以自然对数(Natural logarithm [6])e为底数的对数是\(\log_{e}(x)\),也记做\(\ln(x)\)
  • 以2为底数的二进制对数(Binary logarithm [7])是\(\log_{2}(x)\),也记做\(lb(x)\)

对数\(x=\log_{b}(a)\)等价于\(b^x=a\),给定一个已知的实数x,计算\(b^x\)是容易的,但是反之给定a和b,计算对数\(x=\log_{b}(a)\)则是难的。William Oughtred([4.a])在Napier之后发明了滑尺(Slide rule,[4.b])计算常用对数的方法。在电子计算机出现之前,计算对数依赖于Briggs首先计算的常用对数表(1616)。在电子计算机出现之前,数学上的很多难的计算都依赖于某种数学表,例如把计算乘法转换成计算加减以及查表([8])。显然查表求值也只是一种限定精度的近似值,计算自然对数和二进制对数,可以通过自然对数和二进制对数与常用对数之间的转换公式来进行:
\[ \log_{10} = \frac{\ln(x)}{\ln(10)}, \log_{10} = \frac{lb(x)}{lb(10)} \]

如果给定整数k,b,则计算\(b^k=a\)是容易的。但是,反过来知道整数a,要精确计算出整数\(k=log_{b}(a)\)则是难的,只有少数一些特殊的情况下有办法计算(例如,计算\(9=\log_{3}3^9\)是容易的),没有有效的通用的算法做此类计算(Baby-step giant-step, [18])。如果整数k,a,b使得\(b^k=a\)。则此时\(k=log_{b}(a)\)称为离散对数(Discrete logarithm, [9])。

0x02 难度

离散对数的计算有多“难”呢?我们知道在确定性图灵机上存在多项式时间复杂度算法的问题是P(Polynomial)问题;而另一类问题,它的解(Solution)能被确定性图灵机上在多项式时间复杂度内验证,它的解能被非确定性图灵机计算出来,称为NP问题([10])。另一方面P和NP问题,都是属于决策问题(Decision Problem),它们等价于对应的形式语言的集合,参考上一篇的内容。显然有,\(P \subseteq NP\)。NP语言里最难的那组问题互相等价,统称为NP-complete(NPC)问题。

资料[10]里面提到,如果P!=NP,那么Discrete logarithm被认为是介于P和NP-complete(NPC)之间的NP问题,也称为NP-intermediate问题。

It was shown by Ladner that if P ≠ NP then there exist prlblems in NP that are neither in P nor NP-complete.[1] Such prlblems are called NP-intermediate prlblems. The graph isomorphism prlblem, the discrete logarithm prlblem and the integer factorization prlblem are examples of prlblems believed to be NP-intermediate. They are some of the very few NP prlblems not known to be in P or to be NP-complete.

这充分说明了离散对数问题符合了两个重要的特征:

  • 如果已经知道k,则计算\(b^k\)是容易的。
  • 如果知道a,则计算\(k=\log_{b}(a)\)是难的,有多难呢?在P!=NP的情况下,被认为是介于P和NPC之间的NP-intermediate难度。实际上,在资料[11]里,更具体的指出Discrete logarithm问题应该属于NP、Co-NP、BQP三个集合的交集问题。

索引[12]定义了Co-NP问题,它是由NP问题的补问题(i.e 将NP问题中的答案yes/no对换)的集合:

A decision prlblem X is a melber of co-NP if and only if its complement X is in the complexity class NP.

索引[13]定义了BQP问题,它是量子计算机下可以在多项式时间计算出来的决策问题的集合。

BQP (bounded-error quantum polynomial time) is the class of decision prlblems solvlble by a quantum computer in polynomial time, with an error prlblbility of at most 1/3 for all instances.

不同难度的问题细分下去属于计算复杂性理论(Computational complexity theory, [14]),我们没必要把所有的分类都记住,只要知道决策问题的不同难度,构成了范围不同的集合,这些集合之间有对应的包含关系。

0x03 定义

在尝试了几个不同的方式之后,我们决定直接给出下面一组预备知识:

  • 欧拉函数\(\varphi(n)\)表示1到n之间和n互素的整数的个数([15.d]),特别是对于素数p来说,\(\varphi(p)=p-1\)
  • 小于n且与n互素的集合是G={1,....,\(P_{\varphi(n)}\)},例如当n=7,G={1,2,3,4,5,6}。
  • 集合{… , a − 2n, a − n, a, a + n, a + 2n, …}构成了a对n的同余类(Congruence class, [15.c])
  • G的元素对n的同余类全体构成了一个新的集合M,把M记做:\(Z/nZ\)
  • \(Z/nZ\)是一个阿贝尓群,直接从阿贝尓群的四个性质入手证明。
  • \(Z/nZ\)是一个循环群,当且仅当n=1,2,4,\(p^k\)或者\(2p^k\)(k>0)

有了这些准备,给出密码学里使用的离散对数的定义:

  • p是一个素数,\(Z/pZ\)构成了一个循环群,生成元是g。
  • 任意取一个整数k,\(g^k\)属于\(Z/pZ\),计算\(a=g^k(mod\ p)\),容易知道a也属于\(Z/pZ\)
  • 反之,已知a,要计算\(k=log_{g}(a)\),称之为离散对数问题。

根据上面的难度讨论,显然:

  • 计算\(a=g^k\)是容易的。
  • 计算\(k=log_{g}(a)\)是困难的,难度是NP-intermediate。

0x04 算法

在厘清了离散对数问题的背景、难度以及我们关心的定义之后,我们实际看几个该问题的算法,并且具体考察算法的时间复杂度。通用的算法有Trial multiplication算法,Baby-step Giant-step算法,以及Index Calculus Method算法([18.b], [20])。本节我们只给出Trial multiplication算法和Baby-step Giant-step算法用以达到理解具体的算法及其时间复杂度的目的。

首先,离散对数问题的计算没有有效的通用算法,一种朴素的计算方式叫做Trial multiplication([18.b],[18.c]),简单说就是暴力破解(brute-force),把所有的可能值都算出来比对。

算法2.1: Trial multiplication。给定素数p导出的有限循环群{\(g^0\),\(g^1\),...,\(g^{q}\)},已知\(a=g^k(mod\ p)\),求k。


  1. 计算\(g^2(mod\ p)\),\(g^3(mod\ p)\),...
  2. 如果\(g^k(mod\ p)=a\),结束。
  3. 时间复杂度是p/2

其次,在暴力破解的基础上还有很多其他的算法,例如Baby-step Giant-step算法([18.a], [18.b])加速了Trial multiplication算法,Baby-step Giant-step算法也被认为是最优的(可以找到和它复杂度一样的算法,但是没有更好的)。

算法2.2: Baby-step Giant-step。给定素数p导出的有限循环群{\(g^0\),\(g^1\),...,\(g^q\)},已知\(a=g^k(mod\ p)\),求k。


  1. \(m=\sqrt{p-1}\),令\(k=im+j\),其中i, j \(\in\) {0,1,...,m-1}.
  2. 由于\(a=g^k(mod\ p)=g^{im+j}(mod\ p)\), 从而\(g^j(mod\ p)=ag^{-im}(mod\ p)\).
  3. 遍历所有可能的i,j,找到符合\(g^j(mod\ p)=ag^{-im}(mod\ p)\),则有\(k=im+j\).
  4. 如何计算?
    • Giant steps:对所有i\(\in\){1,2,...,m-1},计算\(ag^{-im}(mod\ p)\),保存到表格。
    • Baby steps:查表,并对所有j\(\in\){1,2,...,m-1},计算\(g^j(mod\ p)\),直到符合条件。
    • 时间复杂度: \(\sqrt{p}\)个步骤计算表格,\(\sqrt{p}/2\)个步骤寻找j,一共是\(1.5\sqrt{p}\)个步骤。

暴力破解的时间复杂度是O(p),而Baby-step Giant-step的时间复杂度是O(\(\sqrt{p})\)。实际上,在计算离散对数问题的通用算法中,Baby-step, Giant-step算法是最优的([20])。如果限定在\(Z/pZ\)上,则最好的算法是general number field sieve([20])算法,时间复杂度可以达到\(2^{O(n^{1/3}\ \ (log\ (n))^{2/3}\ \ )}\),其中\(|p|=O(n)\)。注意我们说多项式时间复杂度,是指复杂度是关于n的多项式,而不是关于p的。在加密算法里面,那些特别构造的椭圆曲线群里面,阶数是素数的群上目前并没有找到非通用的计算离散对数的算法。这意味着在素数阶循环群上的离散对数问题的时间复杂度至少是指数增长的。

0x05 注释:

  • 群:如果一个集合G的元素在某个操作·下满足下面几个代数性质,那么集合G构成了一个群(Group, [15.a]):
    • 封闭性(Closure): G中的任意两个元素a,以及操作·,有a·b也属于G
    • 结合性(Associativity):G中的三个元素a,b,c,以及操作·,有(a·b)·c = a·(b·c)
    • 单位元(Identity):如果存在e,使得G中任何元素a,有e·a=a·e=a
    • 逆元(Inverse):G中任意元素a,存在元素b,使得a·b=b·a=e
  • 阿贝尔群:如果一个集合G构成了一个群,并且还满足交换性质,则G构成了一个阿贝尔群(Abelian group, [15.b])
    • 可交换(Commutativity):G中任意元素a,b,有a·b=b·a
  • 有限循环群:如果一个群G={\(g^0,g^1,...g^k,...g^n\)},则G是由g生成的阶(order)为n的有限循环群。

0x06 参考

[0.a]: Open Problems in Mathematics(OPM)
[0.b]: OPM:The Discrete Logarithm Problem
[1]: History of logarithms
[2.a]: John Napier
[2.b]: Napierian logarithm
[3]: Henry Briggs
[4.a] William Oughtred
[4.b] Slide rule
[4.c]: Logarithm
[5]: Common logarithm
[6]: Natural logarithm
[7]: Binary logarithm
[8]:Quarter square multiplication
[9]: Discrete logarithm
[10]: P versus NP prlblem
[11]:How hard is fiding the discrete logarithm
[12]:Co-NP
[13]:BQP (bounded-error quantum polynomial time)
[14]: Computational complexity theory
[15.a]:Group
[15.b]: Abelian group
[15.c]:Congruence class
[15.d]:Euler's totient function
[16]: Multiplicative group of integers modulo n
[17] wolfram: Discrete Logarithm
[18.a] Baby-step giant-step
[18.b] Trial multiplication, Baby-step giant-step, Index calculus
[18.c] Trial multiplication is not optimal but...
[18.d] Baby-Step Giant-Step Algorithms for the Symmetric Group
[19] Solving Discrete Logarithms in Smooth-Order Groups with CUDA
[20] Algorithms for Computing Discrete Logarithms

--end--

posted @ 2018-07-28 20:09 ffl 阅读(...) 评论(...) 编辑 收藏