1. 程式人生 > >【超級賬本】前置知識點-ECC

【超級賬本】前置知識點-ECC

【參考資料】

橢圓曲線

在這裡插入圖片描述

數學上定義滿足如下方程的點的集合稱之為橢圓曲線:

$Y^2X+a_1XYZ+a_3YZ^2=^3+a_2X^2Z+a_4XZ^2+a_6Z^3$

參考檔案中的圖例,在離線的橢圓曲線上定義了一個運算,即從P點座標 + P點座標 = R點座標。通過這個運算在橢圓曲線的集合上構建了一個群, 這個群是一個有限迴圈群。 可以理解為 $\left\{ P, P^2, P^3, ....., P^n \right\}$

由於群的封閉性,你總可以有一個P點,然後經過k次加法(跳轉後)達到一個點R。同時由於群的可逆性也可以從R點反推回P。

所以這裡所謂群的概念與演算法本身無多大關係,只是從理論上證明了這種跳轉用於加密的合理性,諸如封閉、可逆等等

橢圓曲線加密(ECC)

橢圓曲線加密和RSA一樣是一種非對稱加密演算法,核心也是某個運算正向處理很簡單,而反向處理非常困難。在RSA中利用的是兩個大質數求積很容易,但反向分解出兩個大質數則很難。

同樣對於ECC而言,由P(通常稱為G點)經過k(k<=n)次後得到$P_k$運算簡單,而已知P和$P_k$求k非常困難 實際運用中P、n會取的相當大!!!

備註:這裡的n稱為階,應具備$n \times G = 0$

ECC加解密流程如下:

  1. Alice選擇一條曲線E、基點P和階數n;
  2. Alice選擇一個階數k<n(私鑰),得到P在k次運算後的點$P_k$(公鑰)
  3. Aliec傳送曲線E、P和$P_k$
    至Bob
  4. Bob收到資訊後首先將明文資訊(當前假設只有一個值)對應到E上的某個座標點M,同時取隨機階r
  5. Bob計算兩個值$C_1=M+rP_k \quad C_2=rP$,併發送給Alice
  6. Alice收到這兩個值通過$M=C_1-kC_2$得到明文
基於橢圓曲線的數字簽名(ECDSA)

ECDSA 簽名及驗證流程如下:

簽名的步驟:

  1. Alice選擇一條曲線E、基點P和階數n;
  2. Alice建立一對祕鑰,其中私鑰是$d_A$(一個小於n的整數),公鑰是$Q_A = d_A \times G$
  3. Alice要對明文m進行簽名;
  4. Alice首先計算m的hash值,例如SHA-2等,得到e=hash(m);
  5. 取e最左側的n位(n為階數),得到$z=L_n$
  6. 在[1,n-1]之間取密碼安全的隨機整數k;
  7. 計算其對應曲線上的一個點$(x_1, y_1) = k \times G $
  8. 計算得到$r=x_1 \quad mod \quad n$,如果是0,則回到第5步重取隨機數
  9. 計算得到$s=k^-1(z+rd_A) \quad mod \quad n$ 如果n為0,則回到第5步重新開始
  10. Alice得到簽名(r, s)

驗證的步驟:

  1. Bod得到公鑰$Q_A$、曲線G、階數n、簽名對(r, s)和hash演算法;
  2. Bob計算m的hash值,得到e=hash(m);
  3. 取e最左側的n位(n為階數),得到$z=L_n$
  4. 計算得到$w=s^{-1} \quad mod \quad n$;
  5. 計算得到$u_1=zw \quad mod \quad n$$u_2=rw \quad mod \quad n$
  6. 計算得到一個曲線上的點$(x_1, y_1)=u_1 \times G + u_2 \times Q_A$
  7. $r = x_1(mod \quad n)$則證明簽名是正確的

ECC164位的金鑰產生一個安全級,相當於RSA 1024位金鑰提供的保密強度,而且計算量較小,處理速度更快,儲存空間和傳輸頻寬佔用較少。目前我國居民二代身份證正在使用 256 位的橢圓曲線密碼,虛擬貨幣比特幣也選擇ECC作為加密演算法。我理解在ECDSA中之所以有了SHA的hash還要再用EC的原因也在於此,用更小的計算量得到更高的加密等級。