給我一對公鑰和私鑰,我就能破解此RSA
阿新 • • 發佈:2017-11-25
logs 計算 mar == while clas 需要 最終 最大公約數
RSA密碼系統如果暴露了一套公鑰和私鑰,那麽這套密碼系統就全部失效了。因為根據公鑰和私鑰可以完成大整數的分解、暴露了兩個質數。
記公鑰為e,私鑰為d,因為ed%phi=1,所以就得到了一個k=ed-1,它是phi的整數倍。
隨機選擇一個2~n之間的整數x,當x的k次冪模n等於1並且k為偶數時,k/=2。
最終求x^k-1和n的最大公約數,此值即為兩個質數中的一個。
至於如何證明,我天資愚鈍,不需要強行明白此理。
"""
在RSA中,給我一對公鑰和私鑰,我就可以完成n的大整數分解
RSA過程:
* 先求出兩個大質數p,q
* 計算n=pq和phi=(p-1)(q-1)
* 找一個公鑰e(e必須和phi互質才行),根據ed%phi=1找出d來
* 加密時:y=x^e%n
* 解密時:y=x^d%n
"""
def gcd(x, y):
return x if y == 0 else gcd(y, x % y)
def pow(a, x, n):
#模冪乘法
ans = 1
for i in range(x):
ans = (ans * a) % n
return ans
def extend_gcd(x,n):
#擴展歐幾裏得法:求x關於n的逆元
if n==0:return 1,0,x
b,a,d=extend_gcd(n,x%n)
b-=x//n*a
return a,b,d
p, q = 7, 13
n = p * q
phi = (p - 1) * (q - 1)
e=7
d=extend_gcd(e,phi)[0]
k = e*d-1 #已知e,d,求p,q
def test(a):
x = k
while pow(a, x, n) % n == 1 and x % 2 == 0: x //= 2
print(gcd(pow(a, x, n) - 1, n), a, x)
import random
for i in range(2, n):
test(random.randint(2, n))#使用隨機產生的2~n之間的整數來測試
給我一對公鑰和私鑰,我就能破解此RSA