前言:

  建议看这篇随笔之前先看入门(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

 

 posted on 2020-08-13 18:00  缘初  阅读(1139)  评论(0编辑  收藏  举报