首先大概介绍下RSA加密解密

公钥n = p * q,其中p和q是两个大素数

e是随机选择的数,作为公钥

d是跟e有关的一个数,满足条件式:ed=1(mod phi(n))

phi(n)是欧拉函数,phi(n)=(p-1)(q-1)


加密过程:设明文为m,密文为c

c = m^e(mod n)

解密过程:

m=c^d (mod n)


RSA密钥体制中,n和e作为公钥,是都可以得到的值;d作为私钥,是私人拥有的

要破解RSA,最常用的方法是大素数分解,即:找到p和q,使得n=p*q成立


根据下面这个链接:

http://www.di-mgt.com.au/rsa_factorize_n.html


我们在已知私钥d的情况下,可以计算出n的两个素数p和q

思路在链接里有,下面贴出python代码


import random

def gcd(a, b):
   if a < b:
     a, b = b, a
   while b != 0:
     temp = a % b
     a = b
     b = temp
   return a

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

def main():
	'''
	n = 
	e = 
	d = 
	'''
	p,q = getpq(n,e,d)
	print hex(p),hex(q)

if __name__ == '__main__':
	main()

'''
ex1:
n=25777,e=3,d=16971
p=149,q=173

ex2:
n = 0xa66791dc6988168de7ab77419bb7fb0c001c62710270075142942e19a8d8c51d053b3e3782a1de5dc5af4ebe99468170114a1dfe67cdc9a9af55d655620bbab
e = 0x10001
d = 0x123c5b61ba36edb1d3679904199a89ea80c09b9122e1400c09adcf7784676d01d23356a7d44d6bd8bd50e94bfc723fa87d8862b75177691c11d757692df8881
p = 0x335e8408866b0fd38dc7002d3f972c67389a65d5d8306566d5c4f2a5aa52628b
q = 0x33d48445c859e52340de704bcdda065fbb4058d740bd1d67d29e9c146c11cf61
'''