橢圓曲線密碼學(Elliptic curve cryptography),簡稱ECC,是一種建立公開金鑰加密的演算法,也就是非對稱加密。類似的還有RSA,ElGamal演算法等。ECC被公認為在給定金鑰長度下最安全的加密演算法。比特幣中的公私鑰生成以及簽名演算法ECDSA都是基於ECC的。下面簡單介紹ECC以及ECDSA的原理。

從公鑰加密說起

  公鑰加密,也稱非對稱加密。可以說它現在是現代網路安全或者網路信任鏈的基礎。公鑰加密最大的特徵就是通訊雙方各有一對公私鑰,這一對公私鑰有著千絲萬縷的數學關係。每個人儲存自己的私鑰,公開自己的公鑰。這樣做的好處是不怕通訊線路被竊聽,即使被攻擊者拿到公鑰也沒有關係。公私鑰的基本使用場景主要有兩種:

假設通訊雙方叫Alice(公鑰A、私鑰a)和Bob(公鑰B、私鑰b)。

  • 公鑰加密,私鑰解密
  1. Alice寫了一封信,她不想讓別人知道。於是它用Bob的公鑰B對信的明文做了加密,密文為m。之後傳送給了Bob。
  2. Bob收到密文m,用自己的私鑰b對密文解密,正確的讀出了信的內容。

  整個過程中,即使竊聽者拿到密文m、兩個人的公鑰A、B都沒有什麼用,無法解密出任何東西。事實上,只有擁有私鑰b的人才能解密出這份資訊。換個角度來說,每個人都可以擁有Bob的公鑰B,也就是說,每個人都可以創造一份只有Bob可以使用或者說只對Bob來說有效的資訊。

  • 私鑰加密,公鑰解密
  1. Alice寫了一份公開宣告檔案,她用自己的私鑰a對檔案加了密,生成加密檔案m,公佈在自己的網站中。
  2. Bob下載了這份宣告檔案,並用Alice的公鑰A進行解密,正確的讀出檔案內容。

  這個過程聽起來有點奇怪,Alice既然公佈的是宣告檔案,是想讓別人閱讀的,而且每個人都可以拿到Alice的公鑰A,那麼為什麼還要加密呢?確實,每個人都可以對檔案解密,可是這裡的目的主要不是解密,而是對這份檔案的來源驗證,證明它肯定是由Alice發出的宣告。即使檔案被惡意篡改,那麼此時再拿公鑰A解密,就是無效的,由此可證明資訊被改動過了,並不是Alice的原來檔案。用這種方式使用公私鑰可以證明資訊的來源並且有不可否定的特性。(即Alice不能否認此資訊不是由她發出的,因為只有私鑰a可以產生加密檔案m)

  以上是使用公鑰加密演算法的基礎場景,但事實上用上述方法進行通訊還遠遠不夠,例如需要提高加密速度,需要先對檔案進行hash;再如不能抵禦中間人攻擊,(即獲取的公鑰不一定是正確的)需要引入證書,不過這些不在本文討論範圍之內。下面我們來看ECC是如何產生金鑰對的。

橢圓曲線

這一節讓我們來了解一些數學知識。

一般來說,橢圓曲線可以用下列方程式表示,a,b,c,d為係數(a≠0,ax^3+bx^2+cx+d=0沒有重根)

E:y^2=ax^3+bx^2+cx+d

例如,當a=1,b=0,c=-2,d=4時,所得到的橢圓曲線為:

E_1:y^2=x^3-2x+4

橢圓曲線下圖所示。

$E_1:y^2=x^3-2x+4$曲線

其實橢圓曲線並不是我們高中學習的橢圓形狀,其名字的由來是因為橢圓曲線的描述方程,類似於計算一個橢圓周長的方程。這裡用於加密的橢圓曲線的定義是一個特殊情況,完整定義參考這裡

有了影象,我們接下來就可以搞一搞事情了?

橢圓曲線的加法

在這裡首先要介紹一下群的概念。群是一種代數結構,由一個集合以及一個二元運算所組成。已知集合和運算(G,*)如果是群則必須滿足如下要求

  • 封閉性:∀a,b∈G,a * b ∈ G

  • 結合性:∀a,b,c∈G ,有 (a * b) * c = a * (b * c)

  • 單位元:ョe∈G, ∀a ∈G,有e * a = a * e = a

  • 逆元:∀a ∈G ,ョb∈G 使得 a * b = b * a = e

另外,有一種特殊的群叫阿貝爾群,它除了上面的性質還滿足交換律公理 a * b = b * a

舉個例子,在整數範圍內的加法運算就是一個阿貝爾群(Z,+)。

  • 封閉性:a和b是整數,那麼a+b肯定是整數。

  • 結合性:(a + b) + c = a + (b + c)。

  • 單位元:0即為單位元,因為對於所有整數a, a + 0 = 0 + a = a。

  • 逆元: a的逆元為-a,因為a + (-a) = 0,即單位元。

所以(Z,+)是阿貝爾群。

現在,我們來定義橢圓曲線上的加法。

現在有橢圓曲線y^2 = x ^ 3 - x,曲線上的點P和Q。過P和Q做一條直線,交橢圓曲線為點R',再過R'點做垂直於X軸的直線,交曲線另一點為R,定義P + Q = R。如下圖所示。

