前言:
建议看这篇随笔之前先看入门(8)数论基础,简单学习下,有利于你看懂后面得算法原理,链接给出:https://www.cnblogs.com/yuanchu/p/13494104.html
easy_RSA:
easyRSA属于一个让你去了解RSA算法得一个题,可能很多人都是通过工具解出来得,但我觉得学习是学习知识,工具是次要得,要探究问题本质:所以我们一起来了解下现代密码学RSA把,RSA属于非对称密钥加密,指的是公钥和私钥不一样,通过构建数学上得难题(因式分解)来进行增大解密难度
题目:在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17 求解出d
先了解一下该算法,下面贴链接:https://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95,这里我们先只讲公钥和私钥得产生,
我们需要求得是d,由之前推导得 引理可知道,e存在r得模逆元,当且仅当 gcd(e,r) = 1 我们可以简单得验证一下,给出python代码
1 import math 2 3 # 在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17 4 # 求解出d 5 6 p=473398607161 7 q=4511491 8 e=17 9 r=(p-1)*(q-1) 10 11 if math.gcd(e,r) == 1: 12 print('可以求出d')
结果是可以得(当然得可以不然没法算d,这里只是小小验证一下),d其实有很多个解,我们知道这题 ed mod r =1 那么只需要ed = kr +1 即可,k可以取任意整数值,然而d也为整数,所以只需要
(kr + 1) %e = 0 即可,此时 d = (kr +1) /e ,好了,既然我们思路有了就可以写代码了:
1 import math 2 3 # 在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17 4 # 求解出d 5 6 p=473398607161 7 q=4511491 8 e=17 9 r=(p-1)*(q-1) 10 11 def Euler_d(e,r,k): 12 k += 1 13 if math.gcd(e,r) == 1: 14 while True: 15 if (k*r + 1)%e == 0: 16 #直接用d=(k*r+1)/e会丢失精度 17 (d,_) = divmod((k*r +1),e) 18 break 19 else: 20 d ='不可以计算出d' 21 print(d) 22 return d 23 24 25 print(Euler_d(e,r,0)) 26
然后给出我们得结果:
1 125631357777427553
它就是最小得d得值了,然后提交就ok了
参考链接:
https://www.runoob.com/python/python-func-divmod.html