1. 程式人生 > 實用技巧 >Crypto入門 (九) easy_RSA

Crypto入門 (九) easy_RSA

前言:

  建議看這篇隨筆之前先看入門(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