SM2國密算法/橢圓曲線密碼學ECC之數學原理

0. 前言

最近加入了一家做安全領域的公司,接觸到了一些密碼學的東西,尤其是國密算法,可能國內做這個方向的公司并不多,我發現國內關于國密算法的介紹都很淺,對于其背后數學及密碼學的介紹就更少了。我最近研究了一些這方面的東西,記錄一下,希望對你有所幫助。
這篇文章主要是介紹橢圓曲線密碼學ECC的數學基礎,并沒有涉及SM2算法本身。

1. SM2算法簡介

SM2算法全稱是SM2橢圓曲線公鑰密碼算法(SM是商用密碼的拼音縮寫,充分體現出了這一系列算法的自主可控性),是一種基于“橢圓曲線”的密碼。2016年,SM2成為中國國家密碼標準。 在商用密碼體系中,SM2主要用于替換RSA加密算法。
既然SM2是用于替換RSA加密算法,那就有必要介紹一下RSA算法,RSA是非常著名的非對稱加密算法,它的安全性建立在整數因數分解難題(IFP)之上。即使沒有聽說過RSA算法,想必大家也聽說過這個整數因數分解難題,并且直覺上也認為,嗯,這個問題的確很難。
那么問題來了,既然有RSA這么成熟的算法了,為什么還需要SM2,這其中有很多原因,但是不可忽視的一點是,SM2是一種基于橢圓曲線的密碼(Elliptic Curve Cryptography,簡稱ECC),ECC有其天然優勢,那就是可以以較小的密鑰長度獲取和RSA同等的安全強度。以下是來自NIST美國國家標準技術研究所的推薦密鑰長度,表中同行代表了具有同等的安全強度,也就是破解所需的計算時間是等同的。

RSA key size (bits) ECC key size (bits)
1024 160
2048 224
3072 256
7680 384
15360 521

可以看出同等安全強度下,ECC密鑰的長度比RSA密鑰的長度要小得多,并且,隨著RSA密鑰的翻倍,ECC密鑰并不需要翻倍就能獲取同等的安全強度。這一點對于移動設備、嵌入式以及其它功耗受限、計算能力受限的場景來說就很有用了。

RSA名氣很大,并且整數因數分解難題大家感覺自己也能“理解”,但是個人感覺RSA的數學原理比ECC要更加困難,因為RSA的數學原理涉及到許多“數論”的概念,數論不僅抽象,而且不容易理解;而ECC的數學原理剛好是另外一個取向,ECC的數學原理涉及到的數學概念不僅是9年義務教育+高中不會涉及到的,甚至絕大部分專業的大學階段都也不會接觸到,這就使得對于ECC的理解被賦予了很高的門檻,但實際上這些數學概念并沒有那么難,并且ECC也只使用了這些數學概念中比較基礎的部分,并沒有涉及非常深的領域,個人感覺這些概念比數論要容易理解。再加上橢圓曲線是有圖像的,圖像可以大大幫助我們的理解,所以理解ECC真的沒有那么難,你要對自己有信心。

2. ElGamal公鑰密碼體系

上文提到,SM2是一種公鑰密碼算法,公鑰密碼算法都要建立在某種單向函數之上的,之所以說這種函數是單向的,是因為其逆函數是計算不可行的,也就是說,有這么一種函數,它正向計算很容易,反向計算很難(試想一下,如果真的是這么一種眾生平等的函數,別人反向計算困難,那意味著解密方——喜聞樂見的Bob,解密也很難,這當然不是我們想要的),除非你知道某些別人不知道的信息,有了這些信息,你就可以方便地反向計算,也就意味著解密只對擁有這些信息的人可行,這些“信息”就是我們常說的私鑰。我們把這種函數稱為單向陷門函數,RSA的單向陷門函數的構造就是基于上文說的的IFP。
SM2作為一種公鑰密碼算法,自然也需要構造出這么一種單向陷門函數,好消息是,我們并不需要從頭開始去“摸索”出這么一種函數,有一種現成且成熟的公鑰密碼體系——ElGamal公鑰密碼體系,這種體系基于某些數學概念構造出了一種通用的單向陷門函數,而SM2所基于的橢圓曲線密碼正是ElGamal公鑰密碼體系在橢圓曲線上的應用。
ElGamal體系是構建在有限域的循環子群之上的,SM2的數學基礎也是這些,以下內容將介紹這些數學概念。這些數學概念有些抽象,并且比較難于理解,但是這是理解SM2及ECC的必由之路。當你感到困惑時,你要記住,并不是我們要生搬硬套一些抽象的概念,而是有現成的公鑰體系建立在這些抽象概念之上的,我們只是想把橢圓曲線應用到這些概念上。

