Crypto入門 (九) easy_RSA
阿新 • • 發佈:2020-08-13
前言:
建議看這篇隨筆之前先看入門(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 7q=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了