0. 前言
最近加入了一家做安全領(lǐng)域的公司秧秉,接觸到了一些密碼學(xué)的東西褐桌,尤其是國(guó)密算法,可能國(guó)內(nèi)做這個(gè)方向的公司并不多象迎,我發(fā)現(xiàn)國(guó)內(nèi)關(guān)于國(guó)密算法的介紹都很淺撩嚼,對(duì)于其背后數(shù)學(xué)及密碼學(xué)的介紹就更少了。我最近研究了一些這方面的東西挖帘,記錄一下,希望對(duì)你有所幫助恋技。
這篇文章主要是介紹橢圓曲線密碼學(xué)ECC的數(shù)學(xué)基礎(chǔ)拇舀,并沒有涉及SM2算法本身。
1. SM2算法簡(jiǎn)介
SM2算法全稱是SM2橢圓曲線公鑰密碼算法(SM是商用密碼的拼音縮寫蜻底,充分體現(xiàn)出了這一系列算法的自主可控性)骄崩,是一種基于“橢圓曲線”的密碼。2016年薄辅,SM2成為中國(guó)國(guó)家密碼標(biāo)準(zhǔn)要拂。 在商用密碼體系中,SM2主要用于替換RSA加密算法站楚。
既然SM2是用于替換RSA加密算法脱惰,那就有必要介紹一下RSA算法,RSA是非常著名的非對(duì)稱加密算法窿春,它的安全性建立在整數(shù)因數(shù)分解難題(IFP)之上。即使沒有聽說(shuō)過(guò)RSA算法蔚润,想必大家也聽說(shuō)過(guò)這個(gè)整數(shù)因數(shù)分解難題,并且直覺上也認(rèn)為除盏,嗯赏迟,這個(gè)問題的確很難。
那么問題來(lái)了糕再,既然有RSA這么成熟的算法了,為什么還需要SM2猾担,這其中有很多原因,但是不可忽視的一點(diǎn)是工腋,SM2是一種基于橢圓曲線的密碼(Elliptic Curve Cryptography,簡(jiǎn)稱ECC)趁冈,ECC有其天然優(yōu)勢(shì),那就是可以以較小的密鑰長(zhǎng)度獲取和RSA同等的安全強(qiáng)度呀邢。以下是來(lái)自NIST美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所的推薦密鑰長(zhǎng)度申眼,表中同行代表了具有同等的安全強(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密鑰的長(zhǎng)度比RSA密鑰的長(zhǎng)度要小得多雀摘,并且,隨著RSA密鑰的翻倍清蚀,ECC密鑰并不需要翻倍就能獲取同等的安全強(qiáng)度。這一點(diǎn)對(duì)于移動(dòng)設(shè)備、嵌入式以及其它功耗受限绑洛、計(jì)算能力受限的場(chǎng)景來(lái)說(shuō)就很有用了。
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ù)之上的,之所以說(shuō)這種函數(shù)是單向的湿刽,是因?yàn)槠淠婧瘮?shù)是計(jì)算不可行的渴庆,也就是說(shuō),有這么一種函數(shù)耸弄,它正向計(jì)算很容易老客,反向計(jì)算很難(試想一下鳍鸵,如果真的是這么一種眾生平等的函數(shù)击罪,別人反向計(jì)算困難媳禁,那意味著解密方——喜聞樂見的Bob,解密也很難毫别,這當(dāng)然不是我們想要的),除非你知道某些別人不知道的信息,有了這些信息债沮,你就可以方便地反向計(jì)算,也就意味著解密只對(duì)擁有這些信息的人可行闷煤,這些“信息”就是我們常說(shuō)的私鑰。我們把這種函數(shù)稱為單向陷門函數(shù)近顷,RSA的單向陷門函數(shù)的構(gòu)造就是基于上文說(shuō)的的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ì)算橢圓周長(zhǎng)的積分中的一部分跟橢圓曲線方程很像,所以叫把這種方程表示的曲線叫著橢圓曲線,還真的是有理有據(jù)陌知,一點(diǎn)都不牽強(qiáng)。
4. 群論的一點(diǎn)點(diǎn)知識(shí)
說(shuō)完橢圓曲線窖铡,我們要介紹一個(gè)重要的概念虹钮,群振峻。一個(gè)群是由一個(gè)集合以及定義在該集合上的一個(gè)二元運(yùn)算(記作)所組成,且符合“群公理”:
- 封閉性:若
和
是集合
的成員变擒,則
屬于
- 結(jié)合律:
- 單位元:存在單位元
,使得
- 逆元:集合
中的任意成員a,存在b撇贺,使得
,a,b互為逆元目代,記
,同樣
。
通俗地說(shuō)脱吱,群就是一個(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ì)兒說(shuō)單位元是0,一會(huì)兒說(shuō)單位元是1蝉揍,這都是對(duì)于特定的運(yùn)算而言链峭,你可以把單位元理解成普通加法中的0和普通乘法中的1,那么逆元就是普通加法中的相反數(shù)又沾,普通乘法中的倒數(shù)弊仪。
我們小學(xué)的時(shí)候就學(xué)過(guò)熙卡,加法滿足結(jié)合律和交換律,然而群公理中并沒有包括交換律這一條励饵,那是因?yàn)椴恍枰蛋瑑H僅是這四條公理就足以讓我們推導(dǎo)出來(lái)很多有用的定理了,沒有必要再加一條使得“群”的適用性變窄役听。但是颓鲜,如果這種二元運(yùn)算滿足交換律,那自然是更好的典予,我們就能推導(dǎo)出更多的定理甜滨,這種滿足交換律的“加強(qiáng)群”我們稱為交換群或阿貝爾群。
再舉個(gè)例子瘤袖,在線性代數(shù)中衣摩,我們都學(xué)過(guò),一個(gè)n階的方陣是不一定存在逆矩陣的捂敌,只有在滿足一定條件下才有逆矩陣艾扮,n階的“可逆”方陣在矩陣乘法下構(gòu)成群,其單位元就是單位矩陣占婉,逆元肯定存在泡嘴,因?yàn)槲覀兌x的就是n階的“可逆”方陣,但是這個(gè)群不是一個(gè)交換群逆济,線性代數(shù)一個(gè)基本的常識(shí)就是矩陣乘法不滿足交換律酌予。所以說(shuō),交換律也不是那么理所應(yīng)當(dāng)?shù)奈齐纾催@種二元運(yùn)算是如何定義的霎终。
5. 橢圓曲線群
我們了解了什么是橢圓曲線滞磺,什么是群升薯,其實(shí)我們想做的是如何在橢圓曲線上構(gòu)造一個(gè)群。為什么會(huì)有這么奇怪的想法击困?你是不是又忘了涎劈,橢圓曲線密碼ECC是橢圓曲線在ElGamal體系下的應(yīng)用,ElGamal體系就是定義在群上的阅茶。好了蛛枚,那么該如何定義在橢圓曲線上的二元運(yùn)算呢?像我等木魚肯定是想不出來(lái)的脸哀,好在數(shù)學(xué)家已經(jīng)幫你想好了蹦浦。
在介紹橢圓曲線上的二元運(yùn)算(以下就稱為橢圓曲線上的加法)之前,我們要做一點(diǎn)小小的補(bǔ)充撞蜂。群是定義在集合之上的盲镶,橢圓曲線集合自然就是橢圓曲線上所有的點(diǎn)侥袜,但是,這里面有一點(diǎn)“麻煩”溉贿,定義群是需要一個(gè)集合上的“特殊”元素的枫吧,也就是單位元,你再看看橢圓曲線上的哪個(gè)點(diǎn)長(zhǎng)得很“特殊”呢宇色?其實(shí)沒有九杂,橢圓曲線上的每個(gè)點(diǎn)地位都是一樣的,所以為了能在橢圓曲線上構(gòu)造一個(gè)群宣蠕,需要首先對(duì)橢圓曲線集合做一個(gè)擴(kuò)充例隆,引入一個(gè)“特殊”的點(diǎn),這個(gè)點(diǎn)叫“無(wú)窮遠(yuǎn)點(diǎn)”抢蚀,記作0:
這個(gè)無(wú)窮遠(yuǎn)點(diǎn)就是我們的單位元裳擎,為什么這么說(shuō)呢,這需要結(jié)合以下的橢圓曲線加法來(lái)看思币。那么鹿响,無(wú)窮遠(yuǎn)點(diǎn)究竟在哪呢?廢話谷饿,當(dāng)然在無(wú)窮遠(yuǎn)處惶我,就好像我問你平行線的交點(diǎn)在哪里呢?你肯定會(huì)說(shuō)平行線哪有交點(diǎn)博投。其實(shí)绸贡,也可以說(shuō)平行線的交點(diǎn)在無(wú)窮遠(yuǎn)處,對(duì)毅哗,就是那個(gè)點(diǎn)听怕,是不是有點(diǎn)感覺了。
有了對(duì)橢圓曲線集合的擴(kuò)充虑绵,我們就可以定義橢圓曲線的加法了:
- 單位元:無(wú)窮遠(yuǎn)點(diǎn)0
- 三點(diǎn)P,Q,R共線則它們的和為單位元:P+Q+R=0
- 關(guān)于x軸對(duì)稱的兩個(gè)點(diǎn)互為逆元尿瞭。
這就是數(shù)學(xué)家想出來(lái)的,滿足群公理的橢圓曲線上的加法定義翅睛。我們可以驗(yàn)證一下:
- 封閉性声搁,顯然滿足,點(diǎn)加來(lái)加去肯定還在橢圓曲線上捕发,要么就是無(wú)窮遠(yuǎn)點(diǎn)疏旨。
- 結(jié)合律,滿足扎酷,三點(diǎn)共線并沒有規(guī)定順序檐涝,所以(P+Q)+R=0=P+(Q+R)
- 單位元,就是無(wú)窮遠(yuǎn)點(diǎn)0,每個(gè)點(diǎn)加無(wú)窮遠(yuǎn)點(diǎn)還等于這個(gè)點(diǎn)
- 逆元谁榜,每個(gè)點(diǎn)的逆元肯定存在拉岁,因?yàn)闄E圓曲線關(guān)于x軸對(duì)稱,但是為啥逆元相加等于無(wú)窮遠(yuǎn)點(diǎn)0呢惰爬?這個(gè)不是很顯然喊暖,我們可以換個(gè)角度看。
要定義橢圓曲線加法撕瞧,但是上面的定義卻是在說(shuō)三個(gè)點(diǎn)相加陵叽,我們來(lái)看一種更加直接的定義,P+Q=-R丛版,橢圓曲線上兩個(gè)點(diǎn)相加等于過(guò)這兩個(gè)點(diǎn)做直線與橢圓曲線交點(diǎn)關(guān)于x軸的對(duì)稱點(diǎn)巩掺。除了一些特殊情況,過(guò)橢圓曲線上的兩點(diǎn)做直線一定會(huì)與橢圓曲線有且僅有一個(gè)交點(diǎn)页畦,也就是說(shuō)胖替,這么定義加法,結(jié)果是一定存在的豫缨。
所謂特殊情況就是:
- 兩個(gè)對(duì)稱點(diǎn)相加独令,也就是豎直線與橢圓曲線的只有兩個(gè)或者一個(gè)交點(diǎn)(切線),那么這兩個(gè)點(diǎn)相加就等于無(wú)窮遠(yuǎn)點(diǎn)0好芭,正如之前所說(shuō)燃箭,沒有第三個(gè)交點(diǎn),其實(shí)也可以說(shuō)交點(diǎn)在無(wú)窮遠(yuǎn)處舍败。所以說(shuō)招狸,逆元相加等于無(wú)窮遠(yuǎn)點(diǎn)0,頗有道理邻薯。
- 相同的點(diǎn)相加裙戏,也就是P+P,其實(shí)就是取極限厕诡,過(guò)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ī)則本身能“自圓其說(shuō)”。如果要在密碼學(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,也就是說(shuō)
那么我們可以這么做气嫁,先計(jì)算2P当窗,然后計(jì)算4P、8P寸宵、16P崖面、32P、64P梯影、128P巫员,然后
簡(jiǎn)單來(lái)說(shuō)就是每次都翻倍加,這樣就可以快速計(jì)算出nP甲棍。以上示例是想說(shuō)明简识,橢圓曲線上的標(biāo)量乘法是可以快速計(jì)算出來(lái)的。
這里有個(gè)網(wǎng)站,可以直觀地看到橢圓曲線上加法的運(yùn)算橢圓曲線上的加法七扰。
以上關(guān)于橢圓曲線加法的介紹都是基于幾何圖像的奢赂,幾何圖像對(duì)于人而言比較直觀,便于我們理解颈走,具體計(jì)算還得是代數(shù)形式的膳灶,顯然可以聯(lián)立橢圓曲線和直線的方程,求出交點(diǎn)立由,交點(diǎn)的對(duì)稱點(diǎn)就是結(jié)果轧钓,具體計(jì)算公式不再給出,你只需要記住這種計(jì)算方式可行且這種公式存在就可以了拆吆。
6. 有限域
我們先把橢圓曲線和群都放一邊聋迎,來(lái)看看另外一個(gè)數(shù)學(xué)概念——有限域。
域是加強(qiáng)的群枣耀,具體定義不再給出霉晕。我們只來(lái)看一種最常用的、最容易理解的有限域捞奕,模p的整數(shù)域牺堰,其中p是一個(gè)素?cái)?shù),這個(gè)域包含的元素是0到p-1這p個(gè)整數(shù)颅围。域上的運(yùn)算也很簡(jiǎn)單伟葫,就是普通的運(yùn)算然后對(duì)p取模,這對(duì)程序員來(lái)說(shuō)應(yīng)該很熟悉院促,以
為例:
這都很簡(jiǎn)單筏养,關(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è)定灌闺,來(lái)看看有限域上的橢圓曲線長(zhǎng)什么樣子艰争。
方程跟之前的一樣坏瞄,只是對(duì)于其中所有參數(shù)x,y包括a,b施加了有限域的限制,也就是說(shuō)x,y,a,b都只能取0到p-1中的整數(shù)甩卓。那個(gè)長(zhǎng)得三條線的等號(hào)是代表同余的意思鸠匀,意思就是說(shuō)等式的左邊計(jì)算的結(jié)果對(duì)p取模等于等式右邊的結(jié)果對(duì)p取模。那么施加了這個(gè)限制之后橢圓曲線會(huì)變成什么樣子呢逾柿?看圖缀棍。
以上是在p取19,97机错,127爬范,487值時(shí)的圖像。我們來(lái)看幾個(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)缴饭,再去說(shuō)什么兩點(diǎn)連線求交點(diǎn)就變得不再形象了暑劝,但是之前強(qiáng)調(diào)過(guò),圖像只是給人看的茴扁,我們通過(guò)聯(lián)立方程的方式得到的計(jì)算點(diǎn)加法的公式铃岔,在有限域上的橢圓曲線仍然是成立的,只不過(guò)公式中的運(yùn)算也要受到有限域的限制峭火,也就是計(jì)算結(jié)果需要對(duì)p取模毁习,計(jì)算過(guò)程中的“除法”需要轉(zhuǎn)換為乘以乘法逆元。
雖然我們對(duì)橢圓曲線施加了有限域的限制卖丸,但是纺且,有限域上的橢圓曲線及其點(diǎn)加法仍然構(gòu)成交換群。
7.1 群的階
群的階也就是群中元素的個(gè)數(shù)稍浆,在實(shí)數(shù)域上的橢圓曲線不會(huì)有這個(gè)問題载碌,因?yàn)轱@然實(shí)數(shù)域上群的階是無(wú)窮大的猜嘱,但是在有限域上就可以去問這個(gè)問題了,有限域上群的階是多少呢嫁艇?顯然可以讓x從0步進(jìn)到p-1朗伶,然后把所有的點(diǎn)求出來(lái),但是步咪,現(xiàn)實(shí)中p會(huì)是一個(gè)很大的素?cái)?shù)论皆,這么做不可行。萬(wàn)幸猾漫,數(shù)學(xué)家已經(jīng)解決了這個(gè)問題点晴,Schoof算法可以快速求出有限域上橢圓曲線群的階。
7.2 循環(huán)子群
有限域上的橢圓曲線還有一個(gè)很有用的結(jié)論悯周,其上任意一個(gè)點(diǎn)P粒督,經(jīng)過(guò)若干次標(biāo)量乘之后都會(huì)回到無(wú)窮遠(yuǎn)點(diǎn)0,也就是說(shuō)總存在n禽翼,使得nP=0屠橄。我們來(lái)看一個(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)都是通過(guò)點(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ì)于上面的例子而言马胧,通過(guò)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í),這么問題很簡(jiǎn)單告唆,我們可以一個(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è)問題之所以困難草慧,并不是說(shuō)我在這嘚啵了半天,引入了這么多數(shù)學(xué)概念它才困難匙头,而是它真的困難(拜托漫谷,相信我)——這個(gè)理由還真的是一點(diǎn)都不牽強(qiáng)啊蹂析!關(guān)鍵還在于舔示,我們找不出有效的算法來(lái)求解這個(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è)來(lái)看俺祠,看如何把ECDLP來(lái)應(yīng)用到上面這些方面。
9.1 密鑰交換
簡(jiǎn)單來(lái)說(shuō)甥温,密鑰交換就是Alice和Bob通過(guò)公開交互一些信息就可以協(xié)商出來(lái)一個(gè)只有他們兩個(gè)人知道的密鑰锻煌,別的人通過(guò)公開的信息,求解出這個(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ù)字簽名
簡(jiǎn)單來(lái)說(shuō)倦沧,數(shù)字簽名就是Alice通過(guò)其私鑰“簽名”了某個(gè)信息,其他人包括Bob都可通過(guò)Alice的公鑰來(lái)驗(yàn)證這個(gè)信息確實(shí)是他簽的它匕,因?yàn)檫@個(gè)信息只能通過(guò)Alice的私鑰簽出來(lái)展融,別的人簽不出來(lái)。ECDSA的基本原理如下:
- 用密碼級(jí)安全的哈希函數(shù)把待簽名的信息m轉(zhuǎn)換為哈希值z(mì)
- 在
范圍內(nèi)生成隨機(jī)數(shù)k豫柬,n為循環(huán)子群的階
- 計(jì)算
- (r,s)就是簽名信息
任何人通過(guò)Alice的公鑰都可以驗(yàn)證告希,信息m的數(shù)字簽名(r,s)是否來(lái)自Alice扑浸,具體驗(yàn)證步驟不再給出。通俗地說(shuō)燕偶,r隱藏了隨機(jī)數(shù)k的信息喝噪,s混合了Alice的私鑰和待簽名的信息,有了這些信息指么,我們可以從另外一個(gè)方向來(lái)驗(yàn)證酝惧,這些信息是來(lái)自Alice的。這里有張圖形象地說(shuō)明了這一點(diǎn):
s之所以設(shè)計(jì)成那個(gè)樣子就是為了使得姑廉,rP+zG=sR缺亮。
注意,計(jì)算s需要使用k模n的乘法逆元桥言,前面說(shuō)過(guò),只有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解密
通俗地說(shuō)湖雹,Bob要傳遞的信息就在中,但是只有Alice才能把
中多余的部分減去曙搬。
9.4 一點(diǎn)說(shuō)明
本節(jié)講解了摔吏,基于橢圓曲線離散對(duì)數(shù)難題如何實(shí)現(xiàn)密鑰交換、數(shù)字簽名纵装、非對(duì)稱加密征讲。但是,這只是一些原理說(shuō)明橡娄,并不代表具體的算法實(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,說(shuō)明群的階和循環(huán)子群的階是一樣的氨距,都是n桑逝,并且可以驗(yàn)證,n是一個(gè)素?cái)?shù)俏让,也大致接近2的256次方楞遏。通常來(lái)說(shuō),余因子h都是1首昔,2寡喝,4這些數(shù),這樣循環(huán)子群就有更多的點(diǎn)勒奇,破解起來(lái)難度就更大预鬓。這條曲線很有名,因?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)很成熟了挠日,國(guó)際上通用的橢圓曲線密碼算法也有很多,那么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ù)問題并不是在任何條件下都是困難的酸役,在某些特定的橢圓曲線上就比較簡(jiǎn)單,那么如果保證標(biāo)準(zhǔn)的橢圓曲線不是經(jīng)過(guò)“精心設(shè)計(jì)”的,然后設(shè)計(jì)者知道某些不公開的破解手段呢涣澡?這是個(gè)悖論贱呐,無(wú)論標(biāo)準(zhǔn)橢圓曲線的參數(shù)取什么值都會(huì)有這樣的疑慮。相反RSA就不存在這樣的問題入桂,因?yàn)橐膊恍枰裁礃?biāo)準(zhǔn)的素?cái)?shù)這種東西奄薇。但是,我覺得這也不是個(gè)問題抗愁,想通過(guò)“公開”的方式去“隱藏”這本身就不太可行馁蒂。
- 信息如何編碼到點(diǎn),如何從點(diǎn)反推出信息蜘腌,這部分內(nèi)容沒有涉及沫屡,因?yàn)槲乙膊恢馈?/li>
- 橢圓曲線有很多種,文中所說(shuō)的都是一種叫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)該是這篇國(guó)外的文章: Elliptic Curve Cryptography: a gentle introduction
這是一個(gè)系列文章奈应,包含四篇。本文許多圖表购披、示例都來(lái)自這篇文章杖挣。有中文翻譯版:橢圓曲線密碼學(xué)簡(jiǎn)介
How Schnorr signatures may improve Bitcoin,這篇文章介紹了比特幣簽名的細(xì)節(jié)刚陡,本文ECDSA介紹的圖片即來(lái)自這篇文章。
橢圓曲線密碼學(xué)是系統(tǒng)且專業(yè)的領(lǐng)域筐乳,更多專業(yè)內(nèi)容可以查看這本書《橢圓曲線密碼學(xué)導(dǎo)論》歌殃。