3. 什么是橢圓曲線

橢圓大家都知道,方程表示是這個樣子:

\frac{x^2}{a^2}+\frac{y^2}{b^2}=1

是不是喚起了你高中某些不愉快的回憶,沒關系,這才剛剛開始,以下的內容會讓你更加不愉快。
那什么是橢圓曲線呢?用方程表示的話是:y^2 = x^3 + ax + b(4a^3 + 27b^2 \ne 0)其中a,b都是實數。a,b取不同的值時,圖像大概是這樣的:

橢圓曲線

從圖像上,從方程式中我們都可以看出,橢圓曲線是關于x軸對稱的。你可能會想,這橢圓曲線也看不出跟橢圓有毛的關系啊,恭喜你,答對了,橢圓和橢圓曲線的關系,就好像Java和JavaScript的關系一樣,之所以叫橢圓曲線,是因為計算橢圓周長的積分中的一部分跟橢圓曲線方程很像,所以叫把這種方程表示的曲線叫著橢圓曲線,還真的是有理有據,一點都不牽強。

4. 群論的一點點知識

說完橢圓曲線,我們要介紹一個重要的概念,群。一個群是由一個集合以及定義在該集合上的一個二元運算(記作\cdot)所組成,且符合“群公理”:

  1. 封閉性:若ab是集合\mathbb{G}的成員,則a\cdot b屬于\mathbb{G}
  2. 結合律:(a\cdot b)\cdot c=a\cdot (b\cdot c)
  3. 單位元:存在單位元e,使得a\cdot e=a\cdot e=a
  4. 逆元:集合\mathbb{G}中的任意成員a,存在b,使得a\cdot b=e,a,b互為逆元,記a=b^{-1},同樣b=a^{-1}

通俗地說,群就是一個集合然后上面定義一種運算,集合上的元素參與這種運算不會脫離這個集合,并且集合上有個有點特殊的元素叫單位元,單位元跟集合中別的元素做運算得到的還是那個元素,并且集合中每個元素都有相反的一個元素,它們兩個做運算會得到剛才定義的單位元。
顯然,全體整數和普通加法構成一個群,單位元就是0。而全體整數和普通乘法構不成一個群,前三條都滿足,并且單位元就是1,但是除了1,別的元素的逆元都不存在,比如2的逆元應該是1/2,但是1/2不在整數范圍內。雖然“群公理”看上去理所應當,但是這些條件也不是那么容易滿足的。還有就是,單位元很“特殊”,我們一會兒說單位元是0,一會兒說單位元是1,這都是對于特定的運算而言,你可以把單位元理解成普通加法中的0和普通乘法中的1,那么逆元就是普通加法中的相反數,普通乘法中的倒數。
我們小學的時候就學過,加法滿足結合律和交換律,然而群公理中并沒有包括交換律這一條,那是因為不需要,僅僅是這四條公理就足以讓我們推導出來很多有用的定理了,沒有必要再加一條使得“群”的適用性變窄。但是,如果這種二元運算滿足交換律,那自然是更好的,我們就能推導出更多的定理,這種滿足交換律的“加強群”我們稱為交換群阿貝爾群
再舉個例子,在線性代數中,我們都學過,一個n階的方陣是不一定存在逆矩陣的,只有在滿足一定條件下才有逆矩陣,n階的“可逆”方陣在矩陣乘法下構成群,其單位元就是單位矩陣,逆元肯定存在,因為我們定義的就是n階的“可逆”方陣,但是這個群不是一個交換群,線性代數一個基本的常識就是矩陣乘法不滿足交換律A\cdot B\ne B\cdot A。所以說,交換律也不是那么理所應當的,全看這種二元運算是如何定義的。

