离散对数问题(深入浅出密码学笔记)
定义
基于 Z p ∗ \mathbb{Z}_p^* Zp∗的 D L P DLP DLP:
给定一个阶为p-1的有限循环群 Z p ∗ \mathbb{Z}_p^* Zp∗,一个本元原 α ∈ Z p ∗ \alpha \in \mathbb{Z}_p^* α∈Zp∗和另一个元素 β ∈ Z p ∗ \beta \in \mathbb{Z}_p^* β∈Zp∗。DLP是确定满足一下条件的整数 x x x(其中 1 ≤ x ≤ p − 1 1 \leq x \leq p-1 1≤x≤p−1)的问题:
α x ≡ β m o d p \alpha^x \equiv \beta \mod p αx≡βmodp
(类似于RSA中 m e ≡ c m o d n m^e \equiv c \mod n me≡cmodn,不过这里的p是素数)
推广的离散对数问题
给定一个基为 n n n的有限循环群 G G G,群操作为o。考虑一个本元原 α ∈ G \alpha \in G α∈G和另一个本元原 β ∈ G \beta \in G β∈G,则离散对数问题为:找到一个在 1 ≤ x ≤ n 1 \leq x \leq n 1≤x≤n内的整数x,满足 β = α o α o α o α o … o α ⏟ x 次 = α x \beta = \underbrace{\alpha o \alpha o \alpha o \alpha o…o \alpha}_{x次} = \alpha^x β=x次 αoαoαoαo…oα=αx
通用算法
蛮力搜索
对求 l o g α β log_α β logαβ的值可爆破x使得αx=β
大步小步算法
Shank’s Baby-step Giant-step方法,一个时间-内存平衡方法,是对爆破进行了简单改进。时间复杂度为O(√m)
x= l o g α β log_α β logαβ,令 x = x g ∗ m + x b x=x_g*m+x_b x=xg∗m+xb,其中 0 ≤ x g , x b < m 0≤x_g,x_b<m 0≤xg,xb<m。
β = α x = α x g m + x b β=α^x = α^{x_gm+x_b} β=αx=αxgm+xb所以 β ∗ ( α − m ) x g = α x b β*(α^{-m})^{x_g}=α^{x_b} β∗(α−m)xg=αxb
对于 β ∗ ( α − m ) x g = α x b β*(α^{-m})^{x_g}=α^{x_b} β∗(α−m)xg=αxb,我们预计算出右侧所有的可能取值,在固定一个m,计算出左边可能的值,当发现某个值在右边出现过,这时的 x g m + x b x_gm+x_b xgm+xb就是我们要求的m。
x b x_b xb可能的取值有 ψ ( q ) m o d m ψ(q) \mod m ψ(q)modm个, x g x_g xg可能的取值有 ψ ( q ) / m ψ(q)/m ψ(q)/m向下取整个,所以m取 √ ψ ( q ) √ψ(q) √ψ(q)向上取整是最好的,但是为了避免计算欧拉函数,我们直接取√q向上取整,不难验证,此时取 x g , x b ∈ [ 1 , m ] x_g,x_b∈[1,m] xg,xb∈[1,m]可以保证把x∈[1,q-1]全部枚举一遍,时间复杂度为O(√m)
首先是Baby-step阶段,计算并存储所有 α x b α^{x_b} αxb值,其中 0 ≤ x b < m 0≤x_b<m 0≤xb<m,它需要m≈√q个群元素。
然后是Giant-step阶段,检查 0 ≤ x g < m 0≤x_g<m 0≤xg<m范围内所有的 x g x_g xg,并判断baby-step阶段的已存储的项 α x b α^{x_b} αxb是否满足: β ∗ ( α − m ) x g = α x b β*(α^{-m})^{x_g}=α^{x_b} β∗(α−m)xg=αxb。
Pollard’s Rho方法
期望运行时间与大步小步算法一样,但是此方法对空间的需求量小。
此方法基于生日悖论的概率算法。基本思想是伪随机地生成
α
i
α^i
αi,
β
i
β^i
βi形式的群元素,并记录每个元素对应的i和j,不断重复这个过程,直到两个元素出现冲突为止,即,知道
α
i
1
β
i
1
=
α
i
2
β
i
2
α^{i_1}β^{i_1}=α^{i_2}β^{i_2}
αi1βi1=αi2βi2
如果用
β
=
α
x
β=α^x
β=αx进行交换,并比较该等式两边的指数,则此冲突将得到关系
i
1
+
x
∗
j
1
=
i
2
+
x
∗
j
2
m
o
d
q
i_1+x*j_1=i_2+x*j_2 \mod q
i1+x∗j1=i2+x∗j2modq,即
x
≡
(
i
2
−
i
1
)
/
(
j
1
−
j
2
)
m
o
d
q
x≡(i_2-i_1)/(j_1-j_2) \mod q
x≡(i2−i1)/(j1−j2)modq
Pohlig-Hellam算法
基于中国剩余定理,通常不是单独使用
假设 q = p 1 e 1 × p 2 e 2 × … … × p l e l q=p_1^{e_1} ×p_2^{e_2}×……×p_l^{e_l} q=p1e1×p2e2×……×plel是群的阶q的质因式分解。对 x = l o g α β x=log_α β x=logαβ,计算阶为 p i e i p_i^{e_i} piei的子群里较小的离散对数 x i = x m o d p i e i x_i=x \mod p_i^{e_i} xi=xmodpiei。而最终需要的离散对数x可以使用中国剩余定理从所有的 x i ( i = 1 , 2 , . . . , l ) x_i(i=1,2,...,l) xi(i=1,2,...,l)中计算得到。
每一个单独的小型的 D L P x i DLP x_i DLPxi都可以使用Pollard’s Rho方法或者Baby-step Giant-step算法计算得到。
非通用算法
Index-Calculus算法
依赖于q内的大部分元素都可以实现高效地表示为q的小型子集中元素的乘积。
群 Z p ∗ 与 G F ( 2 m ) ∗ Z_p^*与GF(2^m)^* Zp∗与GF(2m)∗中的元素都满足此属性,但目前未发现椭圆曲线群有此属性。