密碼學是研究編制密碼和破譯密碼的技術科學。在現代特別指對信息以及其傳輸的數學性研究,常被認爲是數學和計算機科學的分支,和信息論也密切相關。html
在這裏簡述一下密碼學的發展歷史。算法
在1976年之前,全部的加密方法都是同一種模式:加密、解密使用同一種規則(密鑰)。在交互數據的時候,彼此通訊的雙方就必須將規則告訴對方,不然無法解密。這種加密方式被稱爲 對稱加密算法(symmetric encryption algorithm)。安全
1976年,兩位美國計算機學家 迪菲(Whitfield Diffie)、赫爾曼(Martin Hellman) 提出了一種創建密鑰的方法,其產生的密鑰可用於加密、密鑰管理或任何其它的加密方式。這被稱爲「迪菲赫爾曼密鑰交換」算法,簡稱 D-H算法。D-H算法啓發了其餘科學家。人們意識到,加密和解密可使用不一樣的規則,只要這兩種規則之間存在某種對應關係便可,這樣就避免了直接傳遞密鑰。bash
1977年三位麻省理工學院的數學家 羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir) 和 倫納德·阿德曼(Leonard Adleman) 一塊兒設計了一種算法,能夠實現非對稱加密。(所謂非對稱,就是指該算法須要一對密鑰,即公鑰(public key) 和 私鑰(private key),且兩密鑰不一樣,使用其中一個加密,則須要用另外一個才能解密)。這個算法用他們三我的的名字命名,叫作 RSA算法。網絡
RSA算法的影響是巨大的,絕不誇張地說,只要有計算機網絡的地方,就有RSA算法。這種算法很是可靠,密鑰越長,它就越難破解。函數
接下來,咱們須要學習幾個數學概念,這有助於咱們理解RSA加密算法。學習
即求餘運算,是在整數運算中求一個整數A除以另外一個整數B的餘數的運算,且不考慮運算的商。在計算機程序設計中也有mod運算,其格式爲: mod(A, B),便是兩個數值做除法運算後的餘數。ui
注意:加密
- 當A、B爲同號時,即同爲正整數或負整數時,mod運算與咱們熟悉的%運算相同,可看成是%運算;
如,3 mode 17 = 3 % 17 = 3;-5 mod -3 = -5 % -3 = -2- A、B異號時,mod運算與%運算不一樣,在這裏不做詳細贅述,感興趣的同窗可自行查閱相關資料。
若是兩個正整數,除了1以外,沒有其它公因數,咱們就稱這兩個數存在互質關係,即這兩個數互質。
關於互質關係,不可貴到如下幾個結論:spa
- 任意兩個 不一樣的質數 互質。好比11和23互質,11和11不互質。
- 一個是質數,另外一個只要不是前者的倍數,二者就構成互質關係。好比5和12互質。
- 一個質數與任意一個比它小的數互質。好比11和8。
- 1和任意一個大於1的天然數互質。好比1和99。
- p是大於1的整數,則p和p-1互質。好比10和9。
注意: 兩個正整數互質,意思是這兩個整數存在互質關係,即沒有1以外的其它公因數,並不意味着這兩個數是質數。好比9和10互質,可是9和10均爲合數。
對於一個正整數n,小於n且和n互質的正整數的個數,計算這個值的方法叫作歐拉函數,記作:φ(n)。歐拉函數通式爲
其中,p1、p2、...、pk爲n的質因數。
如12=2*2*3,2和3爲12的質因數,則φ(12)=12*(1-1/2)(1-1/3)=4。 關於歐拉函數,一樣有幾個推論:
- 特別聲明,若是n=1,則φ(1)=1,由於1與任何數(包括它自己)造成互質關係。
- 當n是質數的時候,φ(n)=n-1。如φ(7)=6,即一、二、三、四、五、6均與7互質。
- 若是n能夠分解成兩個互質的整數之積,如n=a*b,則φ(n)=φ(a)*φ(b)。 如φ(56)=φ(7)*φ(8)=24; 注意,φ(49)≠φ(7)*φ(7) => φ(49)≠36,由於7與7不互質。事實上,φ(49)=42。
- 由2和3能夠獲得,若是n=a*b,且a、b均爲質數,則φ(n)=(a-1)*(b-1)。如φ(35)=φ(5)*φ(7)=24;
- 若是n=pk(其中p爲質數,k爲大於1的整數),則φ(n)=φ(pk)=pk-pk-1=(p-1)pk-1。如φ(49)=φ(72)=(7-1)*71=42。
歐拉定理指的是,若是兩個互質的正整數m和n,那麼m的φ(n)次方減去1,能夠被n整除。即,
如7和3互質,7φ(3) mod 3 = 72 mod 3 = 1
- 費馬小定理:當n爲質數的時候,則有 mn-1 mod n ≡ 1
- 歐拉定理是RSA算法的核心,理解了這個定理,就理解了RSA算法。
若是兩個正整數m和n互質,那麼必定能夠找到整數d,使得md-1能被n整除,那麼d就是m相對於n的模反元素。即
由上式,可得 d=(kn+1)/m。
歐拉定理能夠證實上式。因爲m和n互質,那麼m和n必知足歐拉定理,即 mφ(n) mod n ≡ 1, 令d=mφ(n)-1,即得證!
如,3和5互質,當,k爲大於等於1的整數,不難求出當k=4時,獲得d=3,即3(d)就是11(e)相對於8(x)的一個模反元素。
介紹完以上幾個數學概念,咱們詳細介紹一下RSA加密算法。
RSA使用不一樣的加密密鑰與解密密鑰,是一種「由已知加密密鑰推導出解密密鑰在計算上是不可行的」密碼體制。其原理是基於大數難以分解,即兩個大素數相乘容易,但逆向獲得一個由兩個大質數相乘獲得的更大數的因子則很困難。除了暴力破解,目前尚未其它有效的方法。換而言之,RSA加密算法的可靠性,取決於對極大整數作因式分解的難度。假若有人找到一種快速因數分解的算法(或者量子計算機技術快速發展?),那麼RSA的可靠性就會極度降低。但就目前而言,1024位RSA基本安全,2048位是極其安全的。
舉例來講,你能夠對33進行因式分解(3*11),可是你無法對下面這個整數進行因式分解
12301866845301177551304949
58384962720772853569595334
79219732245215172640050726
36575187452021997864693899
56474942774063845925192557
32630345373154826850791702
61221429134616704292143116
02221240479274737794080665
351419597459856902143413
複製代碼
它等於這樣兩個質數的乘積:
33478071698956898786044169
84821269081770479498371376
85689124313889828837938780
02287614711652531743087737
814467999489
×
36746043666799590428244633
79962795263227915816434308
76426760322838157396665112
79233373417143396810270092
798736308917
複製代碼
咱們經過一個例子,來理解RSA加密算法。假如甲和乙兩人進行通訊。其流程以下:
- 甲選擇兩個不相等的質數p和q,甲選擇了3和11,即p=3,q=11。
注意:實際應用中,這兩個質數越大,就越難破解。- 甲計算獲得p和q的乘積n,即n=33
n的長度就是密鑰長度,33寫成二進制是100001,一共有6位,因此這個密鑰是6位。- 甲計算n的歐拉函數φ(n),獲得φ(n) = (p-1)(q-1) = 20
- 隨機選一個整數e,知足1 < e < φ(n),且e與φ(n)互質。甲選擇了13。
- 再計算e相對於φ(n)的模反元素d。將e、φ(n)代入公式ed=kφ(n)+1,獲得13d=20k+1,此二元一次方程能夠用 「擴展歐幾里得算法」 求解,此處省略過程。總之,甲算出一組整數解爲(d,k)=(17,11),即d=17
- 將n和e封裝成公鑰,n和d封裝成私鑰。即公鑰是(33,13),私鑰是(33,17) 注意:實際應用中,公鑰和私鑰的數據都採用 ASN.1 格式表達。
上述步驟共出現6個數字:p:三、q:十一、n:3三、φ(n):20、e:1三、d:17。其中,公鑰用了兩個,即(n和e),其他四個數字不公開。這些數字中最關鍵的是d,由於n和d組成了私鑰,一旦d泄露,就等於私鑰泄露。
討論:在已知公鑰(n,e)的狀況下,推導d
因爲d是e相對於φ(n)的模反元素,知足ed mod φ(n) ≡ 1,要想求出d,必須知道e和φ(n)。
又由φ(n) = (p-1)(q-1),只有知道p和q,才能求出φ(n)。
而n = pq,只有將n因式分解,才能算出p和q。
結論:若是n能夠被因式分解,d就能夠算出,也就意味着私鑰被破解。所以,RSA加密算法的可靠性,取決於對極大整數作因式分解的難度。
有了公鑰和私鑰,就能夠進行通訊了。
- 假設乙要向甲發送信息m,他須要用甲的公鑰(n,e)即(33,13)對m進行加密,獲得密文c。加密規則爲:me mod n ≡ c,假設m爲6,則c=18。因而,乙將18發給了甲。
- 甲收到了乙發送過來的信息,即18,也就是c的值,並用本身的私鑰(n,d)即(33,17)進行解密。解密規則爲:cd mod n ≡ m,即m=6。所以,甲知道了乙發送過來的原文是6。
至此,「加密-解密」的過程就完成了。
思考:爲何解密規則是 cd mod n ≡ m ?
根據加密規則 me mod n ≡ c,獲得 c ≡ me - kn
將其代入咱們要證實的解密規則,可獲得:
(me - kn)d mod n ≡ m
它等同於證實: med mod n ≡ m
又因爲d爲e相對於φ(n)的模反元素,故ed mod φ(n) ≡ 1,即ed = k*φ(n)+1,將ed代入上式得:
mkφ(n)+1 mod n ≡ m,(k爲大於等於1的整數)
所以,上式得證則解密規則成立!
在此,咱們再梳理一下加-解密過程當中的這幾個數字:p:三、q:十一、n:3三、φ(n):20、e:1三、d:1七、明文m:六、密文c:18。
- n爲兩個質數p和q的乘積,則n與以上除了p、q、n以外的任意數互質。(實際運用中,p和q爲大質數,從而保證了n被破解的難度很大);
- e知足1 < e < φ(n),而且與φ(n)互質,d爲e相對於φ(n)的模反元素,即
ed=kφ(n)+1
接下來,分紅兩種狀況證實解密。
- 根據歐拉定理,mφ(n) mod n ≡ 1
- 因爲
1^k≡1
和1*m≡m
,對兩邊表達式進行k次冪運算後,再各乘以m,獲得 mkφ(n)+1 mod n ≡ m,得證!- 即m和n互質時,解密規則成立。
- 因爲n爲兩個質數(p和q)的乘積,故m必爲其中一個質數的倍數,在此取
m=kp
。- 根據歐拉定理,有 (kp)φ(q) mod q ≡ 1
- 因爲
1^[hφ(p)]≡1
和1*(kp)≡kp
,獲得 (kp)hφ(n)+1 mod q ≡ kp- 又
ed=kφ(n)+1
,代入上式可得 (kp)ed mod q ≡ kp,故 (kp)ed ≡ tq + kp(思考t和p的關係)
t和p的關係:由上式獲得 (kp)ed mod t ≡ kp ,顯然,t必然能被p整除,即t=t'p
。- 所以,(kp)ed ≡ t'pq + kp,因爲
m=kp
和n=pq
,因此 med mod n ≡ m,得證!即,m和n不互質時,解密規則也成立!
綜上,不管明文m是什麼內容,都能經過加密規則:me mod n ≡ c 生成密文c,再由解密規則:cd mod n ≡ m 獲得明文m。
經過對RSA算法原理、流程的驗算分析,不可貴出如下幾個結論:
- RSA算法不須要進行密鑰傳遞,安全性高。
- RSA算法的加密解密效率不高,通常應用於處理小數據。
如加密KEY、數字簽名等。
講了半天RSA算法的理論知識,是時候展現真正的技術了。接下來,咱們用終端來玩一下RSA吧。
因爲Mac系統內置OpenSSL(開源加密庫),因此咱們能夠直接在終端上使用命令來玩RSA。
OpenSSL中RSA算法的經常使用指令主要有三個:genrsa,生成並輸入一個RSA私鑰
rsautl,使用RSA密鑰進行加密、解密、簽名和驗證等運算
rsa,處理RSA密鑰的格式轉換問題。
操做流程以下:
openssl genrsa -out private.pem 1024
複製代碼
結果以下:
openssl rsa -in private.pem -text -out private.txt
複製代碼
自行打開private.txt文件便可,這裏不做文件內容說明。
openssl rsa -in private.pem -pubout -out public.pem
複製代碼
結果以下:
假設明文文件內容是
對明文文件進行 公鑰加密 和 私鑰解密
經過公鑰進行加密
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
複製代碼
結果以下:
解密後的文件dec.txt內容正好是【密碼:helloRSA123456】,與明文內容一致。至此,RSA算法流程結束。注意:也可用 私鑰加密 和 公鑰解密,如:
1). 經過私鑰進行加密
openssl rsautl -sign -in message.txt -inkey private.pem -out enc.txt
2). 經過公鑰進行解密
openssl rsautl -verify -in enc.txt -inkey public.pem -pubin -out dec.txt