Pollard rho 算法求解离散对数问题

Pollard ρ \rho ρ 算法求解离散对数问题

离散对数(DLP)问题:设有群 ( G , ⋅ ) (G,\cdot) (G,) α ∈ G \alpha \in G αG是一个 n n n阶元素。给定 β ∈ < α > \beta \in \left< \alpha \right> βα,找到指数 c , 0 ≤ c ≤ n − 1 c,0\le c\le n-1 c0cn1,满足
α c = β \alpha ^{c} =\beta αc=β前面分享过因子分解的Pollard ρ \rho ρ 算法(为了更好地理解Pollard ρ \rho ρ 离散对数算法,建议读者先看Pollard ρ \rho ρ 因子分解算法),也分享过求解离散对数问题的小步大步算法Pohlig-Hellman算法
Pollard ρ \rho ρ 算法是启发式的算法,不是确定性的数学证明算法,它可能得到较好的解,也可能会失败,这取决于攻击者选取的初始参数。

算法思想

类似Pollard ρ \rho ρ 因子分解算法。为了求解出 c = log ⁡ α β c=\log_{\alpha}\beta c=logαβ,直接求是困难的,我们希望构造出一个关于 c c c的一次同余方程,通过解方程间接得到 c c c。Pollard ρ \rho ρ的因子分解算法是寻找一个碰撞 x = x ′ x=x' x=x,所以这里也想找一个碰撞。

准备工作

  1. S 1 ∪ S 2 ∪ S 3 S_{1} \cup S_{2}\cup S_{3} S1S2S3是群 G G G的一个划分,它们元素个数大致相同。

  2. 定义函数 f : < α > × Z n × Z n → < α > × Z n × Z n f:\left< \alpha \right> \times \mathbb{Z}_{n} \times \mathbb{Z}_{n} \rarr \left< \alpha \right> \times \mathbb{Z}_{n} \times \mathbb{Z}_{n} f:α×Zn×Znα×Zn×Zn如下
    在这里插入图片描述
    并且要求构造的三元组 ( x , a , b ) (x,a,b) (x,a,b)满足 x = α a β b x=\alpha^{a}\beta^{b} x=αaβb,比如 ( 1 , 0 , 0 ) (1,0,0) (1,0,0)可以看出如果 ( x , a , b ) (x,a,b) (x,a,b)满足这个性质,则 f ( x , a , b ) f(x,a,b) f(x,a,b)也满足这个性质


  3. 在这里插入图片描述

算法核心

计算三元组 ( x i , a i , b i ) (x_{i},a_{i},b_{i}) (xi,ai,bi) ( x 2 i , a 2 i , b 2 i ) (x_{2i},a_{2i},b_{2i}) (x2i,a2i,b2i),直到发现 x 2 i = x i , i ≥ 1 x_{2i}=x_{i},i\ge 1 x2i=xii1。此时有
α a i β b i = α a 2 i β b 2 i \alpha^{a_{i}}\beta^{b_{i}}=\alpha^{a_{2i}}\beta^{b_{2i}} αaiβbi=αa2iβb2i因为 β = α c \beta = \alpha ^{c} β=αc,所以有
α a i + c b i = α a 2 i + c b 2 i \alpha^{a_{i}+cb_{i}}=\alpha^{a_{2i}+cb_{2i}} αai+cbi=αa2i+cb2i因为 α \alpha α的阶是 n n n,所以有
a i + c b i ≡ a 2 i + c b 2 i ( m o d n ) a_{i}+cb_{i} \equiv a_{2i}+cb_{2i} \pmod{n} ai+cbia2i+cb2i(modn) c ( b 2 i − b i ) ≡ a i − a 2 i ( m o d n ) c(b_{2i}-b_{i}) \equiv a_{i} - a_{2i} \pmod{n} c(b2ibi)aia2i(modn)如果 g c d ( n , b 2 i − b i ) = 1 gcd(n,b_{2i}-b_{i}) = 1 gcd(n,b2ibi)=1,则可以解出
c = ( a i − a 2 i ) ( b 2 i − b i ) − 1 m o d    n c=(a_{i} - a_{2i})(b_{2i}-b_{i})^{-1}\mod{n} c=(aia2i)(b2ibi)1modn如果 g c d ( n , b 2 i − b i ) ≠ 1 gcd(n,b_{2i}-b_{i}) \ne 1 gcd(n,b2ibi)=1,可以利用扩展的 g c d gcd gcd解一次线性同余方程

例子

问题:群 G = Z 809 ∗ G=\mathbb{Z}_{809}^{*} G=Z809 α = 89 \alpha = 89 α=89 β = 618 \beta = 618 β=618 α \alpha α的阶 n = 101 n=101 n=101。下面计算 log ⁡ α β \log_{\alpha}\beta logαβ

  1. G G G做划分:
    S 1 = { x ∈ Z 809 ∗ : x ≡ 1 ( m o d 3 ) } S 2 = { x ∈ Z 809 ∗ : x ≡ 0 ( m o d 3 ) } S 3 = { x ∈ Z 809 ∗ : x ≡ 2 ( m o d 3 ) } S_{1} = \lbrace x\in \mathbb{Z}_{809}^{*}:x\equiv 1\pmod{3} \rbrace \\ S_{2} = \lbrace x\in \mathbb{Z}_{809}^{*}:x\equiv 0\pmod{3} \rbrace \\ S_{3} = \lbrace x\in \mathbb{Z}_{809}^{*}:x\equiv 2\pmod{3} \rbrace S1={xZ809:x1(mod3)}S2={xZ809:x0(mod3)}S3={xZ809:x2(mod3)}

  2. i = 1 , 2 , ⋯ i=1,2,\cdots i=1,2,,计算三元组 ( x i , a i , b i ) (x_{i},a_{i},b_{i}) (xi,ai,bi) ( x 2 i , a 2 i , b 2 i ) (x_{2i},a_{2i},b_{2i}) (x2i,a2i,b2i),有

