密碼學筆記 - Fermat's Factorization Method

(Updated: )
1 min read

有一個奇合數 nn ,是兩個奇質數的乘積 n=pqn = pq
a=p+q2,b=pq2a = \frac{p + q}{2}, b = \frac{p - q}{2} 那麼 n=(a+b)(ab)=a2b2n = (a + b)(a - b) = a^2 - b^2
但是今天我們不知道 p,qp, q ,而我們想要分解 nn
那我們就猜 a=na = \lceil \sqrt{n} \rceil ,測試 a2na^2 - n 是不是完全平方數
猜到的話可以從 a,ba, b 反推回 p,qp, q
沒猜到就把 aa 加一繼續猜

使用條件

pq|p-q| 很小,可以有效的分解合數 nn

Python 程式碼

import math
import gmpy2

def fermat(n):
    a = math.ceil(math.sqrt(n))
    b2 = a * a - n
    while not gmpy2.iroot(b2, 2)[1]:
        a = a + 1
        b2 = a * a - n
    b = math.sqrt(b2)
    return [a + b, a - b]

載入評論區...