0. 前言
最近加入了一家做安全領(lǐng)域的公司,接觸到了一些密碼學(xué)的東西,尤其是國密算法,可能國內(nèi)做這個(gè)方向的公司并不多,我發(fā)現(xiàn)國內(nèi)關(guān)于國密算法的介紹都很淺,對(duì)于其背后數(shù)學(xué)及密碼學(xué)的介紹就更少了。我最近研究了一些這方面的東西,記錄一下,希望對(duì)你有所幫助。
這篇文章主要是介紹橢圓曲線密碼學(xué)ECC的數(shù)學(xué)基礎(chǔ),并沒有涉及SM2算法本身。
1. SM2算法簡介
SM2算法全稱是SM2橢圓曲線公鑰密碼算法(SM是商用密碼的拼音縮寫,充分體現(xiàn)出了這一系列算法的自主可控性),是一種基于“橢圓曲線”的密碼。2016年,SM2成為中國國家密碼標(biāo)準(zhǔn)。 在商用密碼體系中,SM2主要用于替換RSA加密算法。
既然SM2是用于替換RSA加密算法,那就有必要介紹一下RSA算法,RSA是非常著名的非對(duì)稱加密算法,它的安全性建立在整數(shù)因數(shù)分解難題(IFP)之上。即使沒有聽說過RSA算法,想必大家也聽說過這個(gè)整數(shù)因數(shù)分解難題,并且直覺上也認(rèn)為,嗯,這個(gè)問題的確很難。
那么問題來了,既然有RSA這么成熟的算法了,為什么還需要SM2,這其中有很多原因,但是不可忽視的一點(diǎn)是,SM2是一種基于橢圓曲線的密碼(Elliptic Curve Cryptography,簡稱ECC),ECC有其天然優(yōu)勢(shì),那就是可以以較小的密鑰長度獲取和RSA同等的安全強(qiáng)度。以下是來自NIST美國國家標(biāo)準(zhǔn)技術(shù)研究所的推薦密鑰長度,表中同行代表了具有同等的安全強(qiáng)度,也就是破解所需的計(jì)算時(shí)間是等同的。
RSA key size (bits) | ECC key size (bits) |
---|---|
1024 | 160 |
2048 | 224 |
3072 | 256 |
7680 | 384 |
15360 | 521 |
可以看出同等安全強(qiáng)度下,ECC密鑰的長度比RSA密鑰的長度要小得多,并且,隨著RSA密鑰的翻倍,ECC密鑰并不需要翻倍就能獲取同等的安全強(qiáng)度。這一點(diǎn)對(duì)于移動(dòng)設(shè)備、嵌入式以及其它功耗受限、計(jì)算能力受限的場(chǎng)景來說就很有用了。
RSA名氣很大,并且整數(shù)因數(shù)分解難題大家感覺自己也能“理解”,但是個(gè)人感覺RSA的數(shù)學(xué)原理比ECC要更加困難,因?yàn)镽SA的數(shù)學(xué)原理涉及到許多“數(shù)論”的概念,數(shù)論不僅抽象,而且不容易理解;而ECC的數(shù)學(xué)原理剛好是另外一個(gè)取向,ECC的數(shù)學(xué)原理涉及到的數(shù)學(xué)概念不僅是9年義務(wù)教育+高中不會(huì)涉及到的,甚至絕大部分專業(yè)的大學(xué)階段都也不會(huì)接觸到,這就使得對(duì)于ECC的理解被賦予了很高的門檻,但實(shí)際上這些數(shù)學(xué)概念并沒有那么難,并且ECC也只使用了這些數(shù)學(xué)概念中比較基礎(chǔ)的部分,并沒有涉及非常深的領(lǐng)域,個(gè)人感覺這些概念比數(shù)論要容易理解。再加上橢圓曲線是有圖像的,圖像可以大大幫助我們的理解,所以理解ECC真的沒有那么難,你要對(duì)自己有信心。
2. ElGamal公鑰密碼體系
上文提到,SM2是一種公鑰密碼算法,公鑰密碼算法都要建立在某種單向函數(shù)之上的,之所以說這種函數(shù)是單向的,是因?yàn)槠淠婧瘮?shù)是計(jì)算不可行的,也就是說,有這么一種函數(shù),它正向計(jì)算很容易,反向計(jì)算很難(試想一下,如果真的是這么一種眾生平等的函數(shù),別人反向計(jì)算困難,那意味著解密方——喜聞樂見的Bob,解密也很難,這當(dāng)然不是我們想要的),除非你知道某些別人不知道的信息,有了這些信息,你就可以方便地反向計(jì)算,也就意味著解密只對(duì)擁有這些信息的人可行,這些“信息”就是我們常說的私鑰。我們把這種函數(shù)稱為單向陷門函數(shù),RSA的單向陷門函數(shù)的構(gòu)造就是基于上文說的的IFP。
SM2作為一種公鑰密碼算法,自然也需要構(gòu)造出這么一種單向陷門函數(shù),好消息是,我們并不需要從頭開始去“摸索”出這么一種函數(shù),有一種現(xiàn)成且成熟的公鑰密碼體系——ElGamal公鑰密碼體系,這種體系基于某些數(shù)學(xué)概念構(gòu)造出了一種通用的單向陷門函數(shù),而SM2所基于的橢圓曲線密碼正是ElGamal公鑰密碼體系在橢圓曲線上的應(yīng)用。
ElGamal體系是構(gòu)建在有限域的循環(huán)子群之上的,SM2的數(shù)學(xué)基礎(chǔ)也是這些,以下內(nèi)容將介紹這些數(shù)學(xué)概念。這些數(shù)學(xué)概念有些抽象,并且比較難于理解,但是這是理解SM2及ECC的必由之路。當(dāng)你感到困惑時(shí),你要記住,并不是我們要生搬硬套一些抽象的概念,而是有現(xiàn)成的公鑰體系建立在這些抽象概念之上的,我們只是想把橢圓曲線應(yīng)用到這些概念上。
3. 什么是橢圓曲線
橢圓大家都知道,方程表示是這個(gè)樣子:
是不是喚起了你高中某些不愉快的回憶,沒關(guān)系,這才剛剛開始,以下的內(nèi)容會(huì)讓你更加不愉快。
那什么是橢圓曲線呢?用方程表示的話是:其中a,b都是實(shí)數(shù)。a,b取不同的值時(shí),圖像大概是這樣的:
從圖像上,從方程式中我們都可以看出,橢圓曲線是關(guān)于x軸對(duì)稱的。你可能會(huì)想,這橢圓曲線也看不出跟橢圓有毛的關(guān)系啊,恭喜你,答對(duì)了,橢圓和橢圓曲線的關(guān)系,就好像Java和JavaScript的關(guān)系一樣,之所以叫橢圓曲線,是因?yàn)橛?jì)算橢圓周長的積分中的一部分跟橢圓曲線方程很像,所以叫把這種方程表示的曲線叫著橢圓曲線,還真的是有理有據(jù),一點(diǎn)都不牽強(qiáng)。
4. 群論的一點(diǎn)點(diǎn)知識(shí)
說完橢圓曲線,我們要介紹一個(gè)重要的概念,群。一個(gè)群是由一個(gè)集合以及定義在該集合上的一個(gè)二元運(yùn)算(記作)所組成,且符合“群公理”:
- 封閉性:若
和
是集合
的成員,則
屬于
- 結(jié)合律:
- 單位元:存在單位元
,使得
- 逆元:集合
中的任意成員a,存在b,使得
,a,b互為逆元,記
,同樣
。
通俗地說,群就是一個(gè)集合然后上面定義一種運(yùn)算,集合上的元素參與這種運(yùn)算不會(huì)脫離這個(gè)集合,并且集合上有個(gè)有點(diǎn)特殊的元素叫單位元,單位元跟集合中別的元素做運(yùn)算得到的還是那個(gè)元素,并且集合中每個(gè)元素都有相反的一個(gè)元素,它們兩個(gè)做運(yùn)算會(huì)得到剛才定義的單位元。
顯然,全體整數(shù)和普通加法構(gòu)成一個(gè)群,單位元就是0。而全體整數(shù)和普通乘法構(gòu)不成一個(gè)群,前三條都滿足,并且單位元就是1,但是除了1,別的元素的逆元都不存在,比如2的逆元應(yīng)該是1/2,但是1/2不在整數(shù)范圍內(nèi)。雖然“群公理”看上去理所應(yīng)當(dāng),但是這些條件也不是那么容易滿足的。還有就是,單位元很“特殊”,我們一會(huì)兒說單位元是0,一會(huì)兒說單位元是1,這都是對(duì)于特定的運(yùn)算而言,你可以把單位元理解成普通加法中的0和普通乘法中的1,那么逆元就是普通加法中的相反數(shù),普通乘法中的倒數(shù)。
我們小學(xué)的時(shí)候就學(xué)過,加法滿足結(jié)合律和交換律,然而群公理中并沒有包括交換律這一條,那是因?yàn)椴恍枰瑑H僅是這四條公理就足以讓我們推導(dǎo)出來很多有用的定理了,沒有必要再加一條使得“群”的適用性變窄。但是,如果這種二元運(yùn)算滿足交換律,那自然是更好的,我們就能推導(dǎo)出更多的定理,這種滿足交換律的“加強(qiáng)群”我們稱為交換群或阿貝爾群。
再舉個(gè)例子,在線性代數(shù)中,我們都學(xué)過,一個(gè)n階的方陣是不一定存在逆矩陣的,只有在滿足一定條件下才有逆矩陣,n階的“可逆”方陣在矩陣乘法下構(gòu)成群,其單位元就是單位矩陣,逆元肯定存在,因?yàn)槲覀兌x的就是n階的“可逆”方陣,但是這個(gè)群不是一個(gè)交換群,線性代數(shù)一個(gè)基本的常識(shí)就是矩陣乘法不滿足交換律。所以說,交換律也不是那么理所應(yīng)當(dāng)?shù)模催@種二元運(yùn)算是如何定義的。
5. 橢圓曲線群
我們了解了什么是橢圓曲線,什么是群,其實(shí)我們想做的是如何在橢圓曲線上構(gòu)造一個(gè)群。為什么會(huì)有這么奇怪的想法?你是不是又忘了,橢圓曲線密碼ECC是橢圓曲線在ElGamal體系下的應(yīng)用,ElGamal體系就是定義在群上的。好了,那么該如何定義在橢圓曲線上的二元運(yùn)算呢?像我等木魚肯定是想不出來的,好在數(shù)學(xué)家已經(jīng)幫你想好了。
在介紹橢圓曲線上的二元運(yùn)算(以下就稱為橢圓曲線上的加法)之前,我們要做一點(diǎn)小小的補(bǔ)充。群是定義在集合之上的,橢圓曲線集合自然就是橢圓曲線上所有的點(diǎn),但是,這里面有一點(diǎn)“麻煩”,定義群是需要一個(gè)集合上的“特殊”元素的,也就是單位元,你再看看橢圓曲線上的哪個(gè)點(diǎn)長得很“特殊”呢?其實(shí)沒有,橢圓曲線上的每個(gè)點(diǎn)地位都是一樣的,所以為了能在橢圓曲線上構(gòu)造一個(gè)群,需要首先對(duì)橢圓曲線集合做一個(gè)擴(kuò)充,引入一個(gè)“特殊”的點(diǎn),這個(gè)點(diǎn)叫“無窮遠(yuǎn)點(diǎn)”,記作0:
這個(gè)無窮遠(yuǎn)點(diǎn)就是我們的單位元,為什么這么說呢,這需要結(jié)合以下的橢圓曲線加法來看。那么,無窮遠(yuǎn)點(diǎn)究竟在哪呢?廢話,當(dāng)然在無窮遠(yuǎn)處,就好像我問你平行線的交點(diǎn)在哪里呢?你肯定會(huì)說平行線哪有交點(diǎn)。其實(shí),也可以說平行線的交點(diǎn)在無窮遠(yuǎn)處,對(duì),就是那個(gè)點(diǎn),是不是有點(diǎn)感覺了。
有了對(duì)橢圓曲線集合的擴(kuò)充,我們就可以定義橢圓曲線的加法了:
- 單位元:無窮遠(yuǎn)點(diǎn)0
- 三點(diǎn)P,Q,R共線則它們的和為單位元:P+Q+R=0
- 關(guān)于x軸對(duì)稱的兩個(gè)點(diǎn)互為逆元。
這就是數(shù)學(xué)家想出來的,滿足群公理的橢圓曲線上的加法定義。我們可以驗(yàn)證一下:
- 封閉性,顯然滿足,點(diǎn)加來加去肯定還在橢圓曲線上,要么就是無窮遠(yuǎn)點(diǎn)。
- 結(jié)合律,滿足,三點(diǎn)共線并沒有規(guī)定順序,所以(P+Q)+R=0=P+(Q+R)
- 單位元,就是無窮遠(yuǎn)點(diǎn)0,每個(gè)點(diǎn)加無窮遠(yuǎn)點(diǎn)還等于這個(gè)點(diǎn)
- 逆元,每個(gè)點(diǎn)的逆元肯定存在,因?yàn)闄E圓曲線關(guān)于x軸對(duì)稱,但是為啥逆元相加等于無窮遠(yuǎn)點(diǎn)0呢?這個(gè)不是很顯然,我們可以換個(gè)角度看。
要定義橢圓曲線加法,但是上面的定義卻是在說三個(gè)點(diǎn)相加,我們來看一種更加直接的定義,P+Q=-R,橢圓曲線上兩個(gè)點(diǎn)相加等于過這兩個(gè)點(diǎn)做直線與橢圓曲線交點(diǎn)關(guān)于x軸的對(duì)稱點(diǎn)。除了一些特殊情況,過橢圓曲線上的兩點(diǎn)做直線一定會(huì)與橢圓曲線有且僅有一個(gè)交點(diǎn),也就是說,這么定義加法,結(jié)果是一定存在的。
所謂特殊情況就是:
- 兩個(gè)對(duì)稱點(diǎn)相加,也就是豎直線與橢圓曲線的只有兩個(gè)或者一個(gè)交點(diǎn)(切線),那么這兩個(gè)點(diǎn)相加就等于無窮遠(yuǎn)點(diǎn)0,正如之前所說,沒有第三個(gè)交點(diǎn),其實(shí)也可以說交點(diǎn)在無窮遠(yuǎn)處。所以說,逆元相加等于無窮遠(yuǎn)點(diǎn)0,頗有道理。
- 相同的點(diǎn)相加,也就是P+P,其實(shí)就是取極限,過P點(diǎn)橢圓曲線的切點(diǎn),見圖。
- P為切點(diǎn),P+Q=-P,一樣取極限,見圖。
其實(shí),根據(jù)以上定義,橢圓曲線上的加法也是滿足交換律的,顯然P+Q=Q+P,所以這不僅是個(gè)群,而且是個(gè)交換群。
你肯定會(huì)有疑問,為什么要這么定義?有什么道理?其實(shí),就是沒有什么道理,這么定義的出發(fā)點(diǎn)就是要定義一種二元運(yùn)算滿足群公理,我們已經(jīng)看到了,這么定義是滿足群公理的。你覺得普通實(shí)數(shù)的加法“有道理”是因?yàn)槟阍诂F(xiàn)實(shí)生活中能找到對(duì)應(yīng),像這種抽象的運(yùn)算,根本不需要有你所認(rèn)為的“道理”,只需要運(yùn)算滿足“條件”(即群公理),并且“自洽”,也就是運(yùn)算規(guī)則本身能“自圓其說”。如果要在密碼學(xué)中應(yīng)用的話,還需要做到便于計(jì)算。這就是這么定義的道理。
5.1 標(biāo)量乘法
我們定義了橢圓曲線的加法,其實(shí)就可以進(jìn)而定義其標(biāo)量乘法,所謂標(biāo)量乘法就是同一個(gè)點(diǎn)加n次:
根據(jù)之前的定義,我們可以一步一步去計(jì)算,計(jì)算n次就可以得到nP,但實(shí)際上并不需要這么做,還有更快的算法,以n=151為例,151用二進(jìn)制表示就是10010111,也就是說
那么我們可以這么做,先計(jì)算2P,然后計(jì)算4P、8P、16P、32P、64P、128P,然后
簡單來說就是每次都翻倍加,這樣就可以快速計(jì)算出nP。以上示例是想說明,橢圓曲線上的標(biāo)量乘法是可以快速計(jì)算出來的。
這里有個(gè)網(wǎng)站,可以直觀地看到橢圓曲線上加法的運(yùn)算橢圓曲線上的加法。
以上關(guān)于橢圓曲線加法的介紹都是基于幾何圖像的,幾何圖像對(duì)于人而言比較直觀,便于我們理解,具體計(jì)算還得是代數(shù)形式的,顯然可以聯(lián)立橢圓曲線和直線的方程,求出交點(diǎn),交點(diǎn)的對(duì)稱點(diǎn)就是結(jié)果,具體計(jì)算公式不再給出,你只需要記住這種計(jì)算方式可行且這種公式存在就可以了。
6. 有限域
我們先把橢圓曲線和群都放一邊,來看看另外一個(gè)數(shù)學(xué)概念——有限域。
域是加強(qiáng)的群,具體定義不再給出。我們只來看一種最常用的、最容易理解的有限域,模p的整數(shù)域,其中p是一個(gè)素?cái)?shù),這個(gè)域包含的元素是0到p-1這p個(gè)整數(shù)。域上的運(yùn)算也很簡單,就是普通的運(yùn)算然后對(duì)p取模,這對(duì)程序員來說應(yīng)該很熟悉,以
為例:
這都很簡單,關(guān)鍵是“除法”:
其實(shí)“除法”的意義就是乘以某個(gè)元素的乘法逆元,那么9在上的乘法逆元是多少呢?其實(shí)就是問:
試一試可以知道,所以9在
上的乘法逆元是18,所以
之所以要求p一定要是一個(gè)素?cái)?shù),就是因?yàn)橹挥衟是一個(gè)素?cái)?shù)的時(shí)候,才能保證1到p-1每個(gè)元素都有乘法逆元(顯然0沒有乘法逆元),實(shí)際上,p就是prime的縮寫。并且,有方法可以快速求出每個(gè)元素的乘法逆元,這就是著名的擴(kuò)展歐幾里得算法。
7. 有限域上的橢圓曲線
我們引入有限域的概念就是為了把橢圓曲線定義在有限域上,先別問為什么要這么做,這個(gè)問題之后會(huì)解釋,我們就接受這種設(shè)定,來看看有限域上的橢圓曲線長什么樣子。
方程跟之前的一樣,只是對(duì)于其中所有參數(shù)x,y包括a,b施加了有限域的限制,也就是說x,y,a,b都只能取0到p-1中的整數(shù)。那個(gè)長得三條線的等號(hào)是代表同余的意思,意思就是說等式的左邊計(jì)算的結(jié)果對(duì)p取模等于等式右邊的結(jié)果對(duì)p取模。那么施加了這個(gè)限制之后橢圓曲線會(huì)變成什么樣子呢?看圖。
以上是在p取19,97,127,487值時(shí)的圖像。我們來看幾個(gè)例子,以左上角的圖像為例,p=19,對(duì)于點(diǎn)(2,2),
成立,對(duì)于點(diǎn)(16,17),
成立。其實(shí)就是圖中的每個(gè)點(diǎn)帶入方程計(jì)算對(duì)p取模的結(jié)果相等。注意到圖像是關(guān)于y=p/2對(duì)稱的。
下面的問題就是,有限域上的橢圓曲線的加法應(yīng)該是什么呢?其實(shí)跟我們剛才看到的實(shí)數(shù)域上的橢圓曲線上的加法是一樣的,但是因?yàn)橛邢抻蛏系臋E圓曲線變成了離散的點(diǎn),再去說什么兩點(diǎn)連線求交點(diǎn)就變得不再形象了,但是之前強(qiáng)調(diào)過,圖像只是給人看的,我們通過聯(lián)立方程的方式得到的計(jì)算點(diǎn)加法的公式,在有限域上的橢圓曲線仍然是成立的,只不過公式中的運(yùn)算也要受到有限域的限制,也就是計(jì)算結(jié)果需要對(duì)p取模,計(jì)算過程中的“除法”需要轉(zhuǎn)換為乘以乘法逆元。
雖然我們對(duì)橢圓曲線施加了有限域的限制,但是,有限域上的橢圓曲線及其點(diǎn)加法仍然構(gòu)成交換群。
7.1 群的階
群的階也就是群中元素的個(gè)數(shù),在實(shí)數(shù)域上的橢圓曲線不會(huì)有這個(gè)問題,因?yàn)轱@然實(shí)數(shù)域上群的階是無窮大的,但是在有限域上就可以去問這個(gè)問題了,有限域上群的階是多少呢?顯然可以讓x從0步進(jìn)到p-1,然后把所有的點(diǎn)求出來,但是,現(xiàn)實(shí)中p會(huì)是一個(gè)很大的素?cái)?shù),這么做不可行。萬幸,數(shù)學(xué)家已經(jīng)解決了這個(gè)問題,Schoof算法可以快速求出有限域上橢圓曲線群的階。
7.2 循環(huán)子群
有限域上的橢圓曲線還有一個(gè)很有用的結(jié)論,其上任意一個(gè)點(diǎn)P,經(jīng)過若干次標(biāo)量乘之后都會(huì)回到無窮遠(yuǎn)點(diǎn)0,也就是說總存在n,使得nP=0。我們來看一個(gè)具體的例子,對(duì)于上的點(diǎn)
而言
,并且你可以繼續(xù)驗(yàn)證
。這五個(gè)點(diǎn)組成了一個(gè)封閉集合,你在這個(gè)集合中做點(diǎn)加運(yùn)算,結(jié)果仍在在這個(gè)集合中,我們稱這個(gè)集合是群的一個(gè)循環(huán)子群。對(duì)于上例而言,該循環(huán)子群的階就是5,這個(gè)循環(huán)子群中的其它點(diǎn)都是通過點(diǎn)P得到的,我們稱P是這個(gè)循環(huán)子群的基點(diǎn)或者生成元。
循環(huán)子群很重要,循環(huán)子群是橢圓曲線密碼學(xué)以及其它許多加密系統(tǒng)的基礎(chǔ)。
這里再引入群論當(dāng)中的一個(gè)結(jié)論,子群的階一定是父群階的一個(gè)因子。假設(shè)父群的階是N,子群的階是n,那么h=N/n一定是一個(gè)整數(shù),h被稱為子群的余因子。對(duì)于上面的例子而言,通過Schoof算法可以算出,父群的階是100,以P為基點(diǎn)的循環(huán)子群的階是5,所以余因子h=20。
講到這里,你可能會(huì)好奇,我們?nèi)绾卧谟邢抻蛏系臋E圓曲線中確定一個(gè)基點(diǎn)和它對(duì)應(yīng)的循環(huán)子群的階呢?這個(gè)問題很重要,但其實(shí)你不用關(guān)心,因?yàn)锳lice和Bob要想使用ECC通訊就必須在同一條曲線上計(jì)算,而這個(gè)曲線通常會(huì)選用標(biāo)準(zhǔn)曲線,標(biāo)準(zhǔn)曲線之所以標(biāo)準(zhǔn),就是這條曲線上的參數(shù)都是確定的,基點(diǎn)和循環(huán)子群的階自然也是確定的,并且是告訴你的,你只要知道有辦法去確定基點(diǎn)和循環(huán)子群的階就可以了,具體方法你可以忽略。
8. 橢圓曲線離散對(duì)數(shù)難題
講了這么多,鋪墊了這么多,終于要到高潮了。引入了這么多數(shù)學(xué)概念,就是為了構(gòu)造這么一個(gè)數(shù)學(xué)難題:已知有限域上的橢圓曲線的循環(huán)子群上的兩個(gè)點(diǎn)P和Q,求k為多少時(shí),Q=kP。當(dāng)這個(gè)循環(huán)子群的階比較小時(shí),這么問題很簡單,我們可以一個(gè)一個(gè)k值去試,但當(dāng)子群的階很大時(shí),這個(gè)問題就很難了,目前在經(jīng)典計(jì)算機(jī)上還沒有多項(xiàng)式時(shí)間復(fù)雜度的算法可以求解。并且這個(gè)難題比整數(shù)因子分解難題更加困難,所以ECC可以用較小的密鑰獲得和RSA一樣的安全強(qiáng)度。
主觀地講,有限域上的橢圓曲線的點(diǎn)加法,即使在你了解其加法規(guī)則的時(shí)候,也難以發(fā)現(xiàn)其規(guī)律,結(jié)果就像是從這個(gè)點(diǎn)跳到另外一個(gè)點(diǎn),基于規(guī)則我們可以快速求出從一個(gè)點(diǎn)“跳”n步之后到了哪個(gè)點(diǎn),但是如果告訴你這里有兩個(gè)點(diǎn),問它們之間的聯(lián)系,是“跳躍”了多少步才到達(dá)“終點(diǎn)”的,這個(gè)問題很難回答。
ECC的安全性建立在橢圓曲線離散對(duì)數(shù)難題(elliptic curve discrete logarithm problem,ECDLP)之上的,這個(gè)問題之所以困難,并不是說我在這嘚啵了半天,引入了這么多數(shù)學(xué)概念它才困難,而是它真的困難(拜托,相信我)——這個(gè)理由還真的是一點(diǎn)都不牽強(qiáng)啊!關(guān)鍵還在于,我們找不出有效的算法來求解這個(gè)問題,總之,你知道這是個(gè)難題就可以了。
9. 橢圓曲線密碼學(xué)ECC
有了上面的數(shù)學(xué)難題,我們就可以在其基礎(chǔ)上構(gòu)造出公鑰加密體系,一般包括三個(gè)方面:
- ECDH(Elliptic Curve Diffie-Hellman):密鑰交換
- ECDSA(Elliptic Curve Digital Signature Algorithm):數(shù)字簽名
- 非對(duì)稱加密
我們一個(gè)一個(gè)來看,看如何把ECDLP來應(yīng)用到上面這些方面。
9.1 密鑰交換
簡單來說,密鑰交換就是Alice和Bob通過公開交互一些信息就可以協(xié)商出來一個(gè)只有他們兩個(gè)人知道的密鑰,別的人通過公開的信息,求解出這個(gè)密鑰是計(jì)算不可行的;這個(gè)交換得到的密鑰特別適合于用作對(duì)稱加密的密鑰。ECDH的基本原理如下:
- 有限域上的橢圓曲線基點(diǎn)為
- Alice的私鑰是
,公鑰是
- Bob的私鑰是
,公鑰是
- Alice和Bob相互交換公鑰,他們可以求出相同的密鑰S
一般認(rèn)為已知橢圓曲線的參數(shù)從和
求解出
的難度等同于ECDLP,顯然這個(gè)問題并不會(huì)比ECDLP更困難,因?yàn)榍蠼獬鯡CDLP必然能求出
。
9.2 數(shù)字簽名
簡單來說,數(shù)字簽名就是Alice通過其私鑰“簽名”了某個(gè)信息,其他人包括Bob都可通過Alice的公鑰來驗(yàn)證這個(gè)信息確實(shí)是他簽的,因?yàn)檫@個(gè)信息只能通過Alice的私鑰簽出來,別的人簽不出來。ECDSA的基本原理如下:
- 用密碼級(jí)安全的哈希函數(shù)把待簽名的信息m轉(zhuǎn)換為哈希值z(mì)
- 在
范圍內(nèi)生成隨機(jī)數(shù)k,n為循環(huán)子群的階
- 計(jì)算
- (r,s)就是簽名信息
任何人通過Alice的公鑰都可以驗(yàn)證,信息m的數(shù)字簽名(r,s)是否來自Alice,具體驗(yàn)證步驟不再給出。通俗地說,r隱藏了隨機(jī)數(shù)k的信息,s混合了Alice的私鑰和待簽名的信息,有了這些信息,我們可以從另外一個(gè)方向來驗(yàn)證,這些信息是來自Alice的。這里有張圖形象地說明了這一點(diǎn):
s之所以設(shè)計(jì)成那個(gè)樣子就是為了使得,rP+zG=sR。
注意,計(jì)算s需要使用k模n的乘法逆元,前面說過,只有n為素?cái)?shù)的時(shí)候,k的乘法逆元才能保證存在,而n是橢圓曲線循環(huán)子群的階,這也就是為什么幾乎所有的標(biāo)準(zhǔn)曲線的n都是素?cái)?shù)。
9.3 非對(duì)稱加密
非對(duì)稱加密就不需要多解釋了,公鑰加密,只有私鑰才能解密。在ECC中,非對(duì)稱加密的基本原理是:
- Alice的私鑰是
,公鑰是
- Bob將要發(fā)送的消息m編碼為橢圓曲線上的點(diǎn)M,并生成一個(gè)隨機(jī)數(shù)r
- Bob把
發(fā)給Alice
- Alice解密
通俗地說,Bob要傳遞的信息就在中,但是只有Alice才能把
中多余的部分減去。
9.4 一點(diǎn)說明
本節(jié)講解了,基于橢圓曲線離散對(duì)數(shù)難題如何實(shí)現(xiàn)密鑰交換、數(shù)字簽名、非對(duì)稱加密。但是,這只是一些原理說明,并不代表具體的算法實(shí)現(xiàn),真正的算法設(shè)計(jì)可能比這些原理要更復(fù)雜,已獲得更好的安全性,或者更巧妙的設(shè)計(jì)以使得運(yùn)算速度更快。
10. 標(biāo)準(zhǔn)曲線
secp256k1標(biāo)準(zhǔn)曲線的領(lǐng)域參數(shù)如下:
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
a = 0
b = 7
xG = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
yG = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
h = 1
有限域大致是2的256次方,余因子h=1,說明群的階和循環(huán)子群的階是一樣的,都是n,并且可以驗(yàn)證,n是一個(gè)素?cái)?shù),也大致接近2的256次方。通常來說,余因子h都是1,2,4這些數(shù),這樣循環(huán)子群就有更多的點(diǎn),破解起來難度就更大。這條曲線很有名,因?yàn)樗挥米鞅忍貛诺臄?shù)字簽名。
除了這條標(biāo)準(zhǔn)曲線外,還有很多其它的標(biāo)準(zhǔn)曲線,這些曲線的名字也不是隨意取的,名字中涵蓋著橢圓曲線的一些信息,更具體的可以參看一場(chǎng)橢圓曲線的尋根問祖之旅。
SM2標(biāo)準(zhǔn)橢圓曲線叫做sm2p256v1,具體領(lǐng)域參數(shù)如下:
p = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
a = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
b = 0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
xG = 0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7
yG = 0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0
n = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123
h = 1
和secp256k1類似,有限域和群的階都接近2的256次方。
11. SM2在設(shè)計(jì)什么
其實(shí),橢圓曲線密碼學(xué)的理論已經(jīng)很成熟了,國際上通用的橢圓曲線密碼算法也有很多,那么SM2在設(shè)計(jì)些什么呢?其實(shí)主要有兩點(diǎn):
- 選擇合適的領(lǐng)域參數(shù),避免“弱曲線”,對(duì)抗已知的攻擊手段。
- 設(shè)計(jì)出具體的密鑰交換、數(shù)字簽名、非對(duì)稱加密的標(biāo)準(zhǔn)算法,即要保證安全,又要保證計(jì)算效率。
12. 問題
- 悖論:標(biāo)準(zhǔn)橢圓曲線是否暗藏后門,橢圓曲線離散對(duì)數(shù)問題并不是在任何條件下都是困難的,在某些特定的橢圓曲線上就比較簡單,那么如果保證標(biāo)準(zhǔn)的橢圓曲線不是經(jīng)過“精心設(shè)計(jì)”的,然后設(shè)計(jì)者知道某些不公開的破解手段呢?這是個(gè)悖論,無論標(biāo)準(zhǔn)橢圓曲線的參數(shù)取什么值都會(huì)有這樣的疑慮。相反RSA就不存在這樣的問題,因?yàn)橐膊恍枰裁礃?biāo)準(zhǔn)的素?cái)?shù)這種東西。但是,我覺得這也不是個(gè)問題,想通過“公開”的方式去“隱藏”這本身就不太可行。
- 信息如何編碼到點(diǎn),如何從點(diǎn)反推出信息,這部分內(nèi)容沒有涉及,因?yàn)槲乙膊恢馈?/li>
- 橢圓曲線有很多種,文中所說的都是一種叫Weierstrass的橢圓曲線,這種橢圓曲線最常用,當(dāng)然還有別的形式的橢圓曲線。
- 常見的有限域除了
還有
,
上的運(yùn)算比較好理解,
上的運(yùn)算就不是那么容易理解了,當(dāng)然,也有定義在
有限域上的標(biāo)準(zhǔn)曲線。
13. 總結(jié)
不嚴(yán)謹(jǐn)?shù)刂v,在橢圓曲線上構(gòu)建出群,是使得橢圓曲線可以用于密碼系統(tǒng)的基礎(chǔ),而有限域的引入使得橢圓曲線離散對(duì)數(shù)問題變得困難。
14. 參考
關(guān)于ECC最好最通俗地介紹應(yīng)該是這篇國外的文章: Elliptic Curve Cryptography: a gentle introduction
這是一個(gè)系列文章,包含四篇。本文許多圖表、示例都來自這篇文章。有中文翻譯版:橢圓曲線密碼學(xué)簡介
How Schnorr signatures may improve Bitcoin,這篇文章介紹了比特幣簽名的細(xì)節(jié),本文ECDSA介紹的圖片即來自這篇文章。
橢圓曲線密碼學(xué)是系統(tǒng)且專業(yè)的領(lǐng)域,更多專業(yè)內(nèi)容可以查看這本書《橢圓曲線密碼學(xué)導(dǎo)論》。