5. 橢圓曲線群

我們了解了什么是橢圓曲線,什么是群,其實我們想做的是如何在橢圓曲線上構造一個群。為什么會有這么奇怪的想法?你是不是又忘了,橢圓曲線密碼ECC是橢圓曲線在ElGamal體系下的應用,ElGamal體系就是定義在群上的。好了,那么該如何定義在橢圓曲線上的二元運算呢?像我等木魚肯定是想不出來的,好在數學家已經幫你想好了。
在介紹橢圓曲線上的二元運算(以下就稱為橢圓曲線上的加法)之前,我們要做一點小小的補充。群是定義在集合之上的,橢圓曲線集合自然就是橢圓曲線上所有的點,但是,這里面有一點“麻煩”,定義群是需要一個集合上的“特殊”元素的,也就是單位元,你再看看橢圓曲線上的哪個點長得很“特殊”呢?其實沒有,橢圓曲線上的每個點地位都是一樣的,所以為了能在橢圓曲線上構造一個群,需要首先對橢圓曲線集合做一個擴充,引入一個“特殊”的點,這個點叫“無窮遠點”,記作0:

\left\{ (x, y) \in \mathbb{R}^2\ |\ y^2 = x^3 + ax + b,\ 4 a^3 + 27 b^2 \ne 0 \right\}\ \cup\ \left\{ 0 \right\}

這個無窮遠點就是我們的單位元,為什么這么說呢,這需要結合以下的橢圓曲線加法來看。那么,無窮遠點究竟在哪呢?廢話,當然在無窮遠處,就好像我問你平行線的交點在哪里呢?你肯定會說平行線哪有交點。其實,也可以說平行線的交點在無窮遠處,對,就是那個點,是不是有點感覺了。

有了對橢圓曲線集合的擴充,我們就可以定義橢圓曲線的加法了:

  1. 單位元:無窮遠點0
  2. 三點P,Q,R共線則它們的和為單位元:P+Q+R=0
  3. 關于x軸對稱的兩個點互為逆元。
三點共線則和為0

這就是數學家想出來的,滿足群公理的橢圓曲線上的加法定義。我們可以驗證一下:

  1. 封閉性,顯然滿足,點加來加去肯定還在橢圓曲線上,要么就是無窮遠點。
  2. 結合律,滿足,三點共線并沒有規定順序,所以(P+Q)+R=0=P+(Q+R)
  3. 單位元,就是無窮遠點0,每個點加無窮遠點還等于這個點
  4. 逆元,每個點的逆元肯定存在,因為橢圓曲線關于x軸對稱,但是為啥逆元相加等于無窮遠點0呢?這個不是很顯然,我們可以換個角度看。

要定義橢圓曲線加法,但是上面的定義卻是在說三個點相加,我們來看一種更加直接的定義,P+Q=-R,橢圓曲線上兩個點相加等于過這兩個點做直線與橢圓曲線交點關于x軸的對稱點。除了一些特殊情況,過橢圓曲線上的兩點做直線一定會與橢圓曲線有且僅有一個交點,也就是說,這么定義加法,結果是一定存在的。

P+Q=-R

所謂特殊情況就是:

  1. 兩個對稱點相加,也就是豎直線與橢圓曲線的只有兩個或者一個交點(切線),那么這兩個點相加就等于無窮遠點0,正如之前所說,沒有第三個交點,其實也可以說交點在無窮遠處。所以說,逆元相加等于無窮遠點0,頗有道理。
  2. 相同的點相加,也就是P+P,其實就是取極限,過P點橢圓曲線的切點,見圖。
  3. P為切點,P+Q=-P,一樣取極限,見圖。

其實,根據以上定義,橢圓曲線上的加法也是滿足交換律的,顯然P+Q=Q+P,所以這不僅是個群,而且是個交換群。

