因数分解——Pollard' p-1 & Pollard rho

分解因子

Pollard’s p-1 算法

Base concepts

  • 对于一个想要分解因子的整数 n
  • 如果我们可以找到一个与 n 不互质的整数 s ,则可直接通过求 g c d ( s , n ) gcd(s,n) gcd(s,n) 求得 n 的一个因子
  • 这样的 s s s 如何得到?
  • 考虑到如下事实:
    • 若 p 为 n 的一个素因子
      • p未知,希望构造出一个含有因子 p 的数 s,则可通过求 g c d ( s , n ) gcd(s,n) gcd(s,n)求得 n 的因子
    • x ≡ 1 ( m o d p )    ⟹    p ∣ g c d ( x − 1 , n ) x \equiv 1 \pmod p \implies p | gcd(x-1,n) x1(modp)pgcd(x1,n)
    • 如何在只知道 n 的有限条件下得到这样的 x?
      • 考虑 Fermat 小定理,必有 2 p − 1 ≡ 1 ( m o d p ) 2^{p-1}\equiv 1\pmod p 2p11(modp)
      • 但 p 未知!
      • 考虑构造一个 ( p − 1 ) (p-1) (p1)的倍数
        • 假定对每一个素数幂 q ∣ ( p − 1 ) q|(p-1) q(p1), 有 q ≤ B q\leq B qB
        • 则可得到 ( p − 1 ) (p-1) (p1)的一个倍数 B ! B! B!
      • 于是, x ≡ 2 B ! ( m o d n ) x\equiv 2^{B!}\pmod n x2B!(modn)
      • 由于 p ∣ n p|n pn,有 x ≡ 2 B ! ≡ 1 ( m o d p ) x\equiv 2^{B!}\equiv 1\pmod p x2B!1(modp)
        • 依据:Fermat 小定理, ( p − 1 ) ∣ B ! (p-1)|B! (p1)B!
  • s = x − 1 s=x-1 s=x1
  • d = g c d ( s , n ) d=gcd(s,n) d=gcd(s,n)即为 n n n的一个非平凡因子(除非s=0)

Algorithm

Inputs #1: n: a composite number
Inputs #2: B: a smoothness bound
Outputs: a nontrivial factor of n n n or failure

Pollard p-1 Factoring Algorithm(n,B):
   a ← 2 B ! ( m o d n ) a\leftarrow 2^{B!}\pmod n a2B!(modn)
   d ← g c d ( a − 1 , n ) d\leftarrow gcd(a-1,n) dgcd(a1,n)
  if 1 < d < n 1<d<n 1<d<n then return d
  else return failure

Pollard ρ \rho ρ 算法

