背景
隨着計算機性能的提升,市面上的加密技術越來越不安全,1024位的RSA私鑰加密已經可以破解,目前有效的手段只是將1024位換成2048位,但隨着技術的進步,RSA算法的破解難度會越來越低,因此需要用更安全的加密算法來代替。隨着加密難度的提高,RSA算法的密鑰長度呈現指數式的增長,然而ECC算法取可以做到使用更短的密鑰獲得同等級別的安全性。
ECC是什么
ECC是Elliptic Curve Cryptography(橢圓曲線密碼學)的縮寫,是一種基於橢圓曲線數學的公開密鑰加密算法,其本質是利用離散對數問題實現加密。
ECC的主要優勢,是在使用更小的密鑰的同時,提供更快的性能和更高等級的安全。
橢圓曲線又是什么
一條橢圓曲線就是一組被 y2 = x3 + ax + b 定義的且滿足 4a3 + 27b2 ≠ 0 的點集。
4a3 + 27b2 ≠ 0 這個限定條件是為了保證曲線不包含奇點(在數學中是指曲線上任意一點都存在切線)。
阿貝爾群
阿貝爾群的概念是抽象代數的基本概念之一,是一種代數結構,由一個集合以及一個二元運算所組成。
如果一個集合或者運算是群的話,就必須滿足以下條件(+ 表示二元運算):
1、封閉性(closure),如果a和b被包含於群,那么a+b也一定是群的元素;
2、結合律(associativity);
3、存在一個單位元(identity element)0,0與任意元素運算不改變其值的元素,即 a+0 = 0+a = a;
4、每個元素都存在一個逆元(inverse);
5、交換律(commutativity),即 a+b = b+a;
橢圓曲線中的阿貝爾群
在橢圓曲線上定義一個群:
1、群中的元素就是橢圓曲線上的點;
2、單位元就是無窮處的點0;
3、相反數P,是關於X軸對稱的另一邊的點;
4、二元運算規則定義如下:取一條直線上的三點(這條直線和橢圓曲線相交的三點),P, Q, R(皆非零),他們的總和等於0,P+Q+R=0。

如果P, Q, R在一條直線上的話,他們滿足:
P+(Q+R)=Q+(P+R)=R+(P+Q)=⋯=0。
當P,Q點為同一點時,P=Q,滿足:

這樣,我們可以直觀的證明:+運算符是符合交換律和結合律的,這是一個阿貝爾群。
因為阿貝爾群滿足交換律和結合律,所以點P和點-R的二元運算結果必會在曲線上,即P+P+P的結果必會在曲線上的另一點Q,
以此類推,可以得出得出:
Q=kP(k個相同的點P進行二元運算(數乘),記做kP)
離散對數問題
描述一條Fp上的橢圓曲線,常用到六個參量:T=(p,a,b,n,x,y)。(p 、a 、b) 用來確定一條橢圓曲線,p為素數域內點的個數,a和b是其內的兩個大數;
x,y為G基點的坐標,也是兩個大數;
n為點G基點的階;
以上六個量就可以描述一條橢圓曲線,有時候我們還會用到h(橢圓曲線上所有點的個數p與n相除的整數部分)。
這幾個參量取值的選擇,直接影響了加密的安全性。參量值一般要求滿足以下幾個條件:
1、p 當然越大越安全,但越大,計算速度會變慢,200位左右可以滿足一般安全要求;
2、p≠n×h;
3、pt≠1 (mod n),1≤t<20;
4、4a3+27b2≠0 (mod p);
5、n 為素數;
6、h≤4。
加解密過程
1、選定一條橢圓曲線 Ep(a,b) 並取橢圓曲線上一點,作為基點P。
2、選擇一個大數k作為私鑰,並生成公鑰 Q=kP。
3、將 Ep(a,b) 和點Q、P傳給用戶。
4、用戶接到信息后 ,將待傳輸的明文編碼到Ep(a,b)上的一點M,並產生一個隨機整數r。
5、公鑰加密(密文C是一個點對):
C={rP, M+rQ}
6、私鑰解密(M + rQ - k(rP) ,解密結果就是點M),公式如下:
M + rQ - k(rP) = M + r(kP) - k(rP) = M
7、對點M進行解碼就可以得到明文
假設在加密過程中,有一個第三者H,H只能知道橢圓曲線 Ep(a,b)、公鑰Q、基點P、密文點C,而通過公鑰Q、基點P求私鑰k或者通過密文點C、基點P求隨機數r都是非常困難的,因此得以保證數據傳輸的安全。
具體:
設私鑰、公鑰分別為k、K,即K = kG,其中G為G點。
公鑰加密:
選擇隨機數r,將消息M生成密文C,該密文是一個點對,即:
C = {rG, M+rK}
其中K為公鑰
私鑰解密:
M + rK - k(rG) = M + r(kG) - k(rG) = M
其中k、K分別為私鑰、公鑰
橢圓曲線簽名與驗證簽名
橢圓曲線簽名算法,即ECDSA。
設私鑰、公鑰分別為k、K,即K = kG,其中G為G點。
私鑰簽名:
1、選擇隨機數r,計算點rG(x, y)。
2、根據隨機數r、消息M的哈希h、私鑰k,計算s = (h + kx)/r。
3、將消息M、和簽名{rG, s}發給接收方。
公鑰驗證簽名:
1、接收方收到消息M、以及簽名{rG=(x,y), s}。
2、根據消息求哈希h。
3、使用發送方公鑰K計算:hG/s + xK/s,並與rG比較,如相等即驗簽成功。
原理如下:
hG/s + xK/s = hG/s + x(kG)/s = (h+xk)G/s = r(h+xk)G / (h+kx) = rG