你肯定會有疑問,為什么要這么定義?有什么道理?其實,就是沒有什么道理,這么定義的出發點就是要定義一種二元運算滿足群公理,我們已經看到了,這么定義是滿足群公理的。你覺得普通實數的加法“有道理”是因為你在現實生活中能找到對應,像這種抽象的運算,根本不需要有你所認為的“道理”,只需要運算滿足“條件”(即群公理),并且“自洽”,也就是運算規則本身能“自圓其說”。如果要在密碼學中應用的話,還需要做到便于計算。這就是這么定義的道理。

5.1 標量乘法

我們定義了橢圓曲線的加法,其實就可以進而定義其標量乘法,所謂標量乘法就是同一個點加n次:

nP = \underbrace{P + P + \cdots + P}_{n\ \text{times}}

根據之前的定義,我們可以一步一步去計算,計算n次就可以得到nP,但實際上并不需要這么做,還有更快的算法,以n=151為例,151用二進制表示就是10010111,也就是說

151 = 2^7 + 2^4 + 2^2 + 2^1 + 2^0

那么我們可以這么做,先計算2P,然后計算4P、8P、16P、32P、64P、128P,然后

151P = 2^7P + 2^4P + 2^2P + 2^1P + 2^0P=128P+16P+4P+2P+P

簡單來說就是每次都翻倍加,這樣就可以快速計算出nP。以上示例是想說明,橢圓曲線上的標量乘法是可以快速計算出來的。

這里有個網站,可以直觀地看到橢圓曲線上加法的運算橢圓曲線上的加法

以上關于橢圓曲線加法的介紹都是基于幾何圖像的,幾何圖像對于人而言比較直觀,便于我們理解,具體計算還得是代數形式的,顯然可以聯立橢圓曲線和直線的方程,求出交點,交點的對稱點就是結果,具體計算公式不再給出,你只需要記住這種計算方式可行且這種公式存在就可以了。

6. 有限域

我們先把橢圓曲線和群都放一邊,來看看另外一個數學概念——有限域。
域是加強的群,具體定義不再給出。我們只來看一種最常用的、最容易理解的有限域\mathbb{F}_{p},模p的整數域,其中p是一個素數,這個域包含的元素是0到p-1這p個整數。域上的運算也很簡單,就是普通的運算然后對p取模,這對程序員來說應該很熟悉,以\mathbb{F}_{23}為例:

(18+9) \pmod{23} = 4 \\ (7-14) \pmod{23} = 16 \\ 4\times 7 \pmod{23} = 5 \\

這都很簡單,關鍵是“除法”:

\frac{1}{9}\pmod{23} = 9^{-1} \pmod{23}

其實“除法”的意義就是乘以某個元素的乘法逆元,那么9在\mathbb{F}_{23}上的乘法逆元是多少呢?其實就是問:

9\times ? \pmod{23}=1(1是乘法的單位元)

試一試可以知道9\times 18 \pmod{23}=1,所以9在\mathbb{F}_{23}上的乘法逆元是18,所以

\frac{1}{9}\pmod{23} = 9^{-1} \pmod{23}=18

之所以要求p一定要是一個素數,就是因為只有p是一個素數的時候,才能保證1到p-1每個元素都有乘法逆元(顯然0沒有乘法逆元),實際上,p就是prime的縮寫。并且,有方法可以快速求出每個元素的乘法逆元,這就是著名的擴展歐幾里得算法

7. 有限域上的橢圓曲線

我們引入有限域的概念就是為了把橢圓曲線定義在有限域上,先別問為什么要這么做,這個問題之后會解釋,我們就接受這種設定,來看看有限域上的橢圓曲線長什么樣子。

\begin{array}{rcl} \left\{(x, y) \in (\mathbb{F}_p)^2 \right. & \left. | \right. & \left. y^2 \equiv x^3 + ax + b \pmod{p}, \right. \\ & & \left. 4a^3 + 27b^2 \not\equiv 0 \pmod{p}\right\}\ \cup\ \left\{0\right\} \end{array}

方程跟之前的一樣,只是對于其中所有參數x,y包括a,b施加了有限域的限制,也就是說x,y,a,b都只能取0到p-1中的整數。那個長得三條線的等號是代表同余的意思,意思就是說等式的左邊計算的結果對p取模等于等式右邊的結果對p取模。那么施加了這個限制之后橢圓曲線會變成什么樣子呢?看圖。