若P=Q,則為過P點的切線交於橢圓曲線為R'。如下圖所示。

  這樣,稱R = 2P。類似的,3P = P + P + P = P + 2P = P + R。也就是說,當給定點P時,“已知數x求點xG的運算”不難,因為有加法的性質,運算起來可以比較快。但反過來,“已知點xG求x的問題”則非常困難,因為只能遍歷每一個x做運算。這就是橢圓曲線密碼中所利用的“橢圓曲線上的離散對數問題”。

要想使這個運算滿足阿貝爾群的性質,我們還要引入一個無窮遠點O,可以把它理解為平行直線的交點(如果感覺難以理解,請參考無窮遠點的定義),我們把這個O點作為單位元。(方便理解,你可以當做所有平行於y軸的直線交於O點)。

有了上述無窮遠點的定義,不難證明橢圓曲線上的加法為一個阿貝爾群。

橢圓曲線上的離散對數問題

  橢圓曲線密碼利用了上述“運算”中的“橢圓曲線上的離散對數問題”的複雜度,就像RSA利用了“大數質因數分解”的複雜度,以及EIGamal密碼的Diffie-Hellman金鑰交換利用了“有限域上的離散對數問題”的複雜度一樣。

橢圓曲線上的離散對數問題:

  • 已知
    • 橢圓曲線E
    • 橢圓曲線E上一點G(基點)
    • 橢圓曲線E上的一點xG(x倍的G)
  • 求解
    • x

這個問題的難度保證了橢圓曲線密碼的安全性。

有限域上的橢圓曲線

  到這裡,橢圓曲線的定義及運算都是實數範圍內的,其實橢圓曲線密碼所使用的運算,是在有限域F_p上。有限域F_p是指對於某個給定的質數p,由0,1,2,.....,p-1共p個元素所組成的整數集合中定義的加減乘除運算。此運算使用的是模運算

我們來看一個具體的例子:

E_2:y^2 = x^3 + x + 1

當這個橢圓曲線E_2位於實數域R上時,影象如下圖所示,是一條光滑的曲線。

同樣是這條曲線,當位於有限域F_{23}上時,寫作:

E_2:y^2≡x^3+x+1(mod 23)

即左側與右側的結果除以23的餘數相等,也叫左側與右側的數值模23同餘。於是上述影象並不是一條曲線,而是一些離散的點。影象如下圖所示。

如果我們以橢圓曲線上的點P =(3,10)為基點,按照橢圓曲線“加法”運算的規則計算2P,3P,4P...結果如下圖所示。

我們可以看到,所產生的點可以說是無規律可言,例如點P = (3,10),點23P = (9,7)。在這裡求離散對數問題就相當於已知點(3,10)和點(9,7),求23。在這個例子中p=23,問題還不難解,如果當p數值非常大時,要求出這個解是十分困難的。

產生公鑰和私鑰

在橢圓曲線加密中,給定橢圓曲線E,基點G和點xG,我們稱xG為公鑰,x值為私鑰。由橢圓曲線性質可知,已知私鑰求公鑰很簡單,而已知公鑰求私鑰幾乎是不可能的事情。

橢圓曲線密碼的應用

有了金鑰對,就可以做很多公鑰加密的事情了,比如最基本的加密通訊,驗證數字簽名等。這裡僅介紹數字簽名,其他的原理本質上也都是一樣的。

數字簽名:橢圓曲線DSA(ECDSA)

依然假設Alice要釋出公開檔案,並對此檔案進行數字簽名。Bob需要驗證該簽名。(以下涉及計算的部分都是求模運算)

生成數字簽名

  • Alice根據隨機數 r 和基點 G 求出點 rG = (x,y)
  • Alice根據隨機數 r 、訊息 m 的雜湊值 h 、私鑰 a 計算s = \frac{h+ax}{r}
  • 最後,Alice將訊息 m 、點 rGs 傳送給Bob,其中點 rGs 就是數字簽名

驗證數字簽名

  • Bob接收到訊息 m 、點 rGs
  • Bob根據訊息 m 求出雜湊值 h
  • 最後,Bob進行以下計算:
R=\frac{h}{s}G + \frac{x}{s}A(A是Alice的公鑰)
  • 最後把R和rG進行比較,如果相等,則驗證簽名正確,否則說明是錯誤的數字簽名。

驗證原理

\frac{h}{s}G + \frac{x}{s}A = \frac{h}{s}G + \frac{x}{s}(aG) = \frac{h+ax}{s}G = \frac{r(h+ax)}{h+ax}G = rG

這裡關鍵的一點是Alice簽名的時候引入了隨機數 r ,而利用公鑰A=aG的特性,在算式中只有A可以消除隨機變數r的因素。引入隨機數也提高了安全性,即便對於同一條訊息,只要改變隨機數R,所得到的簽名也會隨之改變。

至此,我們對於橢圓加密ECC的原理以及ECDSA數字簽名有了大致的瞭解。

一個Java交流平臺分享給你們,讓你在實踐中積累經驗掌握原理。如果你想拿高薪,想突破瓶頸,想跟別人競爭能取得優勢的,想進BAT但是有擔心面試不過的,可以加我的Java學習交流群:642830685