Base concepts

  • 同样是希望找到一个 s, 然后通过求 g c d ( s , n ) gcd(s,n) gcd(s,n)来求得因子
  • 但 s 的求法不同
    • 有如下事实:设 p 为 n 的最小素因子,假定存在2个整数 x , x ′ ∈ Z , x,x'\in \mathbb{Z}, x,xZ,使得 x ≠ x ′ x\neq x' x̸=x x ≡ x ′ ( m o d p ) x\equiv x'\pmod p xx(modp)
      p ≤ g c d ( x − x ′ , n ) < n p\leq gcd(x-x',n)<n pgcd(xx,n)<n,即为所需因子
    • s 的获取关键在于 x , x ′ x,x' x,x的选取
  • x , x ′ x,x' x,x的选取?
    • 假定通过先选择一个随机子集 X ∈ Z n X\in \mathbb{Z}_n XZn来分解n,然后对其中所有不同的 x , x ′ x,x' x,x计算 g c d ( x − x ′ , n ) gcd(x-x',n) gcd(xx,n),这个方法能成功当且仅当映射 x ↦ s m o d    p x\mapsto s \mod p xsmodp对于 x ∈ X x\in X xX得到至少一个碰撞
      • 根据生日悖论,如果 ∣ X ∣ ≈ 1.17 p |X|\approx 1.17\sqrt p X1.17p ,那么至少存在一个碰撞的概率为50%
      • 但由于 p 未知,不能显示计算 x m o d    p x \mod p xmodp,这意味着在找到 n 的一个因子前,需要计算超过 ( ∣ x ∣ 2 ) > p 2 \binom{|x|}{2}>\frac{p}{2} (2x)>2p次gcd
  • Pollard ρ \rho ρ 算法如何对这一技巧进行了优化
    • 考虑一种“类似”随机映射 x ↦ f ( x ) m o d    n x\mapsto f(x)\mod n xf(x)modn,其中 f f f为一个具有整数系数的多项式
      • 例如 f ( x ) = x 2 + a f(x)=x^2+a f(x)=x2+a, 通常取 a = 1 a=1 a=1
    • x 1 → Z n x_1\rightarrow \mathbb{Z}_n x1Zn,可得到序列 x 1 , x 2 , . . . ( x i + 1 = f ( x i ) m o d    n ) x_1,x_2,...\quad\quad (x_{i+1}=f(x_i)\mod n) x1,x2,...(xi+1=f(xi)modn)
    • 在此序列中寻找 x i , x j x_i,x_j xi,xj使得 g c d ( x j − x i , n ) > 1 gcd(x_j-x_i,n)>1 gcd(xjxi,n)>1
      • 每次计算序列中的一个新项 x j x_j xj,要对所有 i < j i<j i<j计算 g c d ( x j − x i , n ) gcd(x_j-x_i,n) gcd(xjxi,n)
    • 然而,gcd计算次数可以大大减少
      • 有如下事实: x i ≡ x j ( m o d p )    ⟹    f ( x i ) ≡ f ( x j ) ( m o d p )    ⟹    x i + 1 ≡ x j + 1 ( m o d p ) x_i\equiv x_j\pmod p \implies f(x_i)\equiv f(x_j)\pmod p\implies x_{i+1}\equiv x_{j+1}\pmod p xixj(modp)f(xi)f(xj)(modp)xi+1xj+1(modp)
    • 于是,如果 ( x i , x j ) (x_i,x_j) (xi,xj)关于 p 同余,则 ( x i + 1 , x j + 1 ) , ( x i + 2 , x j + 2 ) , ( x i + 3 , x j + 3 ) ⋯ (x_{i+1},x_{j+1}),(x_{i+2},x_{j+2}),(x_{i+3},x_{j+3})\cdots (xi+1,xj+1),(xi+2,xj+2),(xi+3,xj+3)均关于 p 同余
    • 为了简化和改进算法,通过取 j = 2 i j=2i j=2i来寻找碰撞
      • 因为不一定要找出这种类型的第一个碰撞
  • 事实上,序列一定会从某处进入循环,因为 p 是一个有限数
  • 用顶点集 Z p \mathbb{Z}_p Zp构造一个图 G,从点 x i m o d    p x_i \mod p ximodp向点 x i + 1 m o d    p x_{i+1} \mod p xi+1modp做一条有向边,可知 G 看起来像希腊字母 ρ \rho ρ
    • “尾巴”: x 1 m o d    p → x 2 m o d    p → ⋯ → x i m o d    p x_1\mod p\to x_2\mod p\to \cdots\to x_i\mod p x1modpx2modpximodp
    • “环”: x i m o d    p → x i + 1 m o d    p → ⋯ → x j m o d    p = x i m o d    p x_i\mod p\to x_{i+1}\mod p\to \cdots\to x_j \mod p=x_i\mod p ximodpxi+1modpxjmodp=ximodp

Algorithm

Input #1: n: a composite number
Input #2: x 1 x_1 x1: the starting number
Output: a nontrivial factor of n n n or failure

Pollard ρ \rho ρ Factoring Algorithm(n, x 1 x_1 x1)
external f f f
x ← x 1 ;    x ′ ← f ( x ) m o d    n ;    d = g c d ( x − x ′ , n ) x\leftarrow x_1;\;x'\leftarrow f(x)\mod n;\;d=gcd(x-x',n) xx1;xf(x)modn;d=gcd(xx,n)
while p = 1 p=1 p=1:
   x ← f ( x ) m o d    n x\leftarrow f(x)\mod n xf(x)modn
   x ′ ← f ( x ′ ) m o d    n ;    x ′ ← f ( x ′ ) m o d    n x'\leftarrow f(x')\mod n;\;x'\leftarrow f(x')\mod n xf(x)modn;xf(x)modn
   d ← g c d ( x − x ′ , n ) d\leftarrow gcd(x-x',n) dgcd(xx,n)
if d=n then return failure
else return d

你可能感兴趣的:(密码学,笔记)