早前寫過一篇文章分析 RSA 算法原理后,想了解下更復(fù)雜點(diǎn)的橢圓曲線密碼學(xué)原理,于是有了密碼學(xué)的第二篇筆記。基于橢圓曲線的密碼體系已經(jīng)在密鑰交換(如ECDHE)和數(shù)字簽名(ECDSA)中得到廣泛應(yīng)用,如比特幣就在其數(shù)字簽名算法中用到了橢圓曲線,在配置nginx的CipherSuite時(shí)亦會經(jīng)常看到 ECDHE 的身影。相較于 RSA,橢圓曲線密碼體系可以使用更短的 key 達(dá)到更高的安全性。本文主要參考資料 [Elliptic Curve Cryptography: a gentle introduction],如有錯(cuò)漏,懇請指正。
1 橢圓曲線概述
首先要說明的一點(diǎn)是,橢圓曲線不是橢圓。橢圓方程是下面這樣的:
而通常我們討論的橢圓曲線的曲線方程是一個(gè)二元三次方程,它有多種形式,在橢圓曲線密碼體系中,最常用的是如下的Weierstrass通用式(curve25519 等其他類型的橢圓曲線本文不討論):
之所以取名叫橢圓曲線,是因?yàn)樵撉€方程跟求橢圓弧長的積分公式相似。從曲線方程和圖像易知,橢圓曲線關(guān)于X軸對稱。判定式不等于零是為了橢圓曲線不存在奇異點(diǎn),即處處光滑可導(dǎo),這樣才能進(jìn)行橢圓曲線上的加法運(yùn)算。下面是一些適合用于加密的橢圓曲線,其中 。
2 數(shù)學(xué)基礎(chǔ)
橢圓曲線加密算法涉及數(shù)學(xué)中的群論、有限域等內(nèi)容,這節(jié)簡要介紹下相關(guān)數(shù)學(xué)理論。亦可以跳過直接看第3節(jié),遇到相關(guān)名詞再查閱即可。
2.1 群 (Group)
在討論群之前,先說說集合。集合簡單來說就是把一堆東西放在一起,如自然數(shù)集合。當(dāng)然光有一堆東西還不夠,東西之間相互作用才能更好的描述大千世界。于是,自然數(shù)集合通過加減運(yùn)算衍生出整數(shù)集合、整數(shù)集合經(jīng)過乘除又可以衍生出有理數(shù),而后通過無理數(shù)的加入又衍生出實(shí)數(shù)集合、負(fù)數(shù)開方引入了復(fù)數(shù)集合。群則是集合和一個(gè)二元運(yùn)算。
群: 是一個(gè)集合
連同一個(gè)二元運(yùn)算
表示為
。要成為一個(gè)群,該集合和運(yùn)算需要滿足如下4個(gè)要求:
- 封閉性:對于
中任意的
和
,運(yùn)算
的結(jié)果也在集合
中。
- 結(jié)合律:對于
中任意的
,等式
成立。
- 單位元:
中存在一個(gè)元素
,對于
中任意元素
,等式
成立。
- 逆元:對于
中任意元素
,
中都存在另一個(gè)元素
,使得
,其中 e 是單位元。
而如果再滿足交換律,則該群就被稱為是一個(gè)阿貝爾群。
- 交換律:對于
中的任意元素
,等式
成立。
根據(jù)群的定義,整數(shù)的加法運(yùn)算 就是一個(gè)群,而且還是一個(gè)阿貝爾群。而自然數(shù)的加法運(yùn)算
就不是一個(gè)群。整數(shù)加法運(yùn)算構(gòu)成群,因?yàn)樗鼭M足群的定義:整數(shù)加法的封閉性、結(jié)合律、交換律都成立。整數(shù)加法運(yùn)算中單位元是 0。所有整數(shù) n 都有加法逆元 -n。
在密碼學(xué)中一般都需要一個(gè)有限的群,定義如下:
有限群: 如果一個(gè)群里的元素有限的,則稱該群為有限群,群中元素?cái)?shù)目稱為群的階。群
的階用記號
表示。
2.2 域 (Field)
為了使一個(gè)結(jié)構(gòu)同時(shí)支持四種基本算術(shù)(即加減乘除),我們需要一個(gè)包含加法和乘法群的集合,這就是域。當(dāng)一個(gè)集合為域的時(shí)候,我們就能在其中進(jìn)行基本算術(shù)運(yùn)算了。
域
是具有下面特性的元素集合:
- F 中所有元素形成一個(gè)加法群,對應(yīng)群的運(yùn)算是
,單位元為 0,對于元素
,加法逆元表示為
。
- F 中除0外的所有元素構(gòu)成一個(gè)乘法群,對應(yīng)群的運(yùn)算是
,單位元是 1。對于元素 a,乘法逆元表示為
。
- 對 F 中的元素混合使用這兩種群操作時(shí),分配律始終成立。即對所有的
,都有
所以域中元素只要形成加法群和乘法群并滿足分配律就行,因?yàn)槿褐性囟加心嬖瑴p法/除法可以轉(zhuǎn)換為加/乘元素的逆元實(shí)現(xiàn)。實(shí)數(shù)集合 是一個(gè)域,加法群中單位元是 0,每個(gè)實(shí)數(shù)
都有加法逆元
,乘法群中單位元是
,每個(gè)非零實(shí)數(shù)都有乘法逆元
。而整數(shù)集合就不是域,因?yàn)榇蟛糠衷貨]有乘法逆元,不能構(gòu)成一個(gè)乘法群。
在密碼學(xué)中,通常只對有限元素的域感興趣,這種域稱為有限域(Finite Field)。有限域中我們經(jīng)常用到的是素?cái)?shù)域,所謂素?cái)?shù)域,就是階為素?cái)?shù)的有限域。比如當(dāng) p 為素?cái)?shù)時(shí),整數(shù)環(huán) 就是一個(gè)素?cái)?shù)域,可以記作
。在素?cái)?shù)域
中進(jìn)行算術(shù)運(yùn)算,需要遵守整數(shù)環(huán)的規(guī)則,即加法是模 p 加法,而乘法是模 p 乘法。
整數(shù)環(huán)
由下面兩部分構(gòu)成:
- 集合
,共
個(gè)元素。
- 集合中兩種操作
(模加法)和
(模乘法),即對于所有的
,滿足:
例如對于 有:
- 加法:
- 加法逆元:
,因?yàn)?
- 乘法:
- 乘法逆元:
,因?yàn)?
。
3 橢圓曲線中的群論
橢圓曲線上的點(diǎn)經(jīng)過一種特定的加法運(yùn)算可以讓橢圓曲線在實(shí)數(shù)域構(gòu)成一個(gè)群。
3.1 點(diǎn)加法
無窮遠(yuǎn)點(diǎn):定義一個(gè)無窮遠(yuǎn)點(diǎn) ,即經(jīng)過橢圓上任意一點(diǎn)的與X軸垂直的直線都經(jīng)過該點(diǎn)。可能有人疑惑垂直于X軸的直線是平行線,為啥可以定義為都經(jīng)過
點(diǎn)?因?yàn)樵诜菤W幾何中,可認(rèn)為平行線在無窮遠(yuǎn)處會交于一點(diǎn)。
橢圓曲線點(diǎn)加法:橢圓曲線上經(jīng)過 和
兩個(gè)點(diǎn)的直線與橢圓曲線的交點(diǎn)記作
,根據(jù)定義有
以及
。繼而定義橢圓曲線點(diǎn)加法:
,即加法結(jié)果是經(jīng)過點(diǎn)
且與 X 軸垂直的直線與橢圓曲線的另外一個(gè)交點(diǎn),簡單來說,就是交點(diǎn)
關(guān)于 X 軸的對稱點(diǎn)。
橢圓曲線群:定義為橢圓曲線在實(shí)數(shù)域上的點(diǎn)集以及點(diǎn)加法
封閉性:元素是橢圓曲線上的點(diǎn),且根據(jù)加法定義,加法運(yùn)算得到的點(diǎn)都在橢圓曲線上,滿足封閉性。
單位元:選取無窮遠(yuǎn)點(diǎn)作為單位元,記為
,易證得
。(因?yàn)?
)。
逆元:因?yàn)闄E圓曲線過于X軸對稱,
的關(guān)于 X 軸對稱的點(diǎn)
就是
的逆元。因?yàn)?
。
交換律:
。
結(jié)合律:
,通過幾何作圖可以驗(yàn)證得到的兩個(gè)點(diǎn)確實(shí)相同,更嚴(yán)格的證明需要用到 [Cayley–Bacharach theorem],即假設(shè)兩條三次曲線有9個(gè)交點(diǎn),如果第三條三次曲線經(jīng)過前兩條三次曲線的8個(gè)交點(diǎn),那么它也必定通過第9個(gè)交點(diǎn)。
由此可知,橢圓曲線上的點(diǎn)在橢圓曲線加法運(yùn)算上構(gòu)成了一個(gè)阿貝爾群。增加了單位元后,橢圓曲線方程改為:
由定義可知,,所以,最終加法只需要計(jì)算交點(diǎn)
的逆元
即可。幾種特殊情況說明:
- 1)如果
不是切點(diǎn)且不是互為逆元,則有第三個(gè)交點(diǎn)
,故
。
- 2)如果
或者
是切點(diǎn),則
就是橢圓曲線的一條切線。假如
是切點(diǎn),則有
。
- 3)如果
和
連線垂直于X軸,即
,則跟曲線沒有第三個(gè)交點(diǎn),可以認(rèn)為是交于無窮遠(yuǎn)點(diǎn)
,故而
。
- 4)如果
,則過它們的直線就是橢圓曲線過點(diǎn)
的切線,該直線一般來說跟橢圓曲線有另一個(gè)交點(diǎn)
。如果恰好該切線如圖4這樣跟曲線沒有其他交點(diǎn),則可以認(rèn)為交點(diǎn)為
,即此時(shí)
。
3.2 代數(shù)加法
上一節(jié)定義了橢圓曲線幾何上意義的點(diǎn)加法,需要轉(zhuǎn)換為代數(shù)加法以方便計(jì)算。要注意的是,這并不是兩個(gè)點(diǎn)的坐標(biāo)簡單相加。
假設(shè)直線 PQ 的斜率 ,然后將直線方程
代入曲線可以得到:
, 轉(zhuǎn)換成標(biāo)準(zhǔn)式,根據(jù)韋達(dá)定理
,即而可求得
,想了解具體推導(dǎo)過程的可參見 [cubic-equations]。
斜率 計(jì)算需要區(qū)分兩種情況,當(dāng) P=Q 時(shí)求橢圓曲線在 P 點(diǎn)的切線斜率(求導(dǎo))即可:
可以簡單驗(yàn)證,比如橢圓曲線是 ,通過參考資料1的 [可視化工具] 可得
。容易驗(yàn)證,與代數(shù)加法公式計(jì)算結(jié)果一致。
對于特殊情況中有一個(gè)是切點(diǎn)的情況,如
,計(jì)算方式不變,易得
。而對于特殊情況
,采用切線斜率亦可驗(yàn)證公式正確。
3.3 標(biāo)量乘法
在實(shí)際加密算法中,我們通常需要多次通過橢圓曲線加法來實(shí)現(xiàn)一次加密,如下圖所示:
圖中打點(diǎn)的過程就是:
而在實(shí)際加密算法中,我們常常是使用一個(gè)點(diǎn)自己疊加,即初始直線變成橢圓曲線的切線即可,像下面這樣:
我們定義對一個(gè)點(diǎn) P 進(jìn)行 n 次加法得到 nP,稱之為標(biāo)量乘法。如前面例子中 。
不過,當(dāng) n 很大時(shí),執(zhí)行 n 次加法需要 時(shí)間,效率有問題。因?yàn)闄E圓曲線點(diǎn)加法在實(shí)數(shù)域構(gòu)成阿貝爾群,滿足交換律和結(jié)合律,于是可以通過 [Double-and-add] 算法進(jìn)行優(yōu)化。比如
,其二進(jìn)制表示為
,通過優(yōu)化只要7次倍乘和4次加法計(jì)算即可,時(shí)間復(fù)雜度降到
。這是一個(gè)很好的單向函數(shù),正向計(jì)算容易,而反向和蠻力計(jì)算復(fù)雜。
令 ,則 Q 作為公鑰,n 為私鑰。如果要破解該密鑰,問題就是 "Q = nP,如果已知 P 和 Q,如何求解 n"? 這個(gè)問題是比較困難的。不過由于在實(shí)數(shù)域上曲線連續(xù),可能會更容易找到一些規(guī)律進(jìn)行破解。而且實(shí)數(shù)域上數(shù)值大小沒有限制、浮點(diǎn)數(shù)等問題而導(dǎo)致計(jì)算效率問題,在實(shí)際應(yīng)用中常將橢圓曲線限制到一個(gè)有限域內(nèi),將曲線變成離散的點(diǎn),這樣即方便了計(jì)算也加大了破解難度。
4 有限域橢圓曲線
4.1 點(diǎn)加法
前面提到為了安全性和便于實(shí)現(xiàn),需要將橢圓曲線限制到一個(gè)有限域內(nèi),通常用的是素?cái)?shù)域 (即對于點(diǎn)
為素?cái)?shù))。于是破解就會變成一個(gè)離散對數(shù)問題,這比連續(xù)曲線上的對數(shù)問題會難很多。素?cái)?shù)域下橢圓曲線定義如下:
下面是曲線 和
的圖像。可以發(fā)現(xiàn),橢圓曲線變成了離散的點(diǎn),且關(guān)于
對稱。
定義 上橢圓曲線點(diǎn)加法
如下,公式跟實(shí)數(shù)域上相比只是多了模
操作。
斜率 m 計(jì)算同樣分兩種情況:
橢圓曲線在素?cái)?shù)域 上的點(diǎn)加法依然構(gòu)成阿貝爾群。單位元依舊是無窮遠(yuǎn)點(diǎn),元素
的逆元變成
。而交換律、結(jié)合律、封閉性則可以通過素域上的模加法、模乘法來證明。實(shí)數(shù)域的橢圓曲線點(diǎn)加法定義是有明確幾何意義的,從幾何上好證明。而橢圓曲線在
就沒有明顯的幾何意義了,觀察可發(fā)現(xiàn)
三點(diǎn)滿足
,群律的證明過于繁瑣,略去(其實(shí)是沒有找到一個(gè)簡易的證明)。
以前面曲線為例,,則有
,且
和
都在橢圓曲線上。從圖形上看,
在直線
上。
4.2 橢圓曲線群的階
在有限域下,橢圓曲線加法群的元素是有限的,元素?cái)?shù)目就是群的階。
如橢圓曲線 ,其在素?cái)?shù)域
中元素有
,階為24(23個(gè)素?cái)?shù)域中的點(diǎn) + 1個(gè)無窮遠(yuǎn)點(diǎn)),如果 p 很大的話,則通過蠻力計(jì)算階是很難的,好在使用 [Schoof算法] 可以在多項(xiàng)式時(shí)間內(nèi)計(jì)算出群的階。計(jì)算橢圓曲線在有限域上點(diǎn)的數(shù)目可以參見 [Counting points on elliptic curves]。
Schoof算法運(yùn)用了 Hasses 定理。Hasses定理給出了橢圓曲線在 的階的范圍,可以看出,當(dāng) p 很大時(shí),階跟 p 的值是比較接近的。
Hasses 定理:令
是
上的橢圓曲線,
上的點(diǎn)的數(shù)量
滿足如下條件:
4.3 循環(huán)子群
跟實(shí)數(shù)域一樣,在素?cái)?shù)域里面也是選取一個(gè)點(diǎn) P,然后計(jì)算倍乘 nP 作為公鑰。還是以 為例,
,我們采用素?cái)?shù)域下新的計(jì)算公式計(jì)算
。
可以發(fā)現(xiàn) ,即 P 的標(biāo)量乘法得到的點(diǎn)集是原橢圓曲線群的一個(gè)子集,則它是原橢圓曲線群的一個(gè)子群,而且是循環(huán)子群。子群中元素個(gè)數(shù)稱為子群的階(示例子群的階為8),點(diǎn) P 稱為該子群的基點(diǎn)或者生成元。循環(huán)子群是橢圓曲線密碼體系的基礎(chǔ),我們期望子群中元素越多越好,如何找到一個(gè)合適的子群尤為重要。
首先要解決一個(gè)問題,就是已知 下的橢圓曲線上的點(diǎn) P,如何求得 P 的倍乘運(yùn)算后生成的子群的階? 根據(jù)拉格朗日的群論定理,子群的階是父群的階的約數(shù)。求解曲線上點(diǎn) P 生成的子群的階可以用下面方法:
- 首先,使用Schoof算法求得橢圓曲線群的階
。
- 找到
所有的約數(shù)。
- 對
所有的約數(shù)
,計(jì)算
。
- 其中
中最小的
就是子群的階。
以示例曲線為例,父群的階是 ,則以曲線上的點(diǎn)生成的子群的階只能是
。對于點(diǎn)
,故其生成的子群的階就是 8,而點(diǎn)
生成的子群的階則正好等于父群的階24。
4.4 尋找基點(diǎn)
在加密算法中,我們期望找到一個(gè)階高的子群。不過,通常不是先去找個(gè)基點(diǎn),然后計(jì)算子群的階,因?yàn)檫@樣過于不確定,算法上不好實(shí)現(xiàn)。相反地,先選擇一個(gè)大的子群階,然后再找生成該子群的一個(gè)基點(diǎn)就容易多了。
前面提到,子群的階 n 是父群的階 N 的約數(shù),即有 ,h 是一個(gè)整數(shù),我們稱之為子群的余因子(cofactor)。因?yàn)?
,所以有:
通常會選擇一個(gè)素?cái)?shù)作為子群的階,即 n 是素?cái)?shù)。可以發(fā)現(xiàn),點(diǎn) 生成了階為 n 的子群(
除外,因?yàn)檫@個(gè)子群的階為1),不等于
的點(diǎn)
就是我們尋找的基點(diǎn)。具體步驟如下:
- 1)計(jì)算橢圓曲線的階
。
- 2)選擇子群的階
。
是
的約數(shù),且要選擇素?cái)?shù)。通常是越大越好,如
。
- 3)計(jì)算余因子
。
- 4)從橢圓曲線隨機(jī)選取一個(gè)點(diǎn)
,計(jì)算
。
- 5)如果
,則返回第 4 步重新選一個(gè)點(diǎn)計(jì)算。
需要注意,上面算法里的 n 必須是素?cái)?shù),否則計(jì)算的基點(diǎn) G 生成的子群的階可能是 n 的約數(shù)而不是 n,不符合要求。以曲線 為例,
,我們選擇
,則
,隨機(jī)選取一個(gè)點(diǎn)
,計(jì)算
,恰好滿足要求。
4.5 域參數(shù)
如前所述,橢圓曲線加密算法工作在素?cái)?shù)域下的橢圓曲線循環(huán)子群中,需要的域參數(shù)(Domain Parameter)包括 :
- p: 素?cái)?shù)域的大小。
- a, b: 橢圓曲線
的系數(shù)。
- G:生成子群的基點(diǎn)。
- n:子群的階。
- h:子群的余因子。
如比特幣用來做數(shù)字簽名中采用的橢圓曲線 [secp256k1] 的域參數(shù)如下:
- p = 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F =
- a = 0, b = 7,即曲線方程是
。
- G = (0x79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798,
0x483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8) - n = 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
- h = 1
5 橢圓曲線在密碼學(xué)的應(yīng)用
5.1 ECDH(E)
在 ECDH 跟(Diffie–Hellman Key Exchange)有點(diǎn)類似,只是不再通過簡單的模冪運(yùn)算,而是通過素?cái)?shù)域下的橢圓曲線的標(biāo)量乘法來實(shí)現(xiàn)。流程如下:
- Alice 和 Bob 生成各自的公私鑰。假設(shè) Alice 的私鑰是
,公鑰則為
,Bob 的則是
和
。他們用的同一個(gè)基點(diǎn)
、同一個(gè)整數(shù)有限域,同一條橢圓曲線。
- Alice 和 Bob 通過不安全的信道交換公鑰
和
。
- Alice 計(jì)算
,Bob 計(jì)算
,共享密鑰就是
。對稱加密算法 AES 或者 3DES 只用
的一個(gè)坐標(biāo)如x坐標(biāo)作為密鑰即可。
- 要想破解密鑰就好比"已知
求 a 和 b?",當(dāng)
和
很大的時(shí)候,破解是很困難的,這也被稱為橢圓曲線的離散對數(shù)問題,即 ECDLP。
ECDHE (Ephemeral ECDH) 與 ECDH 不同之處在于,它的公私鑰并不固定,而是每次會話臨時(shí)生成,這樣就能具有前向安全性,實(shí)際項(xiàng)目中也用的更多。
5.2 ECDSA
ECDSA 是 DSA 算法的變種,常用于數(shù)字簽名。Alice 通過橢圓曲線算法生成公私鑰 ,對要簽名的消息通過哈希算法生成摘要
(z為整數(shù)),然后 Alice 用私鑰
按照下面步驟對摘要
生成簽名。 Bob 通過公鑰
驗(yàn)證簽名。
生成簽名
- 1)Alice 選取一個(gè)隨機(jī)數(shù) k,其中
,n為子群的階。
- 2)計(jì)算
,G 是曲線的基點(diǎn)。
- 3)計(jì)算
,如果
,則回到第1步重新選擇一個(gè) k 重試。
- 4)計(jì)算
。如果
,則回到第1步重新選擇一個(gè) k 重試。
- 5)
就是最終的簽名對。
校驗(yàn)簽名
- 1)計(jì)算
。
- 2)計(jì)算
。
- 3)計(jì)算
。
- 4)如果
,則簽名有效。
證明
因?yàn)?
,于是:
而之前定義有:
。
因此
,這與生成簽名時(shí)一致,故而證明完畢。
實(shí)例分析
還是以為例,
,選取
。選擇
,則
。假設(shè)要簽名的消息摘要
。經(jīng)過計(jì)算發(fā)現(xiàn),驗(yàn)證成功。
生成簽名:
- 選擇隨機(jī)數(shù)
。
-
。
-
。
-
。
- 所以簽名對就是
。
驗(yàn)證簽名:
-
。
-
。
-
。
-
。
注意事項(xiàng)
- ECDSA 中用的子群的階 n 必須是素?cái)?shù),否則
可能不存在。
- 選擇 k 的隨機(jī)數(shù)生成器一定要設(shè)計(jì)好,不能有漏洞。如果隨機(jī)數(shù)生成不夠隨機(jī)或者可預(yù)測,則可能出現(xiàn)兩個(gè)相同的隨機(jī)數(shù),繼而會有兩個(gè)相同的簽名,如
。則根據(jù)公式可以計(jì)算出 k,繼而就能計(jì)算出私鑰
了。
5.3 TLS密鑰交換
TLS里面加密用的 Cipher Suite有很多,常見的如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,意思是: 使用ECDHE進(jìn)行密鑰交換,RSA做服務(wù)驗(yàn)證,SHA256用于簽名摘要生成,AES128-GCM用作對稱加密。
現(xiàn)在 TLS 密鑰交換和簽名通常有三種方式:RSA,ECDHE_RSA 以及 ECDHE_ECDSA,區(qū)別如下。關(guān)于 TLS 的具體流程分析,這篇文章 [The Illustrated TLS Connection-Every byte of a TLS connection explained and reproduced] 有詳細(xì)論述,強(qiáng)烈推薦。
- RSA: 密鑰交換無需數(shù)字簽名,不過由于其沒有前向安全性,已經(jīng)用的不多。
- ECDHE_RSA:使用ECDHE密鑰交換,RSA數(shù)字簽名,目前使用比較廣泛。在ECDHE中,客戶端和服務(wù)端都會生成各自的橢圓曲線密鑰對,服務(wù)端給客戶端發(fā)送它的橢圓曲線公鑰的時(shí)候使用RSA證書私鑰做數(shù)字簽名,客戶端使用RSA證書中的公鑰驗(yàn)證簽名。
- ECDHE_ECDSA:使用ECDHE密鑰交換,ECDSA數(shù)字簽名,需要使用 ECC 證書。
6 總結(jié)
本文介紹了橢圓曲線密碼學(xué)原理。通過定義有限域下面橢圓曲線的一種點(diǎn)加法,并證明該橢圓曲線在實(shí)數(shù)域和素?cái)?shù)域下該點(diǎn)加法都構(gòu)成阿貝爾群。由此定義了標(biāo)量乘法,,通過隨機(jī)數(shù)生成算法隨機(jī)選擇一個(gè)正整數(shù) k 作為私鑰,從而得到公鑰 Q 和 私鑰 k。文章最后簡要分析了 ECDHE 和 ECDSA 的數(shù)學(xué)原理和應(yīng)用。
如文中所述,橢圓曲線的構(gòu)建和選擇需要注意如下幾點(diǎn):
- 素?cái)?shù)域 p 和 子群的階 n 不能太小,否則會有破解風(fēng)險(xiǎn),建議 256 位以上。
- 素?cái)?shù)域大小 p 和 n 需要滿足
,否則會有風(fēng)險(xiǎn),詳見 [Weak Curves In Elliptic Curve Cryptography]。
- ECDSA 的橢圓曲線子群的階 n 必須是素?cái)?shù),且隨機(jī)數(shù)生成算法一定要夠隨機(jī)不可預(yù)測,否則會有泄露私鑰的風(fēng)險(xiǎn),原理前文已經(jīng)說過。如 [這篇文章] 就描述了如何使用隨機(jī)數(shù)碰撞獲取私鑰恢復(fù)以太坊錢包的。
- 美國國家安全局曾經(jīng)推薦使用 secp256r1,它的曲線方程的系數(shù)比 secp256k1 復(fù)雜許多。然而由于該曲線的設(shè)計(jì)過程不透明,在生成曲線參數(shù)a和b中使用的隨機(jī)算法種子是個(gè)很奇怪的數(shù)字,很早就被懷疑有后門,在棱鏡門后懷疑聲更甚。巧的是,中本聰在設(shè)計(jì)比特幣的時(shí)候也恰好繞過了使用該曲線。這里有篇文章 [a-tale-of-two-elliptic-curves] 介紹了這兩種曲線。棱鏡門之后,Daniel J. Bernstein 教授早年設(shè)計(jì)的 curve25519 曲線大火,該曲線系數(shù)來源明確,也已經(jīng)被越來越多的機(jī)構(gòu)采納。
參考資料
- https://andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introduction/
- http://www.andrew.cmu.edu/user/tnayak/papers/EllipticCurves.pdf
- https://arstechnica.com/information-technology/2013/10/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography
- Understanding Cryptography
- https://tools.ietf.org/html/rfc7748
- https://tls.ulfheim.net/
- https://juejin.im/post/5a9400fcf265da4e976eb4b9
- https://www.zhihu.com/question/23091609