以上是y^2 \equiv x^3 - 7x + 10 \pmod{p}在p取19,97,127,487值時的圖像。我們來看幾個例子,以左上角的圖像為例,p=19,對于點(2,2),2^2 \equiv 2^3 - 7\times 2+ 10 \equiv 4 \pmod{19}成立,對于點(16,17),17^2 \equiv 16^3 - 7\times 16+ 10 \equiv 4 \pmod{19}成立。其實就是圖中的每個點帶入方程計算對p取模的結果相等。注意到圖像是關于y=p/2對稱的。

下面的問題就是,有限域上的橢圓曲線的加法應該是什么呢?其實跟我們剛才看到的實數域上的橢圓曲線上的加法是一樣的,但是因為有限域上的橢圓曲線變成了離散的點,再去說什么兩點連線求交點就變得不再形象了,但是之前強調過,圖像只是給人看的,我們通過聯立方程的方式得到的計算點加法的公式,在有限域上的橢圓曲線仍然是成立的,只不過公式中的運算也要受到有限域的限制,也就是計算結果需要對p取模,計算過程中的“除法”需要轉換為乘以乘法逆元。
雖然我們對橢圓曲線施加了有限域的限制,但是,有限域上的橢圓曲線及其點加法仍然構成交換群。

7.1 群的階

群的階也就是群中元素的個數,在實數域上的橢圓曲線不會有這個問題,因為顯然實數域上群的階是無窮大的,但是在有限域上就可以去問這個問題了,有限域上群的階是多少呢?顯然可以讓x從0步進到p-1,然后把所有的點求出來,但是,現實中p會是一個很大的素數,這么做不可行。萬幸,數學家已經解決了這個問題,Schoof算法可以快速求出有限域上橢圓曲線群的階。

7.2 循環子群

有限域上的橢圓曲線還有一個很有用的結論,其上任意一個點P,經過若干次標量乘之后都會回到無窮遠點0,也就是說總存在n,使得nP=0。我們來看一個具體的例子,對于y^2 \equiv x^3 + 2x + 3 \pmod{97}上的點P(3,6)而言

5P=0,并且你可以繼續驗證6P=P,7P=2P \dots kP = (k \bmod{5})P。這五個點組成了一個封閉集合,你在這個集合中做點加運算,結果仍在在這個集合中,我們稱這個集合是群的一個循環子群。對于上例而言,該循環子群的階就是5,這個循環子群中的其它點都是通過點P得到的,我們稱P是這個循環子群的基點或者生成元

循環子群很重要,循環子群是橢圓曲線密碼學以及其它許多加密系統的基礎。

這里再引入群論當中的一個結論,子群的階一定是父群階的一個因子。假設父群的階是N,子群的階是n,那么h=N/n一定是一個整數,h被稱為子群的余因子。對于上面的例子而言,通過Schoof算法可以算出,父群的階是100,以P為基點的循環子群的階是5,所以余因子h=20。
講到這里,你可能會好奇,我們如何在有限域上的橢圓曲線中確定一個基點和它對應的循環子群的階呢?這個問題很重要,但其實你不用關心,因為Alice和Bob要想使用ECC通訊就必須在同一條曲線上計算,而這個曲線通常會選用標準曲線,標準曲線之所以標準,就是這條曲線上的參數都是確定的,基點和循環子群的階自然也是確定的,并且是告訴你的,你只要知道有辦法去確定基點和循環子群的階就可以了,具體方法你可以忽略。

8. 橢圓曲線離散對數難題

講了這么多,鋪墊了這么多,終于要到高潮了。引入了這么多數學概念,就是為了構造這么一個數學難題:已知有限域上的橢圓曲線的循環子群上的兩個點P和Q,求k為多少時,Q=kP。當這個循環子群的階比較小時,這么問題很簡單,我們可以一個一個k值去試,但當子群的階很大時,這個問題就很難了,目前在經典計算機上還沒有多項式時間復雜度的算法可以求解。并且這個難題比整數因子分解難題更加困難,所以ECC可以用較小的密鑰獲得和RSA一樣的安全強度。

