要講逆向,那麼確定少不了密碼學,由於全部的逆向(攻防)都是對已加密的數據進行解密。因此咱們必須初步瞭解加密的方式有哪些,畢竟知己知彼,才能百戰百勝。算法
接下來,我將從如下四方面來說述密碼學相關的內容:
一、什麼是密碼學
二、RSA數學原理
三、RSA終端命令
四、總結vim
密碼學的歷史大體能夠追溯到兩千年前,相傳古羅馬名將凱撒大帝爲了防止敵方截獲情報,用密碼傳送情報。凱撒的作法很簡單,就是對二十幾個羅馬字母創建一張對應表。這樣,若是不知道密碼本,即便截獲一段信息也看不懂。安全
從凱撒大帝時代到上世紀70年代這段很長的時間裏,密碼學的發展很是的緩慢,由於設計者基本上靠經驗。沒有運用數學原理。函數
在1976年之前,全部的加密方法都是同一種模式:加密、解密使用同一種算法。在交互數據的時候,彼此通訊的雙方就必須將規則告訴對方,不然無法解密。那麼加密和解密的規則(簡稱密鑰),它保護就顯得尤爲重 要。傳遞密鑰就成爲了最大的隱患。這種加密方式被成爲對稱加密算法(symmetric encryption algorithm)。加密
1976年,兩位美國計算機學家 迪菲(W.Diffie)、赫爾曼( M.Hellman ) 提出了一種嶄新構思,能夠在不直接傳遞密鑰的狀況下,完成密鑰交換。這被稱爲「迪菲赫爾曼密鑰交換」算法。開創了密碼學研究的新方向。spa
1977年三位麻省理工學院的數學家 羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一塊兒設計了一種算法,能夠實現非對稱加密。這個算法用他們三我的的名字命名,叫作RSA算法。設計
也就是說「迪菲赫爾曼密鑰交換」在密碼學歷史的車輪中成爲了一個轉折點。3d
我們這裏先把全部須要用到的公式定理列出來:
一、取模運算
二、歐拉函數φ
三、歐拉定理,費馬小定理
四、模反元素
五、迪菲赫爾曼密鑰交換code
取模運算(「Modulo Operation」)和取餘運算(「Complementation 」)兩個概念有重疊的部分但又不徹底一致。主要的區別在於對負整數進行除法運算時操做不一樣。
在這列出各類負數狀況的例子供你們理解:
7 mod 4 = 3(商 = 1 或 2,1<2,取商=1)
-7 mod 4 = 1(商 = -1 或 -2,-2<-1,取商=-2)
7 mod -4 = -1(商 = -1或-2,-2<-1,取商=-2)
-7 mod -4 = -3(商 = 1或2,1<2,取商=1)cdn
函數值符號規律(餘數的符號) mod(負,正)=正 mod(正,負)=負
結論:兩個整數求餘時,其值的符號爲除數的符號。
能夠簡單理解爲:
若是n能夠分解爲**兩個互質(不必定是兩個質數)**的數之積A和B,那麼:
φ(n) = φ(A) * φ(B)
若是 A和B 又同時爲質數,那麼:
φ(n) = (A-1) * (B-1)
首先這裏說一下,定製之因此是定理是被人證實過的,如何證實的無論,固然你也能夠增長去證實下,反正我無論(……&%¥%……&%&……&%),哈哈
若是m、n爲正整數,且m、n互質,那麼:
若是n爲質數,那麼:
公式轉換:
若是兩個正整數e和x互質,那麼必定能夠找到整數d,使得 e*d-1 被x整除。那麼d就是e對於x的「模反元素」。
證實過程
==> 3^(13 * 15) mod 17 = 3^(13 * 15) mod 17
根據模冪運算 ((m^e mod n)^d) mod n = m^(e*d) mod n
==> (3^13 mod 17)^13 mod 17 = (3^15 mod 17)^15 mod 17
因爲 3^13 mod 17 = 12
3^15 mod 17 = 6
==> 6^13 mod 17 = 12^15 mod 17 = 10
複製代碼
設
m=3 ,e=13 ,d=15 ,n=17 ,C=12
複製代碼
那麼:
m^e mod n = c
c^d mod n = (m^e mod n)^d mod n = m^(e*d) mod n
複製代碼
又因爲上面模反元素 最後得出
m^(e*d) mod n = m
複製代碼
因此得出最終結論:
m^e mod n = c
c^d mod n = m
複製代碼
這個公式也就是咱們最後的RSA加密公式!!! 其中:
公鑰: n和e
私鑰: n和d
明文: m
密文: c
d是e對於φ(n)的「模反元素」。
複製代碼
補充:
一、n會很是大,長度通常爲1024個二進制位。(目前人類已經分解的最大整數,232個十進制位,768個二進制位)
二、因爲須要求出φ(n),因此根據歐函數特色,最簡單的方式n 由兩個質數相乘獲得: 質數:p一、p2 Φ(n) = (p1 -1) * (p2 - 1) 三、最終由φ(n)獲得e 和 d 。 總共生成6個數字:p一、p二、n、φ(n)、e、d
關於RSA的安全:
除了公鑰用到了n和e 其他的4個數字是不公開的。
目前破解RSA獲得d的方式以下:
一、要想求出私鑰 d 。因爲e*d = φ(n)k + 1。要知道e和φ(n)。
二、e是知道的,可是要獲得 φ(n),必須知道p1 和 p2。
三、因爲 n=p1p2。只有將n因數分解才能算出。
因爲Mac系統內置OpenSSL(開源加密庫),因此咱們能夠直接在終端上使用命令來玩RSA. OpenSSL中RSA算法經常使用指令主要有三個:
命令 | 含義 |
---|---|
genrsa | 生成而且輸出一串RSA私鑰 |
rsautl | 使用RSA密鑰進行加密、解密、簽名和驗證等運算 |
rsa | 處理RSA密鑰的格式轉換等問題 |
// 生成RSA私鑰,密鑰長度爲1024bit
openssl genrsa -out private.pem 1024
複製代碼
// 從私鑰中提取公鑰
openssl rsa -in private.pem -pubout -out public.pem
複製代碼
// 將私鑰轉換成爲明文
openssl rsa -in private.pem -text -out private.txt
cat private.txt
複製代碼
// 新建一個文件,在文件中隨意輸入內容,好比輸入字符串」Hello「
vim message.txt
// 查看文件
cat message.txt
// 經過公鑰進行加密
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
// 經過私鑰進行解密
openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
// 查看加密後的文件
cat enc.txt
// 查看解密後的文件
cat dec.txt
複製代碼
// 私鑰加密
openssl rsautl -sign -in message.txt -inkey private.pem -out enc_2.txt
// 公鑰加密
openssl rsautl -verify -in enc_2.txt -inkey public.pem -pubin -out dec_2.txt
複製代碼
一、因爲RSA加密解密用的不是一套數據,因此其保證了安全性。 二、因爲私鑰過大,因此效率較低 三、若是有一天量子計算機被普及(計算速度極快),那麼1024位已經不足以讓RSA安全。