在對稱密碼中,由于加密和解密的密鑰是相同的,因此必須向接收者配送密鑰。用于解密的密鑰必須被配送給接收者,這一問題稱為密鑰配送問題,如果使用公鑰密碼,則無需向接收者配送用于解密的密鑰,這樣就解決了密鑰配送問題。可以說公鑰密碼是密碼學歷史上最偉大的發(fā)明。
密鑰配送問題
解決密鑰配送問題的方法
- 通過事先共享密鑰來解決
- 通過密鑰分配中心來解決
- 通過Diffic-Hellman密鑰交換來解決
- 通過公鑰密碼來解決
通過事先共享密鑰來解決
在人數(shù)很多的情況下,通信所需要的密鑰數(shù)量會增大,例如:1000名員工中每一個人都可以和另外999個進行通信,則每個人需要999個通信密鑰,整個密鑰數(shù)量:
1000 x 999 ÷ 2 = 499500
很不現(xiàn)實,因此此方法有一定的局限性
通過密鑰分配中心來解決
- 密鑰分配中心雖然能解決上述密鑰數(shù)量過多的限制,但是隨著員工數(shù)量的增多,密鑰分配中心的負荷也會隨之增加,如果密鑰分配中心計算機發(fā)生故障,全公司加密通信就會癱瘓,
- 此外主動攻擊者也可能針對密鑰分配中心下手
這是密鑰分配中心所面臨的問題。
通過Diffic-Hellman密鑰交換來解決
在Diffic-Hellman密鑰交換中,進行加密通信的雙方需要交換一些信息,而這些信息即便被竊聽者竊聽到也沒有問題(后續(xù)文章會進行詳解)。
通過公鑰密碼來解決
在對稱密碼中,加密密鑰和解密密鑰是相同的,但公鑰密碼中,加密密鑰和解密密鑰卻是不同的。只要擁有加密密鑰,任何人都可以加密,但沒有解密密鑰是無法解密的。
公鑰密碼
公鑰密碼中,密鑰分為加密密鑰(公鑰)和解密密鑰(私鑰)兩種。
- 發(fā)送者只需要加密密鑰
- 接收者知悉要解密密鑰
- 解密密鑰不可以被竊聽者獲取
- 加密密鑰被竊聽者獲取也沒有問題
公鑰和私鑰是一一對應的,一對公鑰和私鑰統(tǒng)稱為密鑰對,由公鑰進行加密的密文,必須使用與該公鑰配對的私鑰才能夠解密。密鑰對中的兩個密鑰之間具有非常密切的關系——數(shù)學上的關系——因此公鑰和私鑰是不能分別單獨生成的。
公鑰通信的流程
發(fā)送者:Alice ???? 接收者:Bob ???? 竊聽者:Eve
通信過程是由接收者Bob來啟動的
- Bob生成密鑰對,私鑰自己來妥善保管
- Bob將自己的公鑰發(fā)送給Alice。
- Bob的公鑰被Eve截獲也沒有關系。
- 公鑰發(fā)送給Alice,表示Bob請Alice用這個公鑰對消息進行加密并發(fā)送給他。
- Alice用Bob的公鑰對消息進行加密。
- 加密后的消息只有用Bob的私鑰才能夠解密
- 雖然Alice擁有Bob的公鑰,但是Bob的公鑰是無法對密文進行解密的
- Alice將密文發(fā)給Bob
- 密文被Eve截獲也沒關系,Eve可能擁有Bob的公鑰,但是無法進行解密
-
Bob用自己的私鑰對密文進行解密
image.png
-
公鑰密碼無法解決的問題
公鑰密碼解決了密鑰配送的問題,但依然面臨著下面的問題
- 判斷所得到的公鑰是否正確合法,被稱為公鑰認證問題(后面會通過中間人攻擊來探討這個問題)
- 公鑰密碼的處理速度只有對稱密碼的幾百分之一。
RSA
什么是RSA
RSA是目前使用最廣泛的公鑰密碼算法,名字是由它的三位開發(fā)者,即Ron Rivest、Adi Shamir和Leonard Adleman的姓氏的首字母組成的(Rivest-Shamir-Adleman)。RSA可以被使用公鑰密碼和數(shù)字簽名(此文只針對公鑰密碼進行探討,數(shù)字簽名后續(xù)文章敬請期待)1983年在美國取得了專利,但現(xiàn)在該專利已經(jīng)過期。
RSA加密
在RSA中,明文、密鑰和密文都是數(shù)字,RSA加密過程可以用下列公式來表達
密文 = 明文E mod N
注意 mod運算講解在這里
簡單的來說,RSA的密文是對代表明文的數(shù)字的 E 次方求mod N 的結果,換句話說:將明文和自己做 E 次乘法,然后將結果除以 N 求余數(shù),這個余數(shù)就是密文。
從上面公式中可以看出,只要知道 E 和 N 這兩個數(shù),任何人都可以完成加密的運算。所以說 E 和 N 是RSA加密的密鑰,即 E 和 N 的組合就是公鑰 ,一般寫成 “公鑰是(E,N) ” 或者 “公鑰是{E,N}”
RSA解密
RSA解密過程可以用下列公式來表達
明文 = 密文D mod N
對表示密文的數(shù)字的 D 次方求mod N 就可以得到明文,換句話說:將密文和自己做 D 次乘法,在對其結果除以 N 求余數(shù),就可以得到明文
此時使用的數(shù)字 N 和加密時使用的數(shù)字 N 是相同的,數(shù) D 和數(shù) N 組合起來就是RSA的解密密鑰,因此 D 和 N 的組合就是私鑰。只要知道 D 和 N 兩個數(shù)的人才能夠完成解密的運算
由于 N 是公鑰的一部分,使公開的,因此單獨將 D 成為私鑰也是可以的
生成密鑰對
根據(jù)加密和解密的公式可以看出,需要用到三個數(shù)—— E、D 和 N 求這三個數(shù)就是生成密鑰對,RSA密鑰對的生成步驟如下:
- 求 N
- 求 L (L 是僅在生成密鑰對的過程中使用的數(shù))
- 求 E
- 求 D
1、求 N
準備兩個很大的質數(shù) p 和 q ,將這兩個數(shù)相乘,結果就是 N
N = p x q
2、求 L
L 是 p-1 和 q-1 的最小公倍數(shù),如果用lcm( X , Y )來表示 “X 和 Y 的最小公倍數(shù)” 則L可以寫成下列形式
L = lcm ( p - 1,q - 1)
3、求 E
E 是一個比1大、比 L 小的數(shù)。 E 和 L的最大公約數(shù)必須為1,如果用gcd(X , Y)來表示 X 和 Y 的最大公約數(shù),則 E 和 L之間存在下列關系:
1 < E < L
gcd(E , L) = 1 (是為了保證一定存在解密時需要使用的數(shù) D )
4、求 D
1 < D < L
E x D mod L = 1
來個具體的例子
密鑰對生成
1、求 N
p = 17
q = 19
N = p x q = 17 x 19 = 323
2、求 L
L = lcm ( p - 1,q - 1) = lcm (16,18) = 144
3、求 E
gcd(E , L) = 1
滿足條件的 E 有很多:5,7,11,13,17,19,23,25,29,31...
這里選擇5來作為E,到這里我們已經(jīng)知道E = 5 ?? N = 323 這就是公鑰
4、求 D
E x D mod L = 1
D = 29 可以滿足上面的條件,因此:
公鑰:E = 5 ??? N = 323
私鑰:D = 29 ?? N = 323
5、加密
要加密的明文必須是小于 N 的數(shù),這是因為在加密運算中需要求 mod N 假設加密的明文是123
明文E mod N = 1235 mod 323 = 225(密文)
6、解密
對密文225進行解密
密文D mod N = 22529 mod 323 = 22510 x 22510 x 2259 mod 323 = (22510 mod 323) x (22510 mod 323) x (2259 mod 323) = 16 x 16 x 191 mod 323 = 48896 mod 323 = 123(明文)
對RSA的攻擊
1、通過密文來求得明文
如果沒有mod N 的話,即:
明文 = 密文D mod N
通過密文求明文的難度不大,因為這可以看作是一個求對數(shù)的問題。
但是,加上mod N 之后,求明文就變成了求離散對數(shù)的問題,這是非常困難的,因為人類還沒有發(fā)現(xiàn)求離散對數(shù)的高效算法。
2、通過暴力破解來找出 D
只要知道 D,就能夠對密文進行解密,逐一嘗試 D 來暴力破譯RSA,暴力破解的難度會隨著D的長度增加而加大,當 D 足夠長時,就不能再現(xiàn)實的時間內通過暴力破解找出數(shù) D
目前,RSA中所使用的 p 和 q 的長度都是1024比特以上,N 的長度為2048比特以上,由于 E 和 D 的長度可以和N差不多,因此要找出 D ,就需要進行2048比特以上的暴力破解。這樣的長度下暴力破解找出 D 是極其困難的
3、通過 E 和 N 求出 D
E x D mod L = 1 ???? ???? L = lcm ( p - 1,q - 1)
由 E 計算 D 需要使用 p 和 q ,但是密碼破譯者并不知道 p 和 q
對于RSA來說,有一點非常重要,那就是質數(shù) p 和 q 不能被密碼破譯這知道。把 p 和 q 交給密碼破譯者與把私鑰交給密碼破譯者是等價的。
p 和 q 不能被密碼破譯者知道,但是 N = p x q 而且 N 是公開的, p 和 q 都是質數(shù),因此由 N 求 p 和 q 只能通過將 N 進行質因數(shù)分解,所以說:
一旦發(fā)現(xiàn)了對大整數(shù)進行質因數(shù)分解的高效算法,RSA就能夠被破譯
4、中間人攻擊
這種方法雖然不能破譯RSA,但卻是一種針對機密性的有效攻擊。
所謂中間人攻擊,就是主動攻擊者Mallory混入發(fā)送者和接收者的中間,對發(fā)送者偽裝成接收者,對接收者偽裝成發(fā)送者的攻擊,在這里,Mallory就是“中間人”
注意:在這個過程中,Alice所持有的公鑰并非是Bob的,而是Mallory的,所以發(fā)送的內容被Mallory攔截以后,Mallory可以通過自己的私鑰解密,而Mallory還持有Bob的公鑰,所以可以篡改信息,然后發(fā)送給Bob。
這種攻擊不僅針對RSA,而是可以針對任何公鑰密碼。在這個過程中,公鑰密碼并沒有被破譯,所有的密碼算法也都正常工作并確保了機密性。然而,所謂的機密性并非在Alice和Bob之間,而是在Alice和Mallory之間,以及Mallory和Bob之間成立的。僅靠公鑰密碼本身,是無法防御中間人攻擊的。
要防御中間人攻擊,還需要一種手段來確認所收到的公鑰是否真的屬于Bob,這種手段稱為認證。在這種情況下,我們可以使用公鑰的證書(后面會陸續(xù)更新文章來進行探討)
5、選擇密文攻擊
網(wǎng)絡上很多服務器在收到格式不正確的數(shù)據(jù)時都會向通信對象返回錯誤消息,并提示“這里的數(shù)據(jù)有問題”,然而,這種看似很貼心的設計卻會讓攻擊者有機可乘。攻擊者可以向服務器反復發(fā)送自己生成的偽造密文,然后分析返回的錯誤消息和響應時間獲得一些關于密鑰和明文的信息。
為了抵御這種攻擊,可以對密文進行“認證”,RSA-OAEP(最優(yōu)非對稱加密填充)正是基于這種思路設計的一種RSA改良算法。
RSA-OAEP在加密時會在明文前面填充一些認證信息,包括明文的散列值以及一定數(shù)量的0,然后用RSA進行加密,在解密的過程中,如果解密后的數(shù)據(jù)的開頭沒有找到正確的認證信息,則可以判定有問題,并返回固定的錯誤消息(重點是,不能將具體的錯誤內容告知開發(fā)者)
RSA-OAEP在實際應用中,還會通過隨機數(shù)使得每次生成的密文呈現(xiàn)不同的排列方式,從而進一步提高安全性。
隨著計算機技術的進步等,以前被認為是安全的密碼會被破譯,這一現(xiàn)象稱為密碼劣化,針對這一點:
- 1024比特的RSA不應被用于新的用途
- 2048比特的RSA可在2030年之前被用于新的用途
- 4096比特的RSA在2031年之后仍可被用于新的用途