什么是公鑰加密?
公共密鑰加密是一種使用兩個(gè)不同的密鑰對(duì)數(shù)據(jù)進(jìn)行加密,并讓其中一個(gè)密鑰(公共密鑰)可供任何人使用的方法。另一個(gè)密鑰稱為私鑰。用公鑰加密的數(shù)據(jù)只能用私鑰解密,而用私鑰加密的數(shù)據(jù)只能用公鑰解密。公鑰加密也稱為非對(duì)稱加密。它被廣泛采用,尤其是對(duì)于 TLS / SSL ,這使得 HTTPS 成為可能。
什么是加密密鑰?
在密碼學(xué)中,密鑰是用于打亂數(shù)據(jù)以便使其顯得隨機(jī)的一條信息;它通常是一個(gè)很大的數(shù)字,或者是一串?dāng)?shù)字和字母。當(dāng)使用密鑰將未加密的數(shù)據(jù)(也稱為明文)放入加密算法中時(shí),明文會(huì)從另一面看似隨機(jī)數(shù)據(jù)。但是,任何擁有正確密鑰解密數(shù)據(jù)的人都可以將其放回純文本格式。
例如,假設(shè)我們有一條純文本消息,”你好“, 然后用密鑰*加密;假設(shè)密鑰是" 2jd8932kd8“。使用此密鑰加密后,簡(jiǎn)單的一句”你好“現(xiàn)在會(huì)成為密文 "X5xJCSycg14 = " ,這似乎是隨機(jī)的垃圾數(shù)據(jù)。但是,通過使用相同的密鑰對(duì)其進(jìn)行解密,我們將能轉(zhuǎn)回成”你好" 。
純文本+密鑰=密文:
你好+ 2jd8932kd8 = X5xJCSycg14 =
密文+密鑰=純文本明文:
X5xJCSycg14 = + 2jd8932kd8 =你好
(這是對(duì)稱加密的示例,其中僅使用一個(gè)密鑰。)
*使用Blowfish算法、CBC模式和Base64編碼。
公鑰加密如何運(yùn)作?
對(duì)于初學(xué)者來說,公鑰加密似乎很復(fù)雜;幸運(yùn)的是,一位名為 Panayotis Vryonis 的作者做過一個(gè)比喻,大致如下。
想象一下,鮑勃和愛麗絲這兩個(gè)人用一個(gè)帶鎖的箱子來回運(yùn)送文件。通常來說鎖只有兩種狀態(tài):上鎖和解鎖。任何有鑰匙的人都可以打開上鎖的箱子,反之亦然。當(dāng)鮑勃鎖上箱子并將其運(yùn)送給愛麗絲的時(shí)候,他知道愛麗絲可以使用復(fù)制的鑰匙來解開箱子。從本質(zhì)上講,這就是所謂的對(duì)稱加密的工作方式:一個(gè)秘鑰同時(shí)用于加密和解密,對(duì)話的雙方都使用相同的密鑰。
現(xiàn)在,想象一下,鮑勃制作了一種帶有特殊鎖的行李箱。此鎖具有三個(gè)狀態(tài),而不是兩個(gè):
A.鎖定,鑰匙一直旋轉(zhuǎn)到左側(cè)
B.解鎖,鑰匙旋轉(zhuǎn)到中間。
C.鎖定,鑰匙一直旋轉(zhuǎn)到右側(cè)。
該鎖帶有兩把鑰匙,而不是一把鑰匙:
1號(hào)鑰匙只能向左轉(zhuǎn)
2號(hào)鑰匙只能向右轉(zhuǎn)
這意味著如果后備箱被鎖定并且鑰匙轉(zhuǎn)到位置A,只有2號(hào)鑰匙可以通過向右轉(zhuǎn)到位置B(解鎖)來解鎖。如果行李箱鎖定在位置C,則只有1號(hào)鑰匙可以通過將鎖向左轉(zhuǎn)動(dòng)到位置B來解鎖。
換言之,兩把鑰匙任選其一都可以鎖定箱子,但是一旦鎖定后,只有另一把鑰匙可以解鎖箱子。
現(xiàn)在,假設(shè)鮑勃制作了幾十個(gè)只能向右旋轉(zhuǎn)的2號(hào)鑰匙,然后為他認(rèn)識(shí)的并且想要這把鑰匙的每個(gè)人都配了一把,并將其作為他的公共鑰匙。而他為自己保留了1號(hào)鑰匙,作為他的私鑰。這有什么作用?
愛麗絲可以通過箱子給鮑勃鮑勃發(fā)送機(jī)密數(shù)據(jù),并確信只有鮑勃可以將其解鎖。 一旦愛麗絲用從左到右旋轉(zhuǎn)的公共鑰匙鎖定了箱子,只有可以從右到左旋轉(zhuǎn)的鑰匙才能解鎖它。這意味著只有鮑勃的私鑰才能對(duì)其進(jìn)行解鎖。
如果箱子是用鮑勃自己的私鑰來上鎖,那愛麗絲就能確信這個(gè)箱子的確來自鮑勃而不是有人冒充。 只有一把鑰匙可以讓箱子鎖定在位置A或者說能向左旋轉(zhuǎn),那就是鮑勃的私鑰。的確,任何人都可以通過只能向右旋轉(zhuǎn)的公共鑰匙來解鎖,但這可以保證箱子的確來自鮑勃。
以此類推,在這個(gè)比喻中,純文本信息就是箱子,密鑰就等同于實(shí)體鑰匙,這就是公共密鑰加密的運(yùn)作方式。只有私鑰的所有者才能加密數(shù)據(jù),讓公鑰對(duì)其進(jìn)行解密;同時(shí),任何人都可以使用公鑰加密數(shù)據(jù),但是只有私鑰的所有者才能解密它。
因此,任何人都可以安全地將數(shù)據(jù)發(fā)送給私鑰所有者。此外,任何人都可以驗(yàn)證從私鑰所有者那里收到的數(shù)據(jù)確實(shí)是來自該人而非冒充者。
TLS / SSL如何使用公共密鑰加密?
公鑰加密對(duì)于在互聯(lián)網(wǎng)(通過 HTTPS)建立安全通信非常有用。網(wǎng)站公開共享的SSL/TLS 證書包含公鑰,而私鑰安裝在源站,并由網(wǎng)站所“保有"。
TLS握手使用公共密鑰加密技術(shù)對(duì)源站的身份進(jìn)行身份驗(yàn)證,并交換用于生成對(duì)話密鑰的數(shù)據(jù)。諸如RSA或Diffie-Hellman之類的密鑰交換算法,使用公私鑰對(duì)來協(xié)商會(huì)話密鑰,一旦握手完成,會(huì)話密鑰將用于對(duì)稱加密。客戶端和服務(wù)器能夠?yàn)槊總€(gè)通信會(huì)話約定新的會(huì)話密鑰,從而即使惡意角色識(shí)別或竊取了會(huì)話密鑰之一也無法解密通信。