主觀地講,有限域上的橢圓曲線的點加法,即使在你了解其加法規則的時候,也難以發現其規律,結果就像是從這個點跳到另外一個點,基于規則我們可以快速求出從一個點“跳”n步之后到了哪個點,但是如果告訴你這里有兩個點,問它們之間的聯系,是“跳躍”了多少步才到達“終點”的,這個問題很難回答。

ECC的安全性建立在橢圓曲線離散對數難題(elliptic curve discrete logarithm problem,ECDLP)之上的,這個問題之所以困難,并不是說我在這嘚啵了半天,引入了這么多數學概念它才困難,而是它真的困難(拜托,相信我)——這個理由還真的是一點都不牽強啊!關鍵還在于,我們找不出有效的算法來求解這個問題,總之,你知道這是個難題就可以了。

9. 橢圓曲線密碼學ECC

有了上面的數學難題,我們就可以在其基礎上構造出公鑰加密體系,一般包括三個方面:

  1. ECDH(Elliptic Curve Diffie-Hellman):密鑰交換
  2. ECDSA(Elliptic Curve Digital Signature Algorithm):數字簽名
  3. 非對稱加密

我們一個一個來看,看如何把ECDLP來應用到上面這些方面。

9.1 密鑰交換

簡單來說,密鑰交換就是Alice和Bob通過公開交互一些信息就可以協商出來一個只有他們兩個人知道的密鑰,別的人通過公開的信息,求解出這個密鑰是計算不可行的;這個交換得到的密鑰特別適合于用作對稱加密的密鑰。ECDH的基本原理如下:

  • 有限域上的橢圓曲線基點為G
  • Alice的私鑰是d_A,公鑰是H_A=d_AG
  • Bob的私鑰是d_B,公鑰是H_B=d_BG
  • Alice和Bob相互交換公鑰,他們可以求出相同的密鑰S
    S = d_A H_B = d_A (d_B G) = d_B (d_A G) = d_B H_A
Alice和Bob都可以很容易的求出S,但是“中間人”很難求出S

一般認為已知橢圓曲線的參數從H_AH_B求解出S的難度等同于ECDLP,顯然這個問題并不會比ECDLP更困難,因為求解出ECDLP必然能求出S

9.2 數字簽名

簡單來說,數字簽名就是Alice通過其私鑰“簽名”了某個信息,其他人包括Bob都可通過Alice的公鑰來驗證這個信息確實是他簽的,因為這個信息只能通過Alice的私鑰簽出來,別的人簽不出來。ECDSA的基本原理如下:

  • 用密碼級安全的哈希函數把待簽名的信息m轉換為哈希值z
  • \{1, \dots, n - 1\}范圍內生成隨機數k,n為循環子群的階
  • 計算P = kG
  • r = x_P \bmod{n}\ (x_P是P的橫坐標)
  • s = k^{-1} (z + rd_A) \bmod{n}
  • (r,s)就是簽名信息

任何人通過Alice的公鑰都可以驗證,信息m的數字簽名(r,s)是否來自Alice,具體驗證步驟不再給出。通俗地說,r隱藏了隨機數k的信息,s混合了Alice的私鑰和待簽名的信息,有了這些信息,我們可以從另外一個方向來驗證,這些信息是來自Alice的。這里有張圖形象地說明了這一點:

ECDSA簽名、驗簽過程示例,為了方便展示,以實數域上的橢圓曲線為例

s之所以設計成那個樣子就是為了使得,rP+zG=sR。
注意,計算s需要使用k模n的乘法逆元,前面說過,只有n為素數的時候,k的乘法逆元才能保證存在,而n是橢圓曲線循環子群的階,這也就是為什么幾乎所有的標準曲線的n都是素數。

9.3 非對稱加密

