RSA加密

密碼學

密碼學是指研究信息加密,破解密碼的技術科學。密碼學的起源能夠追溯到2000年之前。而當今的密碼學是以數學爲基礎的。html

密碼學的歷史大體能夠追溯到兩千年前,相傳古羅馬名將凱撒大帝爲了防止敵方竊取情報,用密碼傳送情報。凱撒的作法很簡單,就是對二十幾個羅馬字母創建一張對應表。這樣,若是不知道密碼本,即便解惑一段信息也看不懂。從凱撒大帝時代到上世紀七十年代這段很長的時間裏,密碼學的發展很是緩慢,由於設計者基本上靠經驗。沒有運用數學原理。算法

image.png

  • 在1976年之前,全部的加密方式都是同一種模式:加密、解密使用同一種算法。在交互數據的時候,彼此通訊的雙方就必須將規則告訴對方,不然無法解密。那麼對加密解密規則(密鑰)的保護就尤其重要。傳遞密鑰就成了最大的隱患。這種加密方式被稱爲對稱加密算法(symmetric encryption algorithm)
  • 1976年,兩位美國科學家迪菲(W.Diffie)、赫爾曼( M.Hellman ) 提出了一種嶄新構思,能夠在不直接傳遞密鑰的狀況下,完成密鑰交換。這被稱爲迪菲赫爾曼密鑰交換 算法,開創了密碼學研究的新方向。

image.png

image.png

  • 1977年三位麻省理工學院的數學家羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)倫納德·阿德曼(Leonard Adleman) 一塊兒設計了一種算法,能夠實現非對稱加密。這個算法用他們三我的的名字命名,叫作RSA算法

RSA數學原理

上世紀70年代產生的一種加密算法,其加密方式比較特殊,須要兩個密鑰:公開密鑰簡稱公鑰(publickey)和私有密鑰簡稱私鑰(privatekey)。公鑰加密,私鑰解密;私鑰加密,公鑰解密。這個算法就是偉大的RSA瀏覽器

互質關係

若是兩個數除了1以外沒有其它公約數,咱們就稱兩個數是互質關係。好比3和17,又好比15和32,不是質數也能夠造成互質關係。安全

歐拉函數

思考如下問題🤔服務器

給定任意正整數n,請問在小於等於n的正整數中,有多少個構成互質關係?(好比1到8之中,有多少個數與8構成互質關係)markdown

計算這個值得方法叫作歐拉函數,用φ(n) 表示,在1到8之中,與8造成互質關係的是一、三、五、7共4個,因此app

φ(8) = 4
複製代碼

歐拉定理

若是兩個正整數m和n互質,那麼m的φ(n)次方減去1,能夠被n整除函數

image.png

費馬小定理

歐拉定理的特殊狀況:若是兩個正整數m和n互質,並且n爲質數,那麼φ(n)結果就是n-1oop

image.png

模反元素

若是兩個正整數e和x互質,那麼必定能夠找到整數d,使得 ed-1 被x整除。那麼d就是e對於x的「模反元素」加密

// 認爲k是ed/x的商
e*d  mod  x ≡  1
e*d ≡  k*x + 1 
複製代碼

好比,3和11互質,那麼3的模反元素就是4,由於 (3 × 4)-1 能夠被11整除。顯然,模反元素不止一個, 4加減11的整數倍都是3的模反元素 {...,-18,-7,4,15,26,...},即若是b是a的模反元素,則 b+kn 都是a的模反元素

公式轉換

image.png

image.png

RSA實現步驟

以上理論理解起來很費勁,咱們經過一個例子來走一遍流程,而後再回頭去看上面的公式們或許理解起來會容易一些

1. 尋找兩個不相等的質數p和q

咱們能夠選擇61和53,實際應用中,這兩個質數越大,就越難破解。

2. 計算p和q的乘積n

61 * 53 = 3233
複製代碼

3. 計算n的歐拉函數φ(n)

