RSA破解
解題鏈接: http://ctf5.shiyanbar.com/crypto/RSA
1.點擊鏈接得到一個壓縮包。點擊開里面有兩個文件,分別是flag.enc和public.pem這兩個文件。
首先我們會想到openssl。
openssl:是一個安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。
一般做RSA 的題只需用到兩個命令到時候我們在詳細說明。
2.打開kali(kali里的openssl可以直接使用,但windows下的需要花錢。)
進入終端,輸入openssl進入openssl狀態。
輸入這個命令rsa -pubin -text -modulus -in public.pem(public.pem 是你自己的文件名)讀取N 和E。
我們看到了N=A41006DEFD378B7395B4E2EB1EC9BF56A61CD9C3B5A0A73528521EEB2FB817A7
E=65537
我們首先將N轉換成10進制,在這里我使用了python的進制轉換函數 int(x,16)。將16進制轉換成10進制。
於是我們得到了N=74207624142945242263057035287110983967646020057307828709587969646701361764263
3.分解N得出P和Q以便求出私鑰D
在這里介紹兩種方法。(當然我也只會這兩種,本人純小白一枚,python都不太會寫)
第一種:http://factordb.com/這個網站。輸入N基本會分解出P和Q。
第二種:軟件yafu:用於自動整數因式分解,在RSA中,當p、q的取值差異過大或過於相近的時候,使用yafu可以快速的把n值分解出p、q值,原理是使用Fermat方法與Pollard rho方法
首先打開cmd,進入yafu所在路徑,輸入yafu-64的命令,進入yafu工作階段。輸入factor(74207624142945242263057035287110983967646020057307828709587969646701361764263)點擊回車會出現
這樣我們就得到了P=258631601377848992211685134376492365269
Q=286924040788547268861394901519826758027
4.求出D
可在這里我通過工具求出了D 但無法在openssl中進行解開密文。因為題中所給的密文是flag.enc我們正常沒有辦法打開。而用openssl對其進行解密需要按其格式來的密鑰,即pem后綴。當然腦洞不小的我,嘗試將D放入txt文件中,在進行改文件名。但在openssl中無法使用。我又查了各種enc后綴結尾文件的打開命令,但沒有搜到什么。於是找了一下,發現可以用pythonq來寫生成可用的私鑰。
於是我們來寫吧。(之前說過不會python,所以代碼借鑒於http://blog.csdn.net/dongyanwen6036/article/details/76900001。)
import math import sys from Crypto.PublicKey import RSA arsa=RSA.generate(1024) arsa.p=258631601377848992211685134376492365269 arsa.q=286924040788547268861394901519826758027 arsa.e=65537 arsa.n=arsa.p*arsa.q Fn=long((arsa.p-1)*(arsa.q-1)) #此處原理e*d=Fn*i+1 i=1 while(True): x=(Fn*i)+1 if(x%arsa.e==0): arsa.d=x/arsa.e break i=i+1 private=open('private.pem','w') private.write(arsa.exportKey()) private.close()
在kali里運行會在home里發現生成的private.pem文件。至此我們找到了D
5.解密
在kali終端輸入openssl進入openssl
輸入rsautl -decrypt -in flag.enc(密文名稱) -inkey private.pem(我們所求得密鑰名稱)
看這樣我們就得到明文了!
是不是很開心!
注:本人純屬小白,為了自己更好的理解,和掌握知識。不喜勿噴。