非對稱加密就不需要多解釋了,公鑰加密,只有私鑰才能解密。在ECC中,非對稱加密的基本原理是:

  • Alice的私鑰是d_A,公鑰是H_A=d_AG
  • Bob將要發送的消息m編碼為橢圓曲線上的點M,并生成一個隨機數r
  • Bob把C_1=M+rH_A \ \ C_2=rG 發給Alice
  • Alice解密C_1-d_AC_2=M+rH_A-d_ArG=M+rd_AG-d_ArG=M

通俗地說,Bob要傳遞的信息就在C_1中,但是只有Alice才能把C_1中多余的部分減去。

9.4 一點說明

本節講解了,基于橢圓曲線離散對數難題如何實現密鑰交換、數字簽名、非對稱加密。但是,這只是一些原理說明,并不代表具體的算法實現,真正的算法設計可能比這些原理要更復雜,已獲得更好的安全性,或者更巧妙的設計以使得運算速度更快。

10. 標準曲線

secp256k1標準曲線的領域參數如下:

p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
a = 0
b = 7
xG = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
yG = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
h = 1

有限域大致是2的256次方,余因子h=1,說明群的階和循環子群的階是一樣的,都是n,并且可以驗證,n是一個素數,也大致接近2的256次方。通常來說,余因子h都是1,2,4這些數,這樣循環子群就有更多的點,破解起來難度就更大。這條曲線很有名,因為它被用作比特幣的數字簽名。
除了這條標準曲線外,還有很多其它的標準曲線,這些曲線的名字也不是隨意取的,名字中涵蓋著橢圓曲線的一些信息,更具體的可以參看一場橢圓曲線的尋根問祖之旅

SM2標準橢圓曲線叫做sm2p256v1,具體領域參數如下:

p = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
a = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
b = 0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
xG = 0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7
yG = 0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0
n = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123
h = 1

和secp256k1類似,有限域和群的階都接近2的256次方。

11. SM2在設計什么

其實,橢圓曲線密碼學的理論已經很成熟了,國際上通用的橢圓曲線密碼算法也有很多,那么SM2在設計些什么呢?其實主要有兩點:

  1. 選擇合適的領域參數,避免“弱曲線”,對抗已知的攻擊手段。
  2. 設計出具體的密鑰交換、數字簽名、非對稱加密的標準算法,即要保證安全,又要保證計算效率。

12. 問題

  1. 悖論:標準橢圓曲線是否暗藏后門,橢圓曲線離散對數問題并不是在任何條件下都是困難的,在某些特定的橢圓曲線上就比較簡單,那么如果保證標準的橢圓曲線不是經過“精心設計”的,然后設計者知道某些不公開的破解手段呢?這是個悖論,無論標準橢圓曲線的參數取什么值都會有這樣的疑慮。相反RSA就不存在這樣的問題,因為也不需要什么標準的素數這種東西。但是,我覺得這也不是個問題,想通過“公開”的方式去“隱藏”這本身就不太可行。
  2. 信息如何編碼到點,如何從點反推出信息,這部分內容沒有涉及,因為我也不知道。
  3. 橢圓曲線有很多種,文中所說的都是一種叫Weierstrass的橢圓曲線,這種橢圓曲線最常用,當然還有別的形式的橢圓曲線。
  4. 常見的有限域除了\mathbb{F}_{p}還有\mathbb{F}_{2^m}\mathbb{F}_{p}上的運算比較好理解,\mathbb{F}_{2^m}上的運算就不是那么容易理解了,當然,也有定義在\mathbb{F}_{2^m}有限域上的標準曲線。

13. 總結

不嚴謹地講,在橢圓曲線上構建出群,是使得橢圓曲線可以用于密碼系統的基礎,而有限域的引入使得橢圓曲線離散對數問題變得困難。

14. 參考

關于ECC最好最通俗地介紹應該是這篇國外的文章: Elliptic Curve Cryptography: a gentle introduction
這是一個系列文章,包含四篇。本文許多圖表、示例都來自這篇文章。有中文翻譯版:橢圓曲線密碼學簡介

How Schnorr signatures may improve Bitcoin,這篇文章介紹了比特幣簽名的細節,本文ECDSA介紹的圖片即來自這篇文章。

橢圓曲線密碼學是系統且專業的領域,更多專業內容可以查看這本書《橢圓曲線密碼學導論》。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容