φ(n) = (p-1)(q-1)
複製代碼
φ(3233) = (61-1)(53-1) = 3120
複製代碼

4. 隨機選擇一個整數e,條件是1 < e < φ(n) e和φ(n)互質

咱們能夠在1到3120中隨機選擇17,實際應用中一般選擇比較大的數

5. 計算e和φ(n)的模反元素

所謂模反元素就是值一個整數d,可使得ed被φ(n)除的餘數爲1

ed mod φ(n) ≡ 1 
複製代碼
17d mod 3120 ≡ 1 
複製代碼

d=2753知足條件

6. 將n和e封裝成公鑰,n和d封裝成私鑰

因此公鑰就是(3233,17),私鑰就是(3233,2753)

7. 加密和解密

公鑰加密公式爲

m的e次方 mod n ≡ c 
複製代碼

私鑰解密公式爲

c的d次方 mod n ≡ m
複製代碼

假如我想將65發送給服務器,那麼加密流程爲

65的17次方 mod 3233 = 2790
複製代碼

將2790發送給服務器,至關於c,而後服務器利用私鑰解密

2790的2753次方 mod 3233 = 65
複製代碼

神不知鬼不覺的就將值65傳遞給了服務器

對於瀏覽器來講公鑰是公開的,服務器私鑰加密沒有意義,誰均可以拿到公鑰來解密,RSA只解決了客戶端利用公鑰加密以後安全傳遞給服務器的問題,這就足夠客戶端和服務器制定新的加密規則,後續使用他們新制定的規則繼續通信,也就是對稱加密算法

對於app來講公鑰也能夠是不公開的,那麼app使用公鑰加密傳遞給服務器、服務器使用私鑰加密將數據傳遞給客戶端都是相對安全的

8. RSA算法的可靠性

回顧以上流程咱們共生成了6個數字 p、q、n、φ(n)、e、d,其中公鑰用到了e、n,私鑰用到了d、n,其他四個是不公開的,其中關鍵的是d,一旦d泄露那麼黑客就能夠完成解密,那麼在已知公鑰n、d的狀況下有沒有可能推導出d呢?

  1. ed mod φ(n) ≡ 1
  2. φ(n) = (p-1)(q-1)
  3. n=pq

只有將n因式分解,才能計算出pq,可是因式分解是一件很是困難的事兒,目前除了暴力破解尚未發現別的有效方法,因此RSA算法目前來講是相對安全的,祕鑰長度越長因式分解難度就越大,也就越安全

終端演示

  1. genrsa生成並輸入一個RSA私鑰
  2. rsautl使用RSA祕鑰進行加密、解密、簽名和驗證等運算
  3. rsa處理RSA祕鑰的格式轉換等問題
  • 新建文件夾命名爲rsaTest終端進入目錄

image.png

  • 生成RSA私鑰,祕鑰長度爲1024bit
openssl genrsa -out private.pem 1024
複製代碼

image.png

image.png

  • 從私鑰中提取公鑰
openssl rsa -in private.pem -pubout -out public.pem
複製代碼

image.png

  • 將私鑰轉化爲明文信息並查看
openssl rsa -in private.pem -text -out private.txt
複製代碼

image.png

  • 查看private.txt信息
cat private.txt
複製代碼

image.png

  • 新建文本文件message.txt
vi message.txt
複製代碼

image.png

  • 查看文本內容
cat message.txt
複製代碼

image.png

  • 使用公鑰加密數據
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
複製代碼

image.png

  • 經過私鑰進行解密
openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
複製代碼

image.png

  • 經過私鑰進行加密
openssl rsautl -sign -in message.txt -inkey private.pem -out enc.txt
複製代碼

image.png

  • 經過公鑰進行解密
openssl rsautl -verify -in enc.txt -inkey public.pem -pubin -out dec1.txt
複製代碼

image.png

參考文章

RSA算法原理(一)

RSA算法原理(二)

相關文章
相關標籤/搜索