zoukankan      html  css  js  c++  java
  • 证明与计算(2): 离散对数问题(Discrete logarithm Problem, DLP)

    本文链接,随时更新请不要转载以免过期:https://www.cnblogs.com/math/p/discrete-log.html

    离散对数问题,英文是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])。离散对数问题是定义在一个群上的,对于不同的群,难度不同。

    两个相对容易计算的例子是:

    • (R^*)(C^*)上关于乘法操作构成的群。
    • (Z/nZ)关于加法操作构成的群,也就是在这个群里(b^k)里的(b^k)实际上是k个b相加,此时问题变成 (kbequiv a(mod n))

    下面的情况则是难的离散对数问题(也就是经典的离散对数问题):

    • 取素数p,则(Z/pZ)关于乘法操作构成的群。

    0x02 经典离散对数问题的定义

    我们直接给出下面一组预备知识:

    • 欧拉函数(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)

    例如,对于n=7,(Z/7Z)是由(3^k)构成的循环群,阶数是(varphi(7)=7-1=6),下面的每步推导都用到了上一步的模等结果,其中3是模7的原根(Primitive root):

    怎样求出构成(Z/nZ)的循环群的原根呢?简单的方式,通过穷举n的质因子构成的每个循环群,例如对于(n=14=2 imes7^1)(符合2p^k形式):

    由于14的质因子是{1, 3, 5, 9, 11, 13},从而(varphi(14)=6)。从而,根据上面的枚举,3和5是14的两个原根。

    再看一个例子,取n=15,质因子是{1, 2, 4, 7, 8, 11, 13, 14},则(varphi(15)=8),但是

    15的每个质因子构成的循环群,阶数都不是(varphi(15)=8),从而15没有原根。

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

    • 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))是困难的。

    0x03 算法复杂度

    在厘清了离散对数问题的背景、难度以及我们关心的定义之后,我们实际看几个该问题的算法,并且具体考察算法的时间复杂度。通用的算法有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算法也被认为是最优的(可以找到和它复杂度一样的算法,但是没有更好的)。这里有个对O(p)的误解,密码学里算输入数据的大小的时候,不是算素数P的自然数大小,而是输入数据的Bit大小,如果P= 2^n ,那么素数p的离散对数问题对应的Bit复杂度大小是O( 2^x )

    算法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.5sqrt{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} )}),其中n是素数p的二进制长度,因为(p=2^n),所以(n=log(p)/log(2))。注意我们说多项式时间复杂度,是指复杂度是关于n的多项式,而不是关于p的。在加密算法里面,那些特别构造的椭圆曲线群里面,阶数是素数的群上目前并没有找到非通用的计算离散对数的算法。这意味着在素数阶循环群上的离散对数问题的时间复杂度至少是指数增长的。

    0x04 计算难度

    离散对数的计算有多“难”呢?我们知道在确定性图灵机上存在多项式时间复杂度算法的问题是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]),我们没必要把所有的分类都记住,只要知道决策问题的不同难度,构成了范围不同的集合,这些集合之间有对应的包含关系。

    0x05 注释:

    什么是群(Group)

    • 群:如果一个集合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的有限循环群。

    群(Group)有什么用?

    群(Group)这个数学概念是解决什么问题的呢?简单地说,在物理、化学、生物方面,无数的结构都是对称结构的,在对称结构上的操作往往就满足群的性质,因而群(Group)的作用至少有:

    • 通过把问题用群来建模,可以通过计算群的性质来解决对应的问题(参考[22])
      • 例如伽罗瓦([23,[24]])把代数方程求根问题转成群的问题
      • 例如(R^n)空间上正多边形(多面体)个数的问题,就是对应(R^n)上在旋转操作下的有限群个数。
      • 例如有不同个数的正多边形(多面体)能没有缝隙的填满不同定义下、不同维度的空间(参考[22]),它们刻画了这些空间的性质,于是那些不能直观绘制出来的空间,人们可以通过刻画这些空间上群的性质,来区分它们。
    • 还可以通过群可以利用集合在某个操作下的对称性,来大幅度减化问题。(参考:[21])
      • 例如经典的魔方方块群(Rubik's Cube group,参考[25])
      • 例如利用克莱因四元素群(Klein 4 Group,参考[26])来大幅度减化对孔明棋(Solitaire puzzles,参考:[28])的研究。

    而在密码学里,往往利用特定群上面操作的“单向”性:从一边计算过去很容易,反过来运算很难(一般是NP问题),从而来保证密码系统的安全,如果不是限定在特定群上,计算难度上的“单向”可能无法获得满足:

    • 例如椭圆曲线加密,就是建立在椭圆曲线上几何操作定义的有限素数群上的DLP问题,简称ECDLP(Elliptic Curve Discrete logarithm Problem)。

    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
    [21] Power Groups
    [22] Why is group theory important?
    [23] wiki:Évariste Galois
    [24] wiki-zh-cn:Évariste Galois
    [25] Rubik's Cube group
    [26] Klein 4 Group
    [27] Group Theory and Puzzles
    [28] wiki:Solitaire puzzles

    --end--

  • 相关阅读:
    剖析C语言中a=a+++++a的无聊问题
    [转]精确到1%秒的单片机计时器汇编程序
    [转]学DSP、FPGA、ARM,哪个更有前途?
    【Java】Eclipse导出JAR包
    二维码生成器(支持历史记录点击和清空)
    移动端开发注意之一二
    localStorage实现按钮点击禁用
    JavaScript之查找元素
    扒拉扒拉table
    解惑之JavaScript
  • 原文地址:https://www.cnblogs.com/math/p/discrete-log.html
Copyright © 2011-2022 走看看