RSA实践

http://www.shiyanbar.com/ctf/1828
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d
将得到的d提交




解:
方法一:用工具工具 RSA-Tool 2 by tE!,
但是有人不会用哈哈,看来一篇用错了博客如图

得出结果278573880289078487不对,原因在于没有换好公钥进制工具默认是hex不是十进制
错图:
RSA实践_第1张图片

正确图已经附上答案:125631357777427553
正确图:

RSA实践_第2张图片

RSA实践_第3张图片


方法二:我用的是代码毕竟是菜几,用工具都是大牛。
但在用我之前的博客中RSA代码http://blog.csdn.net/dongyanwen6036/article/details/76582310
中得出的是125631357777427552
后来找到原因:
>>> 2135733082216268401/17
1.2563135777742755e+17
>>> int(2135733082216268401/17)
125631357777427552
>>> 125631357777427552*17
2135733082216268384
代码算法没有问题主要由于类型强制转化导致失去精度
http://blog.csdn.net/dongyanwen6036/article/details/76684642
Python中的除法
>>> divmod( 2135733082216268401,17)
(125631357777427553, 0)
最后代码改了如下:
#from __future__ import division
#---------------------------------------------------------------
#分解大整数
import math

#-------------------------------------
# 求欧拉函数f(n)
def getEuler(prime1, prime2):
    return (prime1-1)*(prime2-1)
#---------------------------------------------------------------------------------------
# 19d - 920071380k= 1
# 求私钥d
def getDkey(e, Eulervalue):#可以辗转相除法
	k = 1
	while True:
		if (((Eulervalue * k) + 1) % e) == 0:
			(d,m)=divmod(Eulervalue * k + 1,e)
			return d#避免科学计数法最后转int失去精度
		k += 1
#------------------------------------------------------
#求明文
def Ming(c,d,n):
	return pow(c,d,n)
#---------------------------------------------------------------------------------------
if __name__=='__main__':
	p=473398607161
	q=4511491
	d =getDkey(17, getEuler(p,q))
	print('私钥为: %d'%d)
	






	




你可能感兴趣的:(RSA实践)