离散对数问题笔记

离散对数问题(深入浅出密码学笔记)

定义

基于 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 1xp1)的问题:
α 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 mecmodn,不过这里的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 1xn内的整数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αooα=α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=xgm+xb,其中 0 ≤ x g , x b < m 0≤x_g,x_b<m 0xg,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 0xb<m,它需要m≈√q个群元素。

然后是Giant-step阶段,检查 0 ≤ x g < m 0≤x_g<m 0xg<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+xj1=i2+xj2modq,即 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(i2i1)/(j1j2)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)^* ZpGF(2m)中的元素都满足此属性,但目前未发现椭圆曲线群有此属性。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值