原文鏈接,非常好的橢圓曲線加密技術(shù)入門文章。如發(fā)現(xiàn)錯(cuò)誤,請(qǐng)留言或者發(fā)送郵件到zwzm85@gmail.com。未經(jīng)授權(quán),請(qǐng)勿轉(zhuǎn)載。
橢圓曲線加密技術(shù)(Elliptic Curve Cryptography,簡(jiǎn)稱ECC)是當(dāng)今廣泛使用的最強(qiáng)大但最不被理解的加密技術(shù)之一。在CloudFlare,我們重度使用ECC加密從客戶的HTTPS連接到數(shù)據(jù)中心傳輸數(shù)據(jù)的所有一切內(nèi)容。
本質(zhì)上,我們相信在信任任何安全系統(tǒng)之前弄明白其背后的技術(shù)十分重要。為了這個(gè)目的,我們到處尋找質(zhì)量?jī)?yōu)良并且相對(duì)容易理解的ECC入門教程給我們的用戶。最后一無(wú)所獲,我們決定自己來(lái)寫(xiě)這個(gè)教程。接下來(lái)的內(nèi)容就是。
請(qǐng)注意:這是個(gè)十分復(fù)雜的話題,不可能在一個(gè)簡(jiǎn)練的博客中寫(xiě)完。換句話說(shuō),因?yàn)樯婕暗膬?nèi)容太多,所以這篇文章是其精華版。如果你只需要重點(diǎn),那就是:ECC是基于當(dāng)前數(shù)學(xué)知識(shí)的下一代公鑰加密技術(shù),可以提供明顯比類似RSA的第一代公鑰加密技術(shù)更加安全的基礎(chǔ)。如果你正在為既可以獲得最高安全級(jí)別又保持性能的問(wèn)題而發(fā)愁,ECC就是合適的選擇。如果你對(duì)其細(xì)節(jié)感興趣,請(qǐng)看下文。
公鑰加密技術(shù)的起源
加密技術(shù)的歷史可以劃分成兩個(gè)時(shí)代:古典時(shí)代和現(xiàn)代。兩者的轉(zhuǎn)捩點(diǎn)位于1977年,當(dāng)時(shí)出現(xiàn)了RSA算法和Diffie-Hellman密鑰交換算法。這兩個(gè)新算法具有革命性,因?yàn)樗鼈兪堑谝环N切實(shí)可行的基于數(shù)論的加密方案,其安全性基于數(shù)論。它首次實(shí)現(xiàn)了通訊雙方不需要共享密碼就可以進(jìn)行安全交流。密碼學(xué)中如何實(shí)現(xiàn)雙方安全通訊的技術(shù)從需要在全世界范圍內(nèi)安全傳遞密碼本,演變成無(wú)需擔(dān)心中間人竊聽(tīng)的密鑰交換。
現(xiàn)代密碼學(xué)基礎(chǔ)是:加密數(shù)據(jù)的密鑰可以公開(kāi),但解密的密鑰要保密(譯者語(yǔ):公約加密,私鑰解密;私鑰簽名,公約驗(yàn)證)。因此,這些系統(tǒng)被稱為公鑰加密系統(tǒng)。第一個(gè)這樣的系統(tǒng)是RSA,至今任然被廣泛使用。命名為RSA是為了紀(jì)念該算法最初的三個(gè)發(fā)明人:Ron Rivest, Adi Shamir and Leonard Adleman(譯者語(yǔ):為了方面對(duì)照RSA三個(gè)字母,名字不做翻譯)。
為了使公鑰加密系統(tǒng)工作,你需要一系列在一個(gè)方向上容易計(jì)算但是反向計(jì)算困難的算法。以RSA為例,容易的算法會(huì)做兩個(gè)素?cái)?shù)乘法。如果乘法是容易的算法,那么與之配對(duì)的困難的算法是把乘法的積因式分解為兩個(gè)素?cái)?shù)。有如下特性的算法被稱為陷門函數(shù):在一個(gè)方向上容易計(jì)算,其他方向上難以計(jì)算。找尋優(yōu)秀的陷門函數(shù)對(duì)創(chuàng)建安全的公鑰加密系統(tǒng)至關(guān)重要。簡(jiǎn)單點(diǎn)說(shuō):一個(gè)陷門函數(shù)越難從一個(gè)方向到其他方向,基于它的加密系統(tǒng)就越安全。
一個(gè)玩具RSA算法
RSA算法是最流行和最被大眾熟識(shí)的公鑰加密系統(tǒng)。它的安全性依賴于因式分解很慢但乘法很快的事實(shí)。下面我們快速瀏覽一下小型RSA系統(tǒng)的樣子及其工作原理。
正常情況,公鑰加密系統(tǒng)有兩個(gè)組件:一個(gè)公鑰和一個(gè)私鑰。加密會(huì)接收一個(gè)消息,然后對(duì)其應(yīng)用數(shù)學(xué)操作獲取一個(gè)隨機(jī)的數(shù)字。解密會(huì)對(duì)那個(gè)隨機(jī)的數(shù)字應(yīng)用一個(gè)不同的操作重新獲得原來(lái)的數(shù)字。使用公鑰加密只能被對(duì)應(yīng)的私鑰解密。
計(jì)算機(jī)不能很好地處理任意長(zhǎng)度的大數(shù)字。我們要確保處理的數(shù)字不能大于選擇的最大數(shù),只處理比最大數(shù)小的數(shù)字。我們處理數(shù)字的方式類似時(shí)鐘上的數(shù)字。任何導(dǎo)致結(jié)果大于最大值的計(jì)算都需要把其處理到有效范圍內(nèi)。
在RSA中,這個(gè)最大值(稱為max)由兩個(gè)隨機(jī)的素?cái)?shù)相乘得到。公鑰和私鑰是兩個(gè)專門被選擇的數(shù)字并且大于零小于最大值,分別稱為pub和priv。要加密一個(gè)數(shù)字,你需要把它乘以自己pub次,注意當(dāng)結(jié)果超過(guò)最大值的時(shí)候需要處理它。要解密一個(gè)消息,你需要把它乘以自己priv次,然后你就可以重新得到原來(lái)的數(shù)字了。這聽(tīng)起來(lái)讓人驚訝,但是確實(shí)有效。這個(gè)特性被發(fā)現(xiàn)的時(shí)候,確實(shí)是一個(gè)重大突破。
要?jiǎng)?chuàng)建一個(gè)RSA密鑰對(duì),首先隨機(jī)選取兩個(gè)素?cái)?shù)以生成最大值(max)。然后選取一個(gè)數(shù)作為公鑰pub。只要你知道這兩個(gè)素?cái)?shù),你就可以根據(jù)這個(gè)公鑰計(jì)算出對(duì)應(yīng)的私鑰priv。這就是破解RSA所需用到的因式分解:把最大值因式分解成兩個(gè)素?cái)?shù)以便你可以從公鑰計(jì)算出某人私鑰,然后解密他們的私有消息。
讓我們用個(gè)例子來(lái)具體說(shuō)明。以素?cái)?shù)13和7為例子,它們的乘積作為最大值是91。假設(shè)我們的公鑰是數(shù)字5。那么我們已知7和13是91的因子,然后應(yīng)用名為“擴(kuò)展歐幾里得算法”的算法,我們得到私鑰是數(shù)字29(譯者語(yǔ):有興趣的同學(xué)可以自己計(jì)算一下,(29, -2)是其中一組解,(101,-7)是另一組解)。
譯者語(yǔ):作者可能因?yàn)橹饕且榻BECC,所以這里對(duì)RSA的介紹比較簡(jiǎn)單。整個(gè)RSA系統(tǒng)涉及的數(shù)字有:p,q,n,k,e,d。具體含義如下:p和q是兩個(gè)隨機(jī)的素?cái)?shù),n等于p乘以q,也就是文中的max。k也是基于p和q計(jì)算而來(lái),k=(p-1)(q-1)。數(shù)學(xué)上稱為歐拉函數(shù),主要用于計(jì)算私鑰。e是公鑰,可以隨意選取,但目前行業(yè)上中普遍選取65537。然后使用穩(wěn)重提到的擴(kuò)展歐幾里得算法求解出一組私鑰d。
但是RSA的密鑰一般用(e,n)和(d,n)分別表示公鑰和私鑰。所以如果使用RSA的證書(shū),瀏覽器就會(huì)知道e和n的值。
可能有些細(xì)心的讀者會(huì)問(wèn)為什么因式分解是RSA陷門函數(shù)的另一個(gè)方向。我們知道公鑰中包含n,這個(gè)n是由p乘以q的出來(lái)的。后面計(jì)算私鑰時(shí)又要用到k,其等于(p-1)(q-1)。所以要破解RSA必須計(jì)算出p和q,答案就在于此。
這些參數(shù)(max:91, pub:5, priv:29)定義了一個(gè)功能完備的RSA系統(tǒng)。你可以用一個(gè)數(shù)乘以自己5次來(lái)加密它,然后用那個(gè)數(shù)字(譯者語(yǔ):加密后的數(shù)字)乘以自己29次,那么你就會(huì)得到原來(lái)的數(shù)字。
讓我們使用這些值(譯者語(yǔ):那三個(gè)參數(shù))來(lái)加密“CLOUD”這條消息。
為了以數(shù)學(xué)方式表示這個(gè)消息,我們需要把字母轉(zhuǎn)換成數(shù)字。常用的拉丁字母表示方式是UTF-8。每個(gè)字母都對(duì)應(yīng)一個(gè)數(shù)字。
依據(jù)這個(gè)編碼規(guī)則,CLOUD就是67,76,79,85,68。每個(gè)數(shù)字都小于最大值91,所以我們可以各自加密它們。讓我們從第一個(gè)字母開(kāi)始。
我們要把它乘以自身5次以得到加密后的值。
因?yàn)?489比最大值要大,我們必須處理一下它。我們把它除以91,保留余數(shù)。
4489=91x41+30
這意味著數(shù)字67加密后是58。
對(duì)每個(gè)字母重復(fù)上述步驟我們得到加密后的消息CLOUD是:
58,20,53,50,87
要解密這一團(tuán)亂的消息,我們需要讓每個(gè)數(shù)字都乘以其自身29次:
(記住,我們需要在結(jié)果大于最大值時(shí)處理它)
...
瞧,我們有重新得到了67。這對(duì)其他的數(shù)字都有效,可以復(fù)原初始消息了。
需要注意的是你用一個(gè)數(shù)乘以它自身多次得到了一個(gè)隨機(jī)的數(shù)字,然后再把那個(gè)隨機(jī)數(shù)字乘以它自身多次(具體次數(shù)是保密的),就可以恢復(fù)原始數(shù)字。
并不是一個(gè)完美的陷門
RSA和Diffie-Hellman之所以如此的有影響力是因?yàn)樗鼈冇袊?yán)格的安全性證明。作者證明想要破解系統(tǒng)等同于解決一個(gè)公認(rèn)難以解決的數(shù)學(xué)難題。因式分解是一個(gè)眾所周知的問(wèn)題,并且在古代就已經(jīng)進(jìn)行研究(見(jiàn)埃拉托斯特尼篩法)。任何這方面的突破都將會(huì)是重大新聞,并且還可以給發(fā)現(xiàn)者帶來(lái)巨大的意外之財(cái)。
也就是說(shuō),因式分解并不是最難的問(wèn)題。特定的算法例如二次篩選法和普通數(shù)域篩選法被創(chuàng)造出來(lái)解決素?cái)?shù)分解并且取得了一定的成功。這些算法相比原生的猜已知素?cái)?shù)對(duì)方法要更快且計(jì)算量更少。
這些算法在需因式分解的數(shù)越大就越高效。當(dāng)數(shù)字(即密鑰的比特長(zhǎng)度)變大時(shí),因式分解大數(shù)字和大數(shù)字相乘之間的難度差距正在縮小。當(dāng)可以用來(lái)解密的資源越來(lái)越多時(shí),密鑰的長(zhǎng)度增長(zhǎng)的卻更快。這對(duì)于計(jì)算能力有限的手機(jī)和低功耗設(shè)備來(lái)說(shuō)是不可持續(xù)性的。因式分解和乘法之間的差距不會(huì)維持很久。
以上所有的這些都意味著RSA并不是未來(lái)密碼學(xué)的理想系統(tǒng)。在一個(gè)理想的陷門函數(shù)中,隨著數(shù)字越大,簡(jiǎn)單的方法和困難的方法是以相同的速率變的更加困難。
我們需要一個(gè)基于更好的陷門的公鑰系統(tǒng)。
橢圓曲線:構(gòu)建更好的陷門
在RSA和Diffie-Hellman出現(xiàn)之后,研究人員探索其他基于數(shù)學(xué)的加密方案,希望找到超越因式分解的算法作為優(yōu)良的陷門函數(shù)。在1985年,出現(xiàn)了基于被稱為橢圓曲線的深?yuàn)W數(shù)學(xué)分支的加密算法。
但是橢圓曲線到底是什么和基于它的陷門函數(shù)如何工作呢?很不幸,不像因式分解——我們都會(huì)在中學(xué)第一次接觸它——大多數(shù)人不熟悉橢圓曲線相關(guān)的數(shù)學(xué)知識(shí)。數(shù)學(xué)不簡(jiǎn)單,也很難解釋清楚,但我將在下面幾節(jié)中嘗試一下(如果你開(kāi)始糊涂了,你可以直接跳到這個(gè)章節(jié):這到底意味著什么(譯者語(yǔ):沒(méi)有相關(guān)數(shù)學(xué)背景的同學(xué)看這幾小節(jié)可能出現(xiàn)的場(chǎng)景如下:我是誰(shuí)?我在哪?我在干什么?:smirk:))。
橢圓曲線是一系列滿足特定數(shù)學(xué)方程式的點(diǎn)的集合。一個(gè)橢圓曲線方程式看起來(lái)類似這樣:
這個(gè)圖形看起來(lái)有點(diǎn)像往側(cè)面傾斜的Lululemon(譯者語(yǔ):加拿大的一家運(yùn)動(dòng)服裝零售商)的標(biāo)志:
還有其他展示類型的橢圓曲線,但是在技術(shù)層面上,橢圓曲線就是滿足特定二元方程式的點(diǎn)的集合,該方程式的一個(gè)變量的次數(shù)是2,另一個(gè)變量的次數(shù)是3。橢圓曲線不只是一副漂亮的圖片,它還有一些成為優(yōu)秀加密技術(shù)的特性。
奇特的對(duì)稱性
再來(lái)進(jìn)一步看一下上面繪制出的橢圓曲線。它有一些有趣的特性。
其中之一就是水平對(duì)稱性。曲線上的任何點(diǎn)的x軸對(duì)稱點(diǎn)一定也在曲線上。一個(gè)更有趣的特性是任何非垂直的直線和曲線的交點(diǎn)最多不會(huì)超過(guò)三個(gè)。
讓我們想象一個(gè)以這條曲線為背景的古怪的臺(tái)球游戲。在曲線上取任意兩點(diǎn)然后在它們之間畫(huà)一條直線,那么它將會(huì)和曲線相交于另一點(diǎn)。在這個(gè)臺(tái)球游戲中,你在A點(diǎn)拿著一個(gè)球,把它射向B點(diǎn)。當(dāng)它撞擊到曲線時(shí),球會(huì)朝著曲線的另一側(cè)向上反彈(如果它位于x軸下方)或者向下反彈(如果它位于x軸上方)。
我們將這個(gè)臺(tái)球在兩點(diǎn)的運(yùn)動(dòng)稱為“dot”(譯者語(yǔ):這里不做翻譯,保持原文。因?yàn)橄旅娴墓绞褂玫囊彩莇ot)。曲線上的任意兩點(diǎn)都可以被連接在一起,從而得到一個(gè)新的點(diǎn)。
A dot B = C
我們可以把上述運(yùn)動(dòng)串聯(lián)起來(lái),一遍又一遍的對(duì)一個(gè)點(diǎn)進(jìn)行“dot”。
A dot A = B
A dot B = C
A dot C = D
...
事實(shí)證明,如果你有兩個(gè)點(diǎn),一個(gè)初始點(diǎn)“dot”自身n次會(huì)到達(dá)一個(gè)終點(diǎn),當(dāng)你只知道初始點(diǎn)和終點(diǎn)想求解出n很難。繼續(xù)我們古怪的臺(tái)球這個(gè)比喻,想象有個(gè)人在房間中獨(dú)自一人玩了隨機(jī)時(shí)長(zhǎng)的我們的游戲。他很容易按照上述規(guī)則反復(fù)的擊球。如果后來(lái)有人走進(jìn)房間,看到了球最后停留的位置。即使他知道游戲的規(guī)則和球的起點(diǎn),除非重新走一遍整個(gè)游戲直到球來(lái)到同一位置,否則他不可能確定球要撞擊幾次。做起來(lái)容易,但是反向解開(kāi)很難:這正是一個(gè)非常好的陷門函數(shù)的基礎(chǔ)。
譯者語(yǔ):這里使用臺(tái)球游戲來(lái)說(shuō)明橢圓曲線是很好的陷門函數(shù)譯者覺(jué)得不太合適。我自己在看的時(shí)候就特別疑惑。為什么重新走一遍游戲會(huì)很困難??jī)烧叩碾y度應(yīng)該是等價(jià)的。第二個(gè)人在玩游戲的過(guò)程除了每次對(duì)比一下球的落點(diǎn)是不是最終的位置之外并沒(méi)有其他的難度。后來(lái)我去網(wǎng)上查閱了資料才明白反向解開(kāi)為什么難。這里簡(jiǎn)單說(shuō)一下。尋找最終點(diǎn)的過(guò)程等同于A dot A dot A dot A dot ...A N次,如果已知N,可以使用類似快速冪這樣的方法大大減少執(zhí)行dot操作的次數(shù),復(fù)雜度是O(logN)。但如果N未知,只能執(zhí)行N次dot,復(fù)雜度是O(N)。由于dot本身計(jì)算復(fù)雜度就比乘法這些高,所以當(dāng)N值很大時(shí)(比如256位)執(zhí)行N次dot操作會(huì)比logN時(shí)間長(zhǎng)的多得多。
讓我們開(kāi)始
上面的簡(jiǎn)化版曲線看起來(lái)很棒也很容易講解橢圓曲線的基本概念,但是這并不表示密碼學(xué)所使用的曲線也是如此。
我們必須把數(shù)字限定在一個(gè)固定的范圍,就像在RSA中那樣。我們限定所有的數(shù)字必須在一個(gè)固定范圍內(nèi),而不是允許曲線上的點(diǎn)的任意值。當(dāng)計(jì)算橢圓曲線方程()時(shí),我們要對(duì)超過(guò)最大值的數(shù)字使用相同技巧來(lái)回滾它們。如果我們選擇的最大值是素?cái)?shù),那該橢圓曲線被稱為素?cái)?shù)曲線,擁有極好的加密特性。
這是一個(gè)適用所有數(shù)字的曲線()圖:
這個(gè)是同樣的曲線圖,但是限制所有點(diǎn)代表的值不能超過(guò)最大值97:
從傳統(tǒng)意義上很難看出這像曲線,但是它確實(shí)是。這好像原來(lái)的曲線被在邊緣出纏繞一樣,并且只有符合是整數(shù)的坐標(biāo)才會(huì)被著色。你甚至仍然可以看出其水平對(duì)稱性。
事實(shí)上,你還可以在這個(gè)曲線上玩臺(tái)球游戲并且將點(diǎn)點(diǎn)在一起。曲線上的方程式仍然具有一樣的屬性。此外,dot操作也可以高效地運(yùn)算。你可以將兩個(gè)點(diǎn)視為有條線在邊界環(huán)繞直到它到達(dá)一個(gè)點(diǎn)。就好像在我們古怪的臺(tái)球游戲中,當(dāng)球撞擊到球桌邊緣(就是max)時(shí),它會(huì)被神奇地運(yùn)送到桌子的另一側(cè)然后繼續(xù)其行進(jìn)路線直到到達(dá)一個(gè)點(diǎn),類似《爆破彗星》(譯者語(yǔ):是由Atari公司在1979年發(fā)行的一個(gè)街機(jī)游戲,它是街機(jī)黃金年代里最受歡迎的游戲之一)游戲。
有了這個(gè)新的曲線表示形式,你可以把消息表示成曲線上的點(diǎn)。你可以想象你有一個(gè)消息,把它設(shè)置成x坐標(biāo),然后在曲線上算出對(duì)應(yīng)點(diǎn)(譯者語(yǔ):x坐標(biāo)相同的那個(gè)點(diǎn),可能會(huì)有兩個(gè))的y坐標(biāo)。實(shí)際操作上會(huì)更加復(fù)雜一些,但是原理相同。
你得到了下面這些點(diǎn):
(70, 6), (76,48), -, (82,6), (69,22)
不存在x值是65的坐標(biāo),在現(xiàn)實(shí)中可以避免這種情況
可以通過(guò)選取一個(gè)素?cái)?shù)作為最大值、一個(gè)曲線方程和曲線上的一個(gè)公開(kāi)點(diǎn)來(lái)定義橢圓曲線加密系統(tǒng)。私鑰是一個(gè)數(shù)字priv,公鑰是公開(kāi)點(diǎn)對(duì)自己執(zhí)行dot操作priv次以后得到的那個(gè)點(diǎn)。以這種方式從公鑰計(jì)算私鑰在加密系統(tǒng)中被稱為橢圓曲線離散對(duì)數(shù)函數(shù)。它被就是我們要找的陷門函數(shù)。
這到底意味著什么
橢圓曲線離散對(duì)數(shù)難題是支撐橢圓曲線密碼學(xué)的基礎(chǔ)。盡管經(jīng)過(guò)了差不多三十多年的研究,數(shù)學(xué)家仍然沒(méi)有發(fā)現(xiàn)比原始方法更快的算法來(lái)解決這個(gè)問(wèn)題。換句話說(shuō),與因式分解不同的是,以當(dāng)今數(shù)學(xué)發(fā)展水平,還沒(méi)有一種捷徑可以縮短基于該問(wèn)題的陷門函數(shù)的兩個(gè)方向上難易差距。這意味著對(duì)于相同大小的數(shù)字,解決橢圓曲線離散對(duì)數(shù)遠(yuǎn)遠(yuǎn)難于因式分解。由于更高計(jì)算強(qiáng)度的難題等同于更安全的加密系統(tǒng),這意味著橢圓曲線加密系統(tǒng)比RSA和Diffie-Hellman加密系統(tǒng)更難以破解。
為了直觀感受破解難度的增加,Lenstra最近提出了一個(gè)“Global Security”的概念。你可以計(jì)算破解一個(gè)加密算法需要多少能量,然后對(duì)比這些能量可以將多少水燒開(kāi)。這是一種密碼學(xué)的碳足跡(譯者語(yǔ):原文是carbon footprint,用來(lái)標(biāo)示一個(gè)人或者團(tuán)體的碳耗用量)。依據(jù)這個(gè)測(cè)算,破解一個(gè)228位的RSA密鑰需要的能量比燒開(kāi)一茶匙的水還要少。相比之下,破解一個(gè)228位的橢圓曲線密鑰所需的能量足夠把地球上所有的水都燒開(kāi)。想要RSA達(dá)到相同的安全等級(jí),你需要2380位的密鑰。
使用ECC,你可以用更短的密鑰獲得一樣的安全等級(jí)(譯者語(yǔ):對(duì)比RSA的密鑰長(zhǎng)度)。短密鑰很重要,因?yàn)樵絹?lái)越多的加密是由類似手機(jī)的低功耗設(shè)備來(lái)完成。盡管乘以兩個(gè)素?cái)?shù)比把乘積因式分解要簡(jiǎn)單,但是低功耗設(shè)備上當(dāng)素?cái)?shù)變的非常大時(shí)僅僅乘法也要耗費(fèi)一些時(shí)間。盡管可以通過(guò)增加密鑰長(zhǎng)度來(lái)繼續(xù)保證RSA安全性,但是其代價(jià)是拖慢客戶端加密性能。ECC的出現(xiàn)提供了更好的權(quán)衡:用短、快的密鑰提供高安全性。
橢圓曲線實(shí)戰(zhàn)
在緩慢的開(kāi)端之后,橢圓曲線算法開(kāi)始廣受歡迎且使用量一直加速增長(zhǎng)。橢圓曲線加密技術(shù)被廣泛使用在不同類型的應(yīng)用中:美國(guó)政府用它來(lái)保護(hù)內(nèi)部通訊,Tor項(xiàng)目使用它來(lái)幫助確保匿名,比特幣用它做所有權(quán)證明,蘋果的iMessage服務(wù)用它來(lái)簽名,DNSCurve使用它來(lái)加密DNS信息,它是通過(guò)SSL/TLS進(jìn)行安全網(wǎng)絡(luò)瀏覽的首選方法。CloudFlare使用橢圓曲線加密技術(shù)提供完美的向前安全性,這是在線隱私的基礎(chǔ)。類似RSA和Diffie-Hellman這樣的第一代加密算法在大多數(shù)領(lǐng)域里仍然是規(guī)范,但是橢圓加密技術(shù)正在迅速稱為在線隱私和安全的首選解決方案。
如果你是用足夠新版本的Chrome或者Firefox訪問(wèn)HTTPS版本的本博客,你的瀏覽器正在使用橢圓曲線加密技術(shù)。你可以自己檢查一下。在Chrome中,你可以點(diǎn)擊地址欄中的鎖圖標(biāo)(譯者語(yǔ):地址欄最左面),然后去連接標(biāo)簽看用來(lái)建立安全連接使用的是哪種加密算法。在Chrome 30里點(diǎn)擊鎖圖標(biāo)應(yīng)該出現(xiàn)以下圖片中的內(nèi)容:
這段文字和本文討論相關(guān)點(diǎn)就是ECDHE_RSA。ECDHE代表Elliptic Curve Diffie Hellman Ephemeral,是一種基于橢圓曲線的密鑰交換機(jī)制。這個(gè)算法被CloudFlare用來(lái)在SSL中提供完美向前安全性。RSA組件的含義是RSA被用來(lái)證明服務(wù)器的身份。
我們使用RSA是因?yàn)镃loudFlare的SSL證書(shū)綁定的是RSA密鑰對(duì)?,F(xiàn)代瀏覽器也支持基于橢圓曲線的證書(shū)。如果CloudFlare的SSL證書(shū)是橢圓曲線證書(shū),那上面圖片中會(huì)是ECDHE_ECDSA。服務(wù)器的身份證明將使用ECDSA,即橢圓曲線數(shù)字簽名算法(Elliptic Curve Digital Signature Algorithm)。
CloudFlare用于ECDHE的ECC曲線是(Google.com也使用這個(gè)曲線):
ECDSA相比RSA有非常大的性能提升。即使在沒(méi)有對(duì)橢圓曲線代碼進(jìn)行匯編優(yōu)化的老版本OpenSSL中,256位密鑰長(zhǎng)度的ECDSA簽名也比2048位密鑰長(zhǎng)度的RSA快20倍以上。
在一臺(tái)MacBook Pro上使用OpenSSL 0.9.8,執(zhí)行速度的基準(zhǔn)測(cè)試結(jié)果如下:
Doing 256 bit sign ecdsa's for 10s: 42874 256 bit ECDSA signs in 9.99s
Doing 2048 bit private rsa's for 10s: 1864 2048 bit private RSA's in 9.99s
使用ECDSA簽名比RSA簽名快23倍。
CloudFlare一直致力于提升SSL性能。就在這個(gè)星期,CloudFlare開(kāi)始使用匯編優(yōu)化后的版本的ECC,其運(yùn)行速度超過(guò)ECDHE的兩倍。使用橢圓曲線加密技術(shù)節(jié)省服務(wù)器和瀏覽器的時(shí)間、能源和計(jì)算資源,幫助我們實(shí)現(xiàn)更快更安全的網(wǎng)絡(luò)。
缺點(diǎn)
橢圓曲線并不是完美無(wú)瑕的,存在一些問(wèn)題和不確定性阻礙工業(yè)界每個(gè)人都接受它。
最近在新聞上被爆出的是雙重橢圓曲線確定性隨機(jī)比特生成器(Dual_EC_DRBG)。這是由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)標(biāo)準(zhǔn)化的隨機(jī)數(shù)生成器,由NSA推廣使用。Dual_EC_DRBG使用橢圓曲線運(yùn)算生成隨機(jī)數(shù)。這個(gè)算法需要在曲線上獲取兩個(gè)點(diǎn),然后多次執(zhí)行橢圓曲線的“dot”操作。發(fā)布以后就被報(bào)道說(shuō)它可能被設(shè)計(jì)留有后門,意味著返回的隨機(jī)數(shù)序列可以被擁有正確密碼數(shù)字的人完全預(yù)測(cè)出來(lái)。最近,RSA公司召回了一些它們的產(chǎn)品,就是因?yàn)槠浒踩盗挟a(chǎn)品使用這個(gè)隨機(jī)數(shù)生成器作為其默認(rèn)偽隨機(jī)數(shù)生成器。無(wú)論這個(gè)隨機(jī)數(shù)生成器是否有后門,都不會(huì)改變橢圓曲線技術(shù)本身的優(yōu)點(diǎn),但是它確實(shí)引出了橢圓曲線標(biāo)準(zhǔn)化流程的問(wèn)題。正如之前所寫(xiě)的那樣,也應(yīng)該確保你系統(tǒng)使用足夠隨機(jī)的數(shù)字的原因之一。在未來(lái)的博客中,我們會(huì)討論后門是如何混入該算法的規(guī)范。世界上有一些持懷疑態(tài)度的密碼學(xué)家普遍不信任NIST本身和其發(fā)布并被NSA支持的這些標(biāo)準(zhǔn)。幾乎所有已實(shí)現(xiàn)的橢圓曲線都屬于這個(gè)范疇。目前并沒(méi)有針對(duì)這些特定被選為計(jì)算高效的曲線的攻擊事件,但是不好的曲線確實(shí)存在,安全比道歉更好。有一些非NIST的計(jì)算高效的曲線正在開(kāi)發(fā)中,包括Daniel Bernstein(djb)發(fā)明的曲線25519,和最近由Paulo Baretto和合作者計(jì)算出的曲線,但是廣泛使用這些曲線還需要幾年的時(shí)間。除非瀏覽器實(shí)現(xiàn)這些非傳統(tǒng)曲線,否則它們不能在網(wǎng)絡(luò)上被用于安全的加密傳輸。
另一個(gè)關(guān)于橢圓加密技術(shù)的不確定性是專利。黑莓公司(通過(guò)2009年收購(gòu)Certicom獲得)擁有超過(guò)130個(gè)特定用途的橢圓曲線專利。很多這些專利被授權(quán)給私人企業(yè)甚至是NSA使用。這讓一些開(kāi)發(fā)者暫停了他們ECC實(shí)現(xiàn),因?yàn)椴淮_定是否侵犯了這些專利。在2007年,Certicom訴訟索尼公司侵權(quán)使用一些橢圓曲線,但是在2009年被撤回了?,F(xiàn)在有很多不會(huì)侵犯這些專利的橢圓曲線加密技術(shù)被廣泛使用。
ECDSA數(shù)字簽名相比于RSA有一個(gè)缺點(diǎn),它需要一個(gè)好的熵的來(lái)源。沒(méi)有良好的隨機(jī)性,私鑰可能被泄露。Android上的隨機(jī)數(shù)生成器缺陷讓黑客與2013年發(fā)現(xiàn)了幾個(gè)人用來(lái)保護(hù)比特幣錢包的ECDSA私鑰。索尼的Playstation的ECDSA實(shí)現(xiàn)也有類似的漏洞。電子簽名需要一個(gè)良好的隨機(jī)數(shù)產(chǎn)生源。不推薦使用Dual_EC_DRBG。
展望未來(lái)
盡管有上述這些問(wèn)題,但是橢圓曲線加密技術(shù)優(yōu)于傳統(tǒng)的RSA事實(shí)還是被廣泛接受。很多專家擔(dān)心RSA和Diffie-Hellman背后的數(shù)學(xué)算法可能在5年之內(nèi)被破解,那么ECC就是唯一可用的選擇了。
所有現(xiàn)代瀏覽器都支持橢圓曲線,并且大多數(shù)證書(shū)頒發(fā)機(jī)構(gòu)都提供橢圓曲線證書(shū)。每一個(gè)通過(guò)現(xiàn)代瀏覽器的發(fā)起的對(duì)受CloudFlare保護(hù)的網(wǎng)站的SSL連接默認(rèn)都是使用ECC。很快,CloudFlare將會(huì)允許客戶上傳自己的橢圓曲線證書(shū)。這將會(huì)使得ECC即被用于身份驗(yàn)證又被用于加密傳遞的消息,全面加速HTTPS會(huì)話。當(dāng)功能可用時(shí)還會(huì)有更多好處。