CTF中的RSA算法(一)

    最近看c看的頭疼了O(≧口≦)O,所以先停下來緩一緩寫幾篇博客吧。
在講之前我們先來看一個著名網紅老師李永樂的視頻,瞭解一下RSA的一些基本知識,一遍不行看兩遍,兩遍不行看三遍,切記一定要看懂這個視頻,否則,下面寫的很有可能就看不懂了。雖說密碼學和數學相關性很大,但是一步一步的學並沒有那麼難,我的數學也不好,但是這並不妨礙我做這些密碼學的題目,我可以慢慢的學。記住千萬不要還沒開始就放棄了。
    視頻鏈接:https://www.bilibili.com/video/av26639065/

    基本介紹:
    RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。
    RSA加密算法是一種非對稱加密算法。
    對極大整數做因數分解的難度決定了RSA算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA算法愈可靠。 假如有人找到一種快速因數分解的算法的話,那麼用RSA加密的信息的可靠性就肯定會極度下降。但找到這樣的算法的可能性是非常小的。今天只有短的RSA鑰匙纔可能被強力方式解破。到目前爲止,世界上還沒有任何可靠的破解RSA算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息實際上是不能被解破的。
    公鑰與私鑰的產生:
(1)進行加密之前,首先找出2個不同的大質數p和q
(2)計算n=p*q
(3)根據歐拉函數,求得φ(n)=φ(p)φ(q)=(p−1)(q−1)
(4)找出一個公鑰e,e要滿足: 1<e<φ(n) 的整數,且使e和φ(N)互質。。
(5)根據e*d除以φ(n)餘數爲1,找到私鑰d。
於是: 公鑰就是(n,e) 私鑰就是(n,d)

加密==> m^e除以n求餘數即爲c(密文)
00
解密==> c^d除以n求餘數即爲m(明文)
01
既然知道了原理,是不是就應該做一道題練練身了呢
02
題目:按照RSA算法,若選取兩奇數p=5,q=3,公鑰e=7,則私鑰d爲多少?(不要直接偷看答案解析哈)
A.6    B.7    C.8    D.9

解析:由p=5,q=3,e=7,可知n=p*q=15; φ(n)=(p−1)(q−1)=8
      由ed除以φ(n)餘數爲1得,7d=1(mod 8)
      mod運算(取餘)應該大部分人都會吧,不會的話可以去百度一下。
enn......如果說上面的題目你已經自己做出來了,或者看懂答案解析了,說明你悟性還是挺高的哈。
那下面這道題目呢? O(∩_∩)O~
題目來自:Jarvis OJ - Basic - VeryEasyRSA()
04
03
    呀( ⊙ o ⊙ )!數好大,怎麼搞,這是手要報廢的節奏啊O(≧口≦)O。
    enn......怎麼可能那麼難啊,看看題目名---VeryEasyRSA,所以吧,我們就要上我們的工具了--python。俗話說的好”工慾善其事必先利其器“。
    下面是RSA中常用到的模塊安裝,經過我的多次嘗試,終於找到了不走彎路的安裝方法,這裏用的是python2,因爲python3的模塊安裝時會存在各種各樣的問題,甚至那個模塊python3還沒有,python2安裝時錯誤會少一點,而且做rsa的題目時我還沒見過哪個大佬用python3,清一色的python2。

  前提條件:基於linux環境安裝,確保安裝了wget,gcc,make軟件,會基本的linux命令。
  一共需要安裝6個模塊(不要隨便更改下載鏈接中的模塊版本,我不保證更改後的模塊版本適合下面源碼安裝的編譯選項,enn當時我就在這個坑裏跳了好久纔出來。)

  1. 檢查是否安裝了M4模塊
        命令行命令: man m4
        如果沒有安裝,就先安裝一下,網上大部分資料寫的都是使用源碼寫的方式安裝,但是可能是編譯軟件版本的問題,進行m4源碼安裝時總是安裝失敗,這就是第一個坑,最後竟然可以直接使用apt-get命令安裝,太狠了這個:apt-get install m4
  2. 安裝GMP模塊
    wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.bz2
    tar -xf gmp-6.1.2.tar.bz2 

    cd 進入解壓後的文件夾

    ./configure --prefix=$HOME/static --enable-static --disable-shared --with-pic

    執行完成之後再執行

    make && make check && make install
  3. 安裝MPFR模塊(解壓,進入目錄什麼的的命令下面就不寫了,和(2)中一樣。)
    wget https://www.mpfr.org/mpfr-current/mpfr-4.0.2.tar.bz2 
    ./configure --prefix=$HOME/static --enable-static --disable-shared --with-pic --with-gmp=$HOME/static
    make && make check && make install
  4. 安裝MPC模塊
    wget https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
    ./configure --prefix=$HOME/static --enable-static --disable-shared --with-pic --with-gmp=$HOME/static --with-mpfr=$HOME/static
    make && make check && make install
  5. 安裝gmpy2模塊
    git clone https://github.com/aleaxit/gmpy.git
    sudo python setup.py build_ext --static=$HOME/static install
  6. 安裝libnum模塊
    git clone https://github.com/hellman/libnum
    sudo python setup.py install 

        好了,到這裏常用的RSA解密的模塊都裝的差不多了。回到上面的那個題目,我們看看怎麼個VeryEasyRSA法。
        解題腳本:

#!/usr/bin/python
#coding:utf-8
#@Author:醉清風

import gmpy2
p = 3487583947589437589237958723892346254777
q = 8767867843568934765983476584376578389
e = 65537
phi = (p-1)*(q-1)       #φ(n)在寫的時候多用phi代替,因爲鍵盤不好敲出來。
d = gmpy2.invert(e,phi) #e模phi的逆爲d, (e*d)%phi==1 原理上面講過
print d

或者

#!/usr/bin/python
#coding:utf-8
#@Author:醉清風

import libnum
p = 3487583947589437589237958723892346254777
q = 8767867843568934765983476584376578389
e = 65537
phi = (p-1)*(q-1)
d = libnum.invmod(e,phi) #e模phi的逆爲d,(e*d)%phi==1 
print d

    上面的兩種解法只是調用的模塊不同,但計算效果是一樣的,後面的題目中也會經常使用這些模塊,具體想用哪個模塊看自己的心情就好。
    現在才只是個開始,後面的更有意思,未完待續......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章