RSA题的做法基本就是 搞清楚已知量未知量 分析可不可解
做了一道题
题目给了
n 二进制下1024位 格式为十六进制
e 65537
c 密文 二进制下1024位 格式为十六进制
显然n这么大不可能直接分解
我们需要
私钥d 然后套解密公式
m=c^d mod n
题目给了服务器并声明
input: d
output: e
输入小素数3,5,7
返回十进制的数大概200多位
输入65537:返回不告诉你
很显然只要输入一个d 返回65537就好了
就好了。。。
但这个d显然很大
枚举不可能
我们手头上 已知n e d
e?随便一个值比如3
d?服务器返回的值
e*d=1 (mod (p-1)(q-1))
百度攻击方式!
RSA攻击—-已知公钥n,e私钥d
原理没整明白
挺厉害的
def gcd(a,b):
if b==0:
return a
else :
return gcd(b,a%b)
def getpq(n,e,d):
p = 1
q = 1
while p==1 and q==1:
k = d * e - 1
g = random.randint ( 0 , n )
while p==1 and q==1 and k % 2 == 0:
k /= 2
y = pow(g,k,n)
if y!=1 and gcd(y-1,n)>1:
p = gcd(y-1,n)
q = n/p
return p,q
//结果可能为负
//最后print 可以 print x%s,y%s python取模的特性
def ext_gcd(a, b):
if b == 0:
return 1, 0
else:
k = a // b
remainder = a % b
x1, y1 = ext_gcd(b, remainder)
x, y = y1, x1 - k * y1
return x, y
已知p,q一切就简单了
用扩展欧几里得把d求出来
套一遍公式即可
c = (int)("0x004252980300",16)
16进制to 10
print pow(c,d,n)
c^d%n