i i i ( x i , a i , b i ) (x_{i},a_{i},b_{i}) (xi,ai,bi) ( x 2 i , a 2 i , b 2 i ) (x_{2i},a_{2i},b_{2i}) (x2i,a2i,b2i)
1 ( 618 , 0 , 1 ) (618,0,1) (618,0,1) ( 76 , 0 , 2 ) (76,0,2) (76,0,2)
2 ( 76 , 0 , 2 ) (76,0,2) (76,0,2) ( 113 , 0 , 4 ) (113,0,4) (113,0,4)
3 ( 46 , 0 , 3 ) (46,0,3) (46,0,3) ( 488 , 1 , 5 ) (488,1,5) (488,1,5)
4 ( 113 , 0 , 4 ) (113,0,4) (113,0,4) ( 605 , 4 , 10 ) (605,4,10) (605,4,10)
5 ( 349 , 1 , 4 ) (349,1,4) (349,1,4) ( 422 , 5 , 11 ) (422,5,11) (422,5,11)
6 ( 488 , 1 , 5 ) (488,1,5) (488,1,5) ( 683 , 7 , 11 ) (683,7,11) (683,7,11)
7 ( 555 , 2 , 5 ) (555,2,5) (555,2,5) ( 451 , 8 , 12 ) (451,8,12) (451,8,12)
8 ( 605 , 4 , 10 ) (605,4,10) (605,4,10) ( 344 , 9 , 13 ) (344,9,13) (344,9,13)
9 ( 451 , 5 , 10 ) (451,5,10) (451,5,10) ( 112 , 11 , 13 ) (112,11,13) (112,11,13)
10 ( 422 , 5 , 11 ) (422,5,11) (422,5,11) ( 422 , 11 , 15 ) (422,11,15) (422,11,15)

可以发现, x 10 = x 20 x_{10} = x_{20} x10=x20
3. 解方程 c = ( 5 − 11 ) ( 15 − 11 ) − 1 m o d    101 = 49 c=(5-11)(15-11)^{-1}\mod{101}=49 c=(511)(1511)1mod101=49。所以z在 Z 809 ∗ \mathbb{Z}_{809}^{*} Z809 log ⁡ 89 618 = 49 \log_{89}618=49 log89618=49

注意事项

  1. 在划分群 G G G时,必须保证 1 ∉ S 2 1\notin S_{2} 1/S2,否则根据 f f f的定义,对 ∀ i ≥ 0 \forall i \ge 0 i0,都有 ( x i , a i , b i ) = ( 1 , 0 , 0 ) (x_{i},a_{i},b_{i})=(1,0,0) (xi,ai,bi)=(1,0,0)
  2. 如果初始参数设置合理,在 n n n阶循环群情况下算法复杂度为 O ( n ) O(\sqrt{n}) O(n )

参考书籍:Stinson D , 斯廷森, 冯登国. 密码学原理与实践[M]. 电子工业出版社, 2009.

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
好的,以下是使用 Python 语言实现 Pollard Rho 算法进行因式分解的代码: ```python import random def gcd(a, b): while b != 0: a, b = b, a % b return a def pollard_rho(n): x = random.randint(1, n-1) y = x c = random.randint(1, n-1) d = 1 while d == 1: x = (x ** 2 + c) % n y = (y ** 2 + c) % n y = (y ** 2 + c) % n d = gcd(abs(x - y), n) if d == n: return pollard_rho(n) return d def factorize(n): factors = [] while n > 1: factor = pollard_rho(n) factors.append(factor) n //= factor return factors n = 1234567890 factors = factorize(n) print(factors) ``` 在这个代码中,我们使用了 Pollard Rho 算法进行因式分解。首先,我们定义了一个辗转相除法的函数 gcd(a, b),用于求两个数的最大公约数。然后,我们定义了一个 pollard_rho(n) 函数,该函数接受一个正整数 n 作为参数,并返回 n 的一个因子。该函数通过随机选择 x 和 c,然后使用 f(x) = x^2 + c 的迭代公式来产生一个序列 x_0, x_1, x_2, ...,并使用 Floyd 算法来寻找序列中的循环节,最后找到两个序列中的相同元素并计算它们的差的绝对值和 n 的最大公约数,如果这个最大公约数不是 1 或 n,则表示我们已经找到了 n 的一个因子。如果这个最大公约数是 1 或 n,则需要重新选取 x 和 c,进行迭代。最后,我们定义了一个 factorize(n) 函数,该函数接受一个正整数 n 作为参数,并返回 n 的所有因子,该函数通过重复调用 pollard_rho(n) 函数来实现。最后,我们测试了这个函数,并输出了 n 的所有因子。 希望这个代码对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值