a = k b + p a = kb + p a=kb+p
a m o d b = p a mod b =p amodb=p
c ≡ m e m o d n c \equiv m^emodn c≡memodn m ≡ c d m o d n m\equiv c^dmodn m≡cdmodn ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \phi(n)=(p-1)\times(q-1) ϕ(n)=(p−1)×(q−1) d × e ≡ 1 m o d ϕ ( n ) d\times e \equiv1mod\phi (n) d×e≡1modϕ(n)
d p ≡ d m o d ( p − 1 ) dp\equiv d mod(p-1) dp≡dmod(p−1)
将该公式变形:
d p ≡ d m o d ( p − 1 ) dp\equiv d mod(p-1) dp≡dmod(p−1) ⇒ \Rightarrow ⇒ d p × e dp \times e dp×e ≡ \equiv ≡ d × e m o d ( p − 1 ) d \times e mod (p-1) d×emod(p−1) ⇒ \Rightarrow ⇒ d × e ≡ k × ( p − 1 ) + d p × e d \times e \equiv k \times (p-1) + dp \times e d×e≡k×(p−1)+dp×e
变形后的公式与下式结合
d × e ≡ 1 m o d ϕ ( n ) d\times e \equiv1mod\phi (n) d×e≡1modϕ(n)
因为:
ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \phi(n)=(p-1)\times(q-1) ϕ(n)=(p−1)×(q−1)
所以我们可以进行变形:
⇒ \Rightarrow ⇒ d × e ≡ 1 m o d ( p − 1 ) × ( q − 1 ) d\times e \equiv1mod(p-1) \times (q-1) d×e≡1mod(p−1)×(q−1)
得到:
k × ( p − 1 ) + d p × e = 1 m o d ϕ ( n ) k \times (p-1) + dp \times e=1mod\phi (n) k×(p−1)+dp×e=1modϕ(n)
再次变形:
k 1 × ( p − 1 ) + d p × e = 1 m o d ( p − 1 ) × ( q − 1 ) k_1 \times (p-1) + dp \times e =1mod (p-1)\times(q-1) k1×(p−1)+dp×e=1mod(p−1)×(q−1)
结合:
k 1 × ( p − 1 ) + d p × e = k 2 × ( p − 1 ) × ( q − 1 ) + 1 k_1 \times (p-1) + dp \times e = k_2 \times (p-1) \times (q-1) +1 k1×(p−1)+dp×e=k2×(p−1)×(q−1)+1
⇒ \Rightarrow ⇒ d p × e dp \times e dp×e= [ k 2 × ( p − 1 ) × ( q − 1 ) + 1 ] − [ k 1 × ( p − 1 ) ] [k_2 \times (p-1) \times (q-1) +1] - [k_1 \times (p-1)] [k2×(p−1)×(q−1)+1]−[k1×(p−1)]
⇒ \Rightarrow ⇒ d p × e dp \times e dp×e= [ k 2 × ( q − 1 ) − k 1 ] × ( p − 1 ) + 1 [k_2 \times (q-1) - k_1] \times (p-1) +1 [k2×(q−1)−k1]×(p−1)+1
设 : X = k 2 × ( q − 1 ) − k 1 设:X = k_2 \times (q-1) - k_1 设:X=k2×(q−1)−k1
⇒ \Rightarrow ⇒ d p × e = dp \times e= dp×e= X × ( p − 1 ) + 1 X \times (p-1) +1 X×(p−1)+1
⇒ \Rightarrow ⇒ d p < p − 1 dp < p-1 dp<p−1 ⇒ \Rightarrow ⇒ X < e X < e X<e ⇒ \Rightarrow ⇒ X ∈ ( 0 , e ) X \in (0,e) X∈(0,e)
遍历 X X X(65537种可能),求出 ( p − 1 ) (p-1) (p−1),得到 p p p且能被 n n n整除;接下来就是常规RSA的解法
for i in range(1,65538): if (dp*e-1)%i == 0: if n%(((dp*e-1)/i)+1)==0: p=((dp*e-1)/i)+1 q=n/(((dp*e-1)/i)+1) phi = (p-1)*(q-1) d = gmpy2.invert(e,phi)%phi