密碼學筆記 - Pollard's p - 1 Algorithm

2 min read

有一個合數 nn,有一個質因數 pp Pollard's p - 1 algorithm 可以在 p1p-1 的最大質因數很小的情況下,有效的分解合數 nn 可以用在分解 RSA 產生的公鑰 nn,以此破解 RSA,常見於一些 CTF 的題目中

根據費馬小定理 當 aa 不是 pp 的倍數 ap11(modp)ak(p1)1(modp)ak(p1)10(modp)a^{p-1} \equiv 1 \pmod{p} \to a^{k(p-1)} \equiv 1 \pmod{p} \to a^{k(p-1)} - 1 \equiv 0 \pmod{p} for some kk 所以 gcd(ak(p1)1,n)gcd(a^{k(p-1)} - 1, n) 一定會是 pp 的倍數

Pollard's p - 1 algorithm 就是嘗試去構造出 k(p1)k(p-1) ,並且令 a=2a = 2 ( 只要 p2p \ne 2 上面的推論就是對的 ) 也就是測試 gcd(211,n),gcd(21×21,n),gcd(21×2×31,n),...gcd(2^{1} - 1, n), gcd(2^{1 \times 2} - 1, n), gcd(2^{1 \times 2 \times 3} - 1, n), ...1×2×31 \times 2 \times 3 \cdotsp1p-1 的倍數,我們就成功分解 nn

使用條件

p1p-1 最大的質因數很小,可以有效的分解合數 nn

程式碼 ( python )

import math

def pollard(n):
    a, b = 2, 2
    while True:
        a, b = pow(a, b, n), b + 1
        d = math.gcd(a - 1, n)
        if 1 < d < n:
            return d