密碼學是在編碼與破譯的鬥爭實踐中逐步發展起來的,並隨着先進科學技術的應用,已成爲一門綜合性的尖端技術科學。
在說RSA加密算法以前, 先說下密碼學的發展史。其實密碼學的誕生,就是爲了運用在戰場,在公元前,戰爭之中出現了祕密書信。在中國歷史上最先的加密算法的記載出自於周朝兵書《六韜.龍韜》中的《陰符》和《陰書》。在遙遠的西方,在希羅多德(Herodotus)的《歷史》中記載了公元前五世紀,希臘城邦和波斯帝國的戰爭中,普遍使用了移位法進行加密處理戰爭通信信息。算法
相傳凱撒大帝爲了防止敵人竊取信息,就使用加密的方式傳遞信息。那麼當時的加密方式很是的簡單,就是對二十幾個羅馬字母創建一張對照表,將明文對應成爲密文。那麼這種方式其實持續了好久。甚至在二戰時期,日本的電報加密就是採用的這種原始加密方式。
安全
早期的密碼學一直沒有什麼改進,幾乎都是根據經驗慢慢發展的。直到20世紀中葉,由香農發表的《祕密體制的通訊理論》一文,標誌着加密算法的重心轉移往應用數學上的轉移。因而,逐漸衍生出了當今重要的三類加密算法:非對稱加密、對稱加密以及哈希算法(HASH嚴格說不是加密算法,但因爲其不可逆性,已成爲加密算法中的一個重要構成部分)。服務器
1976年之前,全部的加密方法都是同一種模式:加密和解密使用一樣規則(簡稱"密鑰"),這被稱爲"對稱加密算法",使用相同的密鑰,兩次連續的對等加密運算後會回覆原始文字,也有很大的安全隱患。網絡
1976年,兩位美國計算機學家Whitfield Diffie 和 Martin Hellman,提出了一種嶄新構思,能夠在不直接傳遞密鑰的狀況下,完成解密。這被稱爲"Diffie-Hellman密鑰交換算法"。也正是由於這個算法的產生,人類終於能夠實現非對稱加密了:A給B發送信息函數
- B要先生成兩把密鑰(公鑰和私鑰)。公鑰是公開的,任何人均可以得到,私鑰則是保密的。
- A獲取B的公鑰,而後用它對信息加密。
- B獲得加密後的信息,用私鑰解密。
理論上若是公鑰加密的信息只有私鑰解得開,那麼只要私鑰不泄漏,通訊就是安全的。學習
1977年,三位數學家Rivest、Shamir 和 Adleman 設計了一種算法,能夠實現非對稱加密。這種算法用他們三我的的名字命名,叫作RSA算法。從那時直到如今,RSA算法一直是最廣爲使用的"非對稱加密算法"。絕不誇張地說,只要有計算機網絡的地方,就有RSA算法。這種算法很是可靠,密鑰越長,它就越難破解。根據已經披露的文獻,目前被破解的最長RSA密鑰是232個十進制位,也就是768個二進制位,所以能夠認爲,1024位的RSA密鑰基本安全,2048位的密鑰極其安全,固然量子計算機除外。測試
下面進入正題,解釋RSA算法的原理,其實RSA算法並不難,只須要一點數論知識就能夠理解。大數據
任意給定正整數n,請問在小於等於n的正整數之中,有多少個與n構成互質關係?(好比,在1到8之中,有多少個數與8構成互質關係?)計算這個值的方法就叫作歐拉函數,以φ(n)表示。編碼
φ(8) = 4
若是n是質數的某一個次方,即 n = p^k (p爲質數,k爲大於等於1的整數),則φ(n) = φ(p^k) = p^k - p^(k-1)。也就是φ(8) = φ(2^3) =2^3 - 2^2 = 8 -4 = 4加密
φ(7) = 6
若是n是質數,則 φ(n)=n-1 。由於質數與小於它的每個數,都構成互質關係。好比5與一、二、三、4都構成互質關係。
φ(56) = φ(8) φ(7) = 4 6 = 24
若是n能夠分解成兩個互質的整數之積,即 n = p k ,則φ(n) = φ(p k) = φ(p1)*φ(p2)
歐拉定理:若是兩個正整數m和n互質,那麼m的φ(n)次方減去1,能夠被n整除。
費馬小定理:歐拉定理的特殊狀況,若是兩個正整數m和n互質,並且n爲質數!那麼φ(n)結果就是n-1。
還剩下最後一個概念,模反元素:若是兩個正整數e和x互質,那麼必定能夠找到整數d,使得 ed-1 被x整除,或者說ed被x除的餘數是1。
那麼d就是e相對於x的模反元素。
根據模反元素,由於e*d 必定是x的倍數加1。因此以下:
經過屢次的等式轉換。終於能夠將這兩個等式進行合併了!以下:
這個等式成立有一個前提!就是關於模反元素的,就是當整數e和φ(n)互質!必定有一個整數d是e相對於φ(n)的模反元素。
咱們能夠測試一下。
m取值爲4
n取值爲15
φ(n)取值爲8
e 若是取值爲3
d 能夠爲 十一、19...(模反元素很明顯不止一個,其實就是解二元一次方程)
若是你測試了,那麼你能夠改變m的值試一下,其實這個等式不須要m和n 互質。只要m小於n 等式依然成立。
這裏須要注意的是,咱們能夠看作 m 經過一系列運算獲得結果仍然是 m。這一系列運算中,分別出現了多個參數n、φ(n)、e還有d。
m 的 e乘上d 次方爲加密運算,獲得結果 c
c 模以 n 爲解密運算,獲得結果 m
這彷佛能夠用於加密和解密。但這樣,加密的結果會很是大。明文數據將很是小(雖然RSA用於加密的數據也很小,可是沒這麼大懸殊),真正的RSA要更增強大,那麼RSA是怎麼演變來的呢??
早期不少數學家也停留在了這一步!直到1967年迪菲赫爾曼密鑰交換打破了僵局!
這個密鑰交換當時轟動了整個數學界!並且對人類密碼學的發展很是重要,由於這個偉大的算法可以拆分剛纔的等式。當非對稱加密算法沒有出現之前,人類都是用的對稱加密。因此密鑰的傳遞,就必需要很是當心。
迪菲赫爾曼密鑰交換 就是解決了密鑰傳遞的保密性,咱們來看一下
假設一個傳遞密鑰的場景。算法就是用3 的次方去模以17。 三個角色
客戶端用3 的 13次方 mod 17 = 12 而後將獲得的結果12公佈出去。
拿到服務器的 6 ,而後用6^13 mod 17 獲得結果10(10就是交換獲得的密鑰)
第三者只能拿到6 和 12 ,由於沒有私密數據1三、15,因此它無法獲得結果10。
爲何 6的13次方會和12的15次方獲得同樣的結果呢?由於這就是規律,咱們能夠用小一點的數字測試一下3^3 mod 17 = 10和10 ^ 2 mod 17 ; 3 ^ 2 mod 17 = 9和9^3 mod 17結果都是15。迪菲赫爾曼密鑰交換最核心的地方就在於這個規律
如今咱們知道了m^e % n = c是加密,c^d % n = m是解密,m就是原始數據,c是密文,公鑰是n和e,私鑰是n和d,因此只有n和e是公開的。加密時咱們也要知道φ(n)的值,最簡單的方式是用兩個質數之積獲得,別人想破解RSA也要知道φ(n)的值,只能對n進行因數分解,那麼咱們不想m被破解,n的值就要很是大,就是咱們以前說的,長度通常爲1024個二進制位,這樣就很安全了。可是聽說量子計算機(用於科研,還沒有普及)能夠破解,理論上量子計算機的運行速度無窮快,你們能夠了解一下。
以上就是RSA的數學原理
咱們用終端命令演示下這個加密、解密過程。
假設m = 12(隨便取值,只要比n小就OK),n = 15(仍是隨機取一個值),φ(n) = 8,e = 3(只要和φ(n)互質就能夠),d = 19(3d - 1 = 8,d也能夠爲3,11等等,也就是d = (8k + 1)/3 )
終端分別以m=12,7輸入結果
Mac能夠直接使用OpenSSL,首先進入相應文件夾
// 生成RSA私鑰,文件名爲private.pem,長度爲1024bit openssl genrsa -out private.pem 1024
// 從私鑰中提取公鑰 openssl rsa -in private.pem -pubout -out publick.pem
// 查看剛剛生成好的私鑰 cat private.pem
// 查看剛剛生成好的公鑰 cat publick.pem
咱們能夠看到base64編碼,明顯私鑰二進制很大,公鑰就小了不少。
這時候咱們的文件夾內已經多了剛剛生成好的公私鑰文件了
// 將私鑰轉換爲明文 openssl rsa -in private.pem -text -out private.txt
裏面就是P一、P2還有KEY等信息。
// 編輯文件message內容爲hello Vincent!!! // 剛剛的public.pem寫成了publick.pem(哎。。。) $ vi message.txt $ cat message.txt hello Vincent!!! // 經過公鑰加密數據時,使用encrypt對文件進行加密 $ openssl rsautl -encrypt -in message.txt -inkey publick.pem -pubin -out enc.txt // 此時查看該文件內容爲亂碼 $ cat enc.txt j��E]a��d�kUE�&< ��I*��V/��pL[���ˋ�O�+�-�M��K�ܱ�&⪅ծO��2���o34�:�$���6��C�L��,b�'M�S�k�0���A��3%�[I���1�����ps"% // 經過私鑰解密數據 $ openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt // 已成功解密,正確顯示文件內容 $ cat dec.txt hello Vincent!!!
// 經過私鑰加密數據時,要使用sign對文件進行重簽名 $ openssl rsautl -sign -in message.txt -inkey private.pem -out enc.bin // 此時查看該文件內容一樣爲亂碼 $ cat enc.bin {���Ew�3�1E��,8-OA2�Is�:���:�ԅ@MU���� �i1B���#��6���ׂm�D(�t#/��� �ہ�������ݬ>(�>�^@�C��3�ӸMQт�O% // 經過公鑰解密數據 $ openssl rsautl -verify -in enc.bin -inkey publick.pem -pubin -out dec.bin // 已成功解密,正確顯示文件內容 $ cat dec.bin hello Vincent!!!
到這裏,你們都知道RSA經過數學算法來加密和解密,效率比較低,因此通常RSA的主戰場是加密比較小的數據,好比對大數據進行對稱加密,再用RSA給對稱加密的KEY進行加密,或者加密Hash值,也就是數字簽名。
關於RSA數字簽名後面再慢慢闡述。該文章爲記錄本人的學習路程,但願可以幫助你們,也歡迎你們點贊留言交流!!!https://www.jianshu.com/p/ad3...