密碼學是指研究信息加密,破解密碼的技術科學。密碼學的起源能夠追溯到2000年之前。而當今的密碼學是以數學爲基礎的。html
密碼學的歷史大體能夠追溯到兩千年前,相傳古羅馬名將凱撒大帝爲了防止敵方竊取情報,用密碼傳送情報。凱撒的作法很簡單,就是對二十幾個羅馬字母創建一張對應表。這樣,若是不知道密碼本,即便解惑一段信息也看不懂。從凱撒大帝時代到上世紀七十年代這段很長的時間裏,密碼學的發展很是緩慢,由於設計者基本上靠經驗。沒有運用數學原理。算法
上世紀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整除函數
歐拉定理的特殊狀況:若是兩個正整數m和n互質,並且n爲質數,那麼φ(n)結果就是n-1oop
若是兩個正整數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的模反元素
以上理論理解起來很費勁,咱們經過一個例子來走一遍流程,而後再回頭去看上面的公式們或許理解起來會容易一些
咱們能夠選擇61和53,實際應用中,這兩個質數越大,就越難破解。
61 * 53 = 3233
複製代碼
φ(n) = (p-1)(q-1)
複製代碼
φ(3233) = (61-1)(53-1) = 3120
複製代碼
1 < e < φ(n)
且 e和φ(n)互質
咱們能夠在1到3120中隨機選擇17,實際應用中一般選擇比較大的數
所謂模反元素就是值一個整數d,可使得ed被φ(n)除的餘數爲1
ed mod φ(n) ≡ 1
複製代碼
17d mod 3120 ≡ 1
複製代碼
d=2753知足條件
因此公鑰就是(3233,17),私鑰就是(3233,2753)
公鑰加密公式爲
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使用公鑰加密傳遞給服務器、服務器使用私鑰加密將數據傳遞給客戶端都是相對安全的
回顧以上流程咱們共生成了6個數字 p、q、n、φ(n)、e、d
,其中公鑰用到了e、n
,私鑰用到了d、n
,其他四個是不公開的,其中關鍵的是d
,一旦d
泄露那麼黑客就能夠完成解密,那麼在已知公鑰n、d
的狀況下有沒有可能推導出d
呢?
ed mod φ(n) ≡ 1
φ(n) = (p-1)(q-1)
n=pq
只有將n
因式分解,才能計算出p
和q
,可是因式分解是一件很是困難的事兒,目前除了暴力破解尚未發現別的有效方法,因此RSA算法目前來講是相對安全的,祕鑰長度越長因式分解難度就越大,也就越安全
genrsa
生成並輸入一個RSA私鑰rsautl
使用RSA祕鑰進行加密、解密、簽名和驗證等運算rsa
處理RSA祕鑰的格式轉換等問題rsaTest
終端進入目錄openssl genrsa -out private.pem 1024
複製代碼
openssl rsa -in private.pem -pubout -out public.pem
複製代碼
openssl rsa -in private.pem -text -out private.txt
複製代碼
private.txt
信息cat private.txt
複製代碼
message.txt
vi 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
複製代碼
openssl rsautl -sign -in message.txt -inkey private.pem -out enc.txt
複製代碼
openssl rsautl -verify -in enc.txt -inkey public.pem -pubin -out dec1.txt
複製代碼