非對稱加密算法--RSA加密原理及運用

密碼學是在編碼與破譯的鬥爭實踐中逐步發展起來的,並隨着先進科學技術的應用,已成爲一門綜合性的尖端技術科學。

密碼學發展史

在說RSA加密算法以前, 先說下密碼學的發展史。其實密碼學的誕生,就是爲了運用在戰場,在公元前,戰爭之中出現了祕密書信。在中國歷史上最先的加密算法的記載出自於周朝兵書《六韜.龍韜》中的《陰符》和《陰書》。在遙遠的西方,在希羅多德(Herodotus)的《歷史》中記載了公元前五世紀,希臘城邦和波斯帝國的戰爭中,普遍使用了移位法進行加密處理戰爭通信信息。算法

相傳凱撒大帝爲了防止敵人竊取信息,就使用加密的方式傳遞信息。那麼當時的加密方式很是的簡單,就是對二十幾個羅馬字母創建一張對照表,將明文對應成爲密文。那麼這種方式其實持續了好久。甚至在二戰時期,日本的電報加密就是採用的這種原始加密方式。
凱撒密碼對照表安全

早期的密碼學一直沒有什麼改進,幾乎都是根據經驗慢慢發展的。直到20世紀中葉,由香農發表的《祕密體制的通訊理論》一文,標誌着加密算法的重心轉移往應用數學上的轉移。因而,逐漸衍生出了當今重要的三類加密算法:非對稱加密、對稱加密以及哈希算法(HASH嚴格說不是加密算法,但因爲其不可逆性,已成爲加密算法中的一個重要構成部分)。服務器

1976年之前,全部的加密方法都是同一種模式:加密和解密使用一樣規則(簡稱"密鑰"),這被稱爲"對稱加密算法",使用相同的密鑰,兩次連續的對等加密運算後會回覆原始文字,也有很大的安全隱患。網絡

1976年,兩位美國計算機學家Whitfield Diffie 和 Martin Hellman,提出了一種嶄新構思,能夠在不直接傳遞密鑰的狀況下,完成解密。這被稱爲"Diffie-Hellman密鑰交換算法"。也正是由於這個算法的產生,人類終於能夠實現非對稱加密了:A給B發送信息函數

  1. B要先生成兩把密鑰(公鑰和私鑰)。公鑰是公開的,任何人均可以得到,私鑰則是保密的。
  2. A獲取B的公鑰,而後用它對信息加密。
  3. B獲得加密後的信息,用私鑰解密。

理論上若是公鑰加密的信息只有私鑰解得開,那麼只要私鑰不泄漏,通訊就是安全的。學習

1977年,三位數學家Rivest、Shamir 和 Adleman 設計了一種算法,能夠實現非對稱加密。這種算法用他們三我的的名字命名,叫作RSA算法。從那時直到如今,RSA算法一直是最廣爲使用的"非對稱加密算法"。絕不誇張地說,只要有計算機網絡的地方,就有RSA算法。這種算法很是可靠,密鑰越長,它就越難破解。根據已經披露的文獻,目前被破解的最長RSA密鑰是232個十進制位,也就是768個二進制位,所以能夠認爲,1024位的RSA密鑰基本安全,2048位的密鑰極其安全,固然量子計算機除外。測試

RSA算法的原理

下面進入正題,解釋RSA算法的原理,其實RSA算法並不難,只須要一點數論知識就能夠理解。大數據

  1. 素數:又稱質數,指在一個大於1的天然數中,除了1和此整數自身外,不能被其餘天然數整除的數。
  2. 互質,又稱互素。若N個整數的最大公因子是1,則稱這N個整數互質。
  3. 模運算求餘運算。「模」是「Mod」的音譯。和模運算緊密相關的一個概念是「同餘」。數學上,當兩個整數除以同一個整數,若得相同餘數,則二整數同餘
歐拉函數

任意給定正整數n,請問在小於等於n的正整數之中,有多少個與n構成互質關係?(好比,在1到8之中,有多少個數與8構成互質關係?)計算這個值的方法就叫作歐拉函數,以φ(n)表示。編碼

  • 計算8的歐拉函數,和8互質的 1、二、3、四、5、六、7、8

φ(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的歐拉函數,和7互質的 123456、7

φ(7) = 6
若是n是質數,則 φ(n)=n-1 。由於質數與小於它的每個數,都構成互質關係。好比5與一、二、三、4都構成互質關係。

  • 計算56的歐拉函數

φ(56) = φ(8) φ(7) = 4 6 = 24
若是n能夠分解成兩個互質的整數之積,即 n = p k ,則φ(n) = φ(p k) = φ(p1)*φ(p2)

歐拉定理:若是兩個正整數m和n互質,那麼m的φ(n)次方減去1,能夠被n整除。
歐拉定理.png
費馬小定理:歐拉定理的特殊狀況,若是兩個正整數m和n互質,並且n爲質數!那麼φ(n)結果就是n-1。
費馬小定理.png
模反元素

還剩下最後一個概念,模反元素:若是兩個正整數e和x互質,那麼必定能夠找到整數d,使得 ed-1 被x整除,或者說ed被x除的餘數是1。
那麼d就是e相對於x的模反元素。
d是模反元素

等式轉換
  1. 根據歐拉定理

等式轉換1

  1. 因爲1^k ≡ 1,等號左右兩邊都來個k次方

等式轉換

  1. 因爲1* m ≡ m,等號左右兩邊都乘上m

等式轉換3.png

根據模反元素,由於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。 三個角色

  • 服務器 隨機數 15
    這個15只有服務器才知道。經過算法獲得結果 6 由於 3的15次方 mod 17 = 6 。而後將結果 6 公開發送出去,拿到客戶端的 12 ,而後用12^15 mod 17 獲得結果10(10就是交換獲得的密鑰)
  • 客戶端 隨機數13

客戶端用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。迪菲赫爾曼密鑰交換最核心的地方就在於這個規律
迪菲赫爾曼密鑰交換轉換

RSA的誕生

RSA原理

如今咱們知道了m^e % n = c是加密,c^d % n = m是解密,m就是原始數據,c是密文,公鑰是n和e,私鑰是n和d,因此只有n和e是公開的。加密時咱們也要知道φ(n)的值,最簡單的方式是用兩個質數之積獲得,別人想破解RSA也要知道φ(n)的值,只能對n進行因數分解,那麼咱們不想m被破解,n的值就要很是大,就是咱們以前說的,長度通常爲1024個二進制位,這樣就很安全了。可是聽說量子計算機(用於科研,還沒有普及)能夠破解,理論上量子計算機的運行速度無窮快,你們能夠了解一下。

以上就是RSA的數學原理

檢驗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輸入結果
終端演示

OpenSSL進行RSA的命令運行

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

96111F25-0954-4854-9B36-75413A439AFD.png

裏面就是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的主戰場是加密比較小的數據,好比對大數據進行對稱加密,再用RSA給對稱加密的KEY進行加密,或者加密Hash值,也就是數字簽名。

關於RSA數字簽名後面再慢慢闡述。該文章爲記錄本人的學習路程,但願可以幫助你們,也歡迎你們點贊留言交流!!!https://www.jianshu.com/p/ad3...

相關文章
相關標籤/搜索