密碼學(xué)基礎(chǔ)2:橢圓曲線密碼學(xué)原理分析

早前寫過一篇文章分析 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)是,橢圓曲線不是橢圓。橢圓方程是下面這樣的:

E = \{(x, y) \in \mathbb{R}^2 \ | \frac{x^2}{a^2} + \frac{y^2}{b^2} = 1\} \quad (橢圓)

而通常我們討論的橢圓曲線的曲線方程是一個(gè)二元三次方程,它有多種形式,在橢圓曲線密碼體系中,最常用的是如下的Weierstrass通用式(curve25519 等其他類型的橢圓曲線本文不討論):

E = \{(x, y) \in \mathbb{R}^2 \ | y^2 = x^3 + ax + b, \ 4a^3 + 27b^2 \neq 0\} \quad (橢圓曲線)

之所以取名叫橢圓曲線,是因?yàn)樵撉€方程跟求橢圓弧長的積分公式相似。從曲線方程和圖像易知,橢圓曲線關(guān)于X軸對稱。判定式不等于零是為了橢圓曲線不存在奇異點(diǎn),即處處光滑可導(dǎo),這樣才能進(jìn)行橢圓曲線上的加法運(yùn)算。下面是一些適合用于加密的橢圓曲線,其中 b=1, a \in \{2, 1, 0, -1, -2, -3 \}

一些合法的橢圓曲線

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 連同一個(gè)二元運(yùn)算 \cdot 表示為 (G, \cdot)。要成為一個(gè)群,該集合和運(yùn)算需要滿足如下4個(gè)要求:

  • 封閉性:對于 G 中任意的 ab,運(yùn)算 a \cdot b 的結(jié)果也在集合 G 中。
  • 結(jié)合律:對于 G 中任意的 a,b,c,等式 (a \cdot b) \cdot c = a \cdot (b \cdot c) 成立。
  • 單位元:G 中存在一個(gè)元素 e,對于 G 中任意元素 a,等式 e \cdot a = a \cdot e = a 成立。
  • 逆元:對于 G 中任意元素 aG 中都存在另一個(gè)元素 b,使得 a \cdot b = b \cdot a = e,其中 e 是單位元。

而如果再滿足交換律,則該群就被稱為是一個(gè)阿貝爾群。

  • 交換律:對于 G 中的任意元素 a, b,等式 a \cdot b = b \cdot a 成立。

根據(jù)群的定義,整數(shù)的加法運(yùn)算 (\mathbb{Z}, +) 就是一個(gè)群,而且還是一個(gè)阿貝爾群。而自然數(shù)的加法運(yùn)算 (\mathbb{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ù)目稱為群的階。群 (G, \cdot) 的階用記號 |G| 表示。

2.2 域 (Field)

為了使一個(gè)結(jié)構(gòu)同時(shí)支持四種基本算術(shù)(即加減乘除),我們需要一個(gè)包含加法和乘法群的集合,這就是域。當(dāng)一個(gè)集合為域的時(shí)候,我們就能在其中進(jìn)行基本算術(shù)運(yùn)算了。

F 是具有下面特性的元素集合:

  • F 中所有元素形成一個(gè)加法群,對應(yīng)群的運(yùn)算是 +,單位元為 0,對于元素 a,加法逆元表示為 -a
  • F 中除0外的所有元素構(gòu)成一個(gè)乘法群,對應(yīng)群的運(yùn)算是 \times,單位元是 1。對于元素 a,乘法逆元表示為 a^{-1}
  • 對 F 中的元素混合使用這兩種群操作時(shí),分配律始終成立。即對所有的 a,b,c \in F,都有 a(b+c) = (ab) + (ac)

所以域中元素只要形成加法群和乘法群并滿足分配律就行,因?yàn)槿褐性囟加心嬖瑴p法/除法可以轉(zhuǎn)換為加/乘元素的逆元實(shí)現(xiàn)。實(shí)數(shù)集合 \mathbb{R} 是一個(gè)域,加法群中單位元是 0,每個(gè)實(shí)數(shù) a 都有加法逆元 -a,乘法群中單位元是 1,每個(gè)非零實(shí)數(shù)都有乘法逆元 1/a。而整數(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) \mathbb{Z}_p 就是一個(gè)素?cái)?shù)域,可以記作 \mathbb{F}_p。在素?cái)?shù)域 \mathbb{F}_p 中進(jìn)行算術(shù)運(yùn)算,需要遵守整數(shù)環(huán)的規(guī)則,即加法是模 p 加法,而乘法是模 p 乘法。

整數(shù)環(huán) \mathbb{Z}_p 由下面兩部分構(gòu)成:

  • 集合 \mathbb{Z}_p = \{0, 1, 2, ..., p-1\},共 p 個(gè)元素。
  • 集合中兩種操作 + (模加法)和 \times (模乘法),即對于所有的 a,b \in \mathbb{Z}_m ,滿足:
    • a + b \equiv c(mod \ p), \ c \in \mathbb{Z}_p
    • a \times b \equiv d(mod \ p), \ d \in \mathbb{Z}_p

例如對于 \mathbb{F}_{23} 有:

  • 加法: (18+9) \ mod \ 23=4
  • 加法逆元: -5 \ mod \ 23 = 18,因?yàn)?(5+(-5)) \ mod \ 23 = (5 + 18) \ mod \ 23 = 0
  • 乘法: 4 \times 7 \ mod \ 23=5
  • 乘法逆元:9^{-1} \ mod \ 23 = 18,因?yàn)?(9 \times 9^{-1}) \ mod \ 23 = (9 \times 18) \ mod \ 23 = 1

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) O,即經(jīng)過橢圓上任意一點(diǎn)的與X軸垂直的直線都經(jīng)過該點(diǎn)。可能有人疑惑垂直于X軸的直線是平行線,為啥可以定義為都經(jīng)過 O 點(diǎn)?因?yàn)樵诜菤W幾何中,可認(rèn)為平行線在無窮遠(yuǎn)處會交于一點(diǎn)。

橢圓曲線點(diǎn)加法:橢圓曲線上經(jīng)過 PQ 兩個(gè)點(diǎn)的直線與橢圓曲線的交點(diǎn)記作 R = P ? Q,根據(jù)定義有 P ? Q = Q ? P 以及 O? (O? P) = P。繼而定義橢圓曲線點(diǎn)加法:P \bigoplus Q = O ? (P ? Q),即加法結(jié)果是經(jīng)過點(diǎn) P?Q 且與 X 軸垂直的直線與橢圓曲線的另外一個(gè)交點(diǎn),簡單來說,就是交點(diǎn) R 關(guān)于 X 軸的對稱點(diǎn)。

點(diǎn)加法定義

單位元

橢圓曲線群:定義為橢圓曲線在實(shí)數(shù)域上的點(diǎn)集以及點(diǎn)加法 (E, \bigoplus)

  • 封閉性:元素是橢圓曲線上的點(diǎn),且根據(jù)加法定義,加法運(yùn)算得到的點(diǎn)都在橢圓曲線上,滿足封閉性。

  • 單位元:選取無窮遠(yuǎn)點(diǎn)作為單位元,記為 O,易證得 O \bigoplus P = P \bigoplus O = P。(因?yàn)?O \bigoplus P = O ? (O ? P) = P)。

  • 逆元:因?yàn)闄E圓曲線過于X軸對稱,P(x, y) 的關(guān)于 X 軸對稱的點(diǎn) P^{'}(x, -y) 就是 P 的逆元。因?yàn)?P \bigoplus P^{'} = O ? (P ? P^{'}) = O ? O = O

  • 交換律: P \bigoplus Q = O ? (P ? Q) = O ? (Q ? P) = Q \bigoplus P

  • 結(jié)合律: (P \bigoplus Q) \bigoplus R = P \bigoplus (Q \bigoplus R),通過幾何作圖可以驗(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)。

(P+Q)+R

P+(Q+R)

由此可知,橢圓曲線上的點(diǎn)在橢圓曲線加法運(yùn)算上構(gòu)成了一個(gè)阿貝爾群。增加了單位元后,橢圓曲線方程改為:

E = \{(x, y) \in \mathbb{R}^2 \ | y^2 = x^3 + ax + b, \ 4a^3 + 27b^2 \neq 0\} \ \bigcup \ \{ O \}

由定義可知,P \bigoplus Q = O ? (P ? Q) = O ? R = -R,所以,最終加法只需要計(jì)算交點(diǎn) R 的逆元 -R 即可。幾種特殊情況說明:

  • 1)如果 P, Q 不是切點(diǎn)且不是互為逆元,則有第三個(gè)交點(diǎn) R,故 P \bigoplus Q = -R
  • 2)如果 P 或者 Q 是切點(diǎn),則 PQ 就是橢圓曲線的一條切線。假如 Q 是切點(diǎn),則有 Q \bigoplus Q = -P
  • 3)如果 PQ 連線垂直于X軸,即 P = -Q,則跟曲線沒有第三個(gè)交點(diǎn),可以認(rèn)為是交于無窮遠(yuǎn)點(diǎn) O,故而 P \bigoplus Q = O
  • 4)如果 P = Q,則過它們的直線就是橢圓曲線過點(diǎn) P 的切線,該直線一般來說跟橢圓曲線有另一個(gè)交點(diǎn) R。如果恰好該切線如圖4這樣跟曲線沒有其他交點(diǎn),則可以認(rèn)為交點(diǎn)為 O,即此時(shí) P \bigoplus P = O
特殊情況說明

3.2 代數(shù)加法

上一節(jié)定義了橢圓曲線幾何上意義的點(diǎn)加法,需要轉(zhuǎn)換為代數(shù)加法以方便計(jì)算。要注意的是,這并不是兩個(gè)點(diǎn)的坐標(biāo)簡單相加

假設(shè)直線 PQ 的斜率 m,然后將直線方程 y=mx+c 代入曲線可以得到:(mx+c)^2 = x^3 + ax +b, 轉(zhuǎn)換成標(biāo)準(zhǔn)式,根據(jù)韋達(dá)定理 x_P + x_Q + x_R = m^2,即而可求得 R(x_R, y_R),想了解具體推導(dǎo)過程的可參見 [cubic-equations]

x_R = m^2 - x_P - x_Q
y_R = y_P + m(x_R - x_P)

斜率 m 計(jì)算需要區(qū)分兩種情況,當(dāng) P=Q 時(shí)求橢圓曲線在 P 點(diǎn)的切線斜率(求導(dǎo))即可:
m = \frac{y_Q - y_P}{x_P - x_Q} \quad (P \neq Q)
m = \frac{3x_P^2 + a}{2y_P} \quad (P = Q)

可以簡單驗(yàn)證,比如橢圓曲線是 y^2 = x^3 - 7x + 10,P=(1,2), Q=(3,4),通過參考資料1的 [可視化工具] 可得 P \bigoplus Q = -R = (-3, 2)。容易驗(yàn)證,與代數(shù)加法公式計(jì)算結(jié)果一致。

m = \frac{y_Q - y_P}{x_P - x_Q} = \frac{4-2}{3-1} = 1
x_R = m^2 - x_P - x_Q = 1^2 - 1 - 3 = -3
y_R = y_P + m(x_R - x_P) = 2 + 1(-3-1) = -2

對于特殊情況P, Q中有一個(gè)是切點(diǎn)的情況,如 P=(-1, 4), Q=(1, 2),計(jì)算方式不變,易得 P \bigoplus Q = (1, -2)。而對于特殊情況 P = Q,采用切線斜率亦可驗(yàn)證公式正確。

3.3 標(biāo)量乘法

在實(shí)際加密算法中,我們通常需要多次通過橢圓曲線加法來實(shí)現(xiàn)一次加密,如下圖所示:

標(biāo)量乘法

圖中打點(diǎn)的過程就是:

A \bigoplus B = C \to A \bigoplus C = D \to A \bigoplus D = E

而在實(shí)際加密算法中,我們常常是使用一個(gè)點(diǎn)自己疊加,即初始直線變成橢圓曲線的切線即可,像下面這樣:

A \bigoplus A = B \to A \bigoplus B = C \to A \bigoplus C = D \to ...

我們定義對一個(gè)點(diǎn) P 進(jìn)行 n 次加法得到 nP,稱之為標(biāo)量乘法。如前面例子中 B=2A,C=3A,D = 4A

nP = \underbrace { P \bigoplus P \bigoplus ... \bigoplus P}_{n \ times}

不過,當(dāng) n 很大時(shí),執(zhí)行 n 次加法需要 O(n) 時(shí)間,效率有問題。因?yàn)闄E圓曲線點(diǎn)加法在實(shí)數(shù)域構(gòu)成阿貝爾群,滿足交換律和結(jié)合律,于是可以通過 [Double-and-add] 算法進(jìn)行優(yōu)化。比如 n=151,其二進(jìn)制表示為 10010111_2,通過優(yōu)化只要7次倍乘和4次加法計(jì)算即可,時(shí)間復(fù)雜度降到 O(log\ n)。這是一個(gè)很好的單向函數(shù),正向計(jì)算容易,而反向和蠻力計(jì)算復(fù)雜。

151 P = 2^7 P \bigoplus 2^4 P \bigoplus 2^2 P \bigoplus 2^1 P \bigoplus 2^0 P

Q = nP,則 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ù)域 \mathbb{F}_p(即對于點(diǎn) P = (x_P, y_P), x_P, y_P \in \{0, 1, ..., p-1\}, p 為素?cái)?shù))。于是破解就會變成一個(gè)離散對數(shù)問題,這比連續(xù)曲線上的對數(shù)問題會難很多。素?cái)?shù)域下橢圓曲線定義如下:

E = \{(x, y) \in (\mathbb{F_p})^2 \ | y^2 \equiv x^3 + ax + b(mod \ p), \ (a, b \in \mathbb{F}_p, 4a^3 + 27b^2 \not \equiv 0(mod \ p))\}\bigcup \ \{ O \}

下面是曲線 y^2 \equiv x^3 - 7x + 10(mod \ 19)y^2 \equiv x^3 - 7x + 10(mod \ 97) 的圖像。可以發(fā)現(xiàn),橢圓曲線變成了離散的點(diǎn),且關(guān)于 y = p/2 對稱。

有限域橢圓曲線

定義 \mathbb{F}_p 上橢圓曲線點(diǎn)加法 P \bigoplus Q = -R 如下,公式跟實(shí)數(shù)域上相比只是多了模 p 操作。

x_R = (m^2 - x_P - x_Q) \bmod p
y_R = [y_P + m(x_R - x_P)] \bmod p

斜率 m 計(jì)算同樣分兩種情況:
m = [(y_Q - y_P)(x_P - x_Q)^{-1}] \bmod p \ (P \neq Q)
m = [(3x_P^2 + a)(2y_P)^{-1}] \bmod p \ (P = Q)

橢圓曲線在素?cái)?shù)域 \mathbb{F}_p 上的點(diǎn)加法依然構(gòu)成阿貝爾群。單位元依舊是無窮遠(yuǎn)點(diǎn),元素 R=(x_R, y_R) 的逆元變成 -R = (x_R, -y_R \bmod p)。而交換律、結(jié)合律、封閉性則可以通過素域上的模加法、模乘法來證明。實(shí)數(shù)域的橢圓曲線點(diǎn)加法定義是有明確幾何意義的,從幾何上好證明。而橢圓曲線在 \mathbb{F}_p 就沒有明顯的幾何意義了,觀察可發(fā)現(xiàn) P, Q, R 三點(diǎn)滿足 ax + by + c \equiv 0(mod ~ p),群律的證明過于繁瑣,略去(其實(shí)是沒有找到一個(gè)簡易的證明)。

以前面曲線為例,P = (1, 2), Q=(3,4),則有 P + Q = -R = (16, 2),且 R-R 都在橢圓曲線上。從圖形上看,P, Q, R 在直線 x-y+1 \equiv 0(mod ~19) 上。

m = [(4-2)(3-1)^{-1}] \bmod 19 = 1
x_R = (1^2 - 1 - 3) \bmod 19 = -3 \bmod 19 = 16
y_R = [2 + 1(16 - 1)] \bmod 19 = 17 \bmod 19 = 17
P + Q = -R = (16, -17 \bmod 19) = (16, 2)

有限域點(diǎn)加法

4.2 橢圓曲線群的階

在有限域下,橢圓曲線加法群的元素是有限的,元素?cái)?shù)目就是群的階。

如橢圓曲線 y^2 \equiv x^3 - 7x + 10(mod ~ 19),其在素?cái)?shù)域 \mathbb{F}_{19} 中元素有 (1, 2), (1, 17), (2, 2)...,階為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定理給出了橢圓曲線在 \mathbb{F}_p 的階的范圍,可以看出,當(dāng) p 很大時(shí),階跟 p 的值是比較接近的。

Hasses 定理:令 E\mathbb{F}_p 上的橢圓曲線,E 上的點(diǎn)的數(shù)量 |E| 滿足如下條件:
p + 1 - 2\sqrt{p} \leq |E| \leq p + 1 + 2\sqrt{p}

4.3 循環(huán)子群

跟實(shí)數(shù)域一樣,在素?cái)?shù)域里面也是選取一個(gè)點(diǎn) P,然后計(jì)算倍乘 nP 作為公鑰。還是以 y^2 \equiv x^3 - 7x + 10(mod ~ 19) 為例,P=(1,2),我們采用素?cái)?shù)域下新的計(jì)算公式計(jì)算 nP

0P = O, \ 1P = (1, 2), \ 2P = (18, 15), \ 3P = (9, 12),\ ...
8P = O, \ 9P = (1, 2), \ 10P = (18, 15),\ 11P=(9, 12) \ ...

可以發(fā)現(xiàn) kP = (k \bmod 8)P,即 P 的標(biāo)量乘法得到的點(diǎn)集是原橢圓曲線群的一個(gè)子集,則它是原橢圓曲線群的一個(gè)子群,而且是循環(huán)子群。子群中元素個(gè)數(shù)稱為子群的階(示例子群的階為8),點(diǎn) P 稱為該子群的基點(diǎn)或者生成元。循環(huán)子群是橢圓曲線密碼體系的基礎(chǔ),我們期望子群中元素越多越好,如何找到一個(gè)合適的子群尤為重要。

首先要解決一個(gè)問題,就是已知 \mathbb{F}_p 下的橢圓曲線上的點(diǎn) P,如何求得 P 的倍乘運(yùn)算后生成的子群的階? 根據(jù)拉格朗日的群論定理,子群的階是父群的階的約數(shù)。求解曲線上點(diǎn) P 生成的子群的階可以用下面方法:

  • 首先,使用Schoof算法求得橢圓曲線群的階 N
  • 找到 N 所有的約數(shù)。
  • N 所有的約數(shù) n,計(jì)算 nP
  • 其中 nP = O 中最小的 n 就是子群的階。

以示例曲線為例,父群的階是 24,則以曲線上的點(diǎn)生成的子群的階只能是 1,2,3,4,6,8,12,24。對于點(diǎn) P = (1,2),P \neq O, 2P \neq O, ..., 8P = 0,故其生成的子群的階就是 8,而點(diǎn) Q = (3, 4) 生成的子群的階則正好等于父群的階24。

4.4 尋找基點(diǎn)

在加密算法中,我們期望找到一個(gè)階高的子群。不過,通常不是先去找個(gè)基點(diǎn),然后計(jì)算子群的階,因?yàn)檫@樣過于不確定,算法上不好實(shí)現(xiàn)。相反地,先選擇一個(gè)大的子群階,然后再找生成該子群的一個(gè)基點(diǎn)就容易多了。

前面提到,子群的階 n 是父群的階 N 的約數(shù),即有 N = nh \to h = N/n,h 是一個(gè)整數(shù),我們稱之為子群的余因子(cofactor)。因?yàn)?nP = O,所以有:

NP = n(hP) = O

通常會選擇一個(gè)素?cái)?shù)作為子群的階,即 n 是素?cái)?shù)。可以發(fā)現(xiàn),點(diǎn) G=hP 生成了階為 n 的子群(G=hP=O 除外,因?yàn)檫@個(gè)子群的階為1),不等于 O 的點(diǎn) G 就是我們尋找的基點(diǎn)。具體步驟如下:

  • 1)計(jì)算橢圓曲線的階 N
  • 2)選擇子群的階 nnN 的約數(shù),且要選擇素?cái)?shù)。通常是越大越好,如 n = N
  • 3)計(jì)算余因子 h = N/n
  • 4)從橢圓曲線隨機(jī)選取一個(gè)點(diǎn) P,計(jì)算 G=hP
  • 5)如果 G=O,則返回第 4 步重新選一個(gè)點(diǎn)計(jì)算。

需要注意,上面算法里的 n 必須是素?cái)?shù),否則計(jì)算的基點(diǎn) G 生成的子群的階可能是 n 的約數(shù)而不是 n,不符合要求。以曲線 y^2 \equiv x^3 - x + 1(mod ~ 29)為例,N = 37,我們選擇 n = 37,則 h = 1,隨機(jī)選取一個(gè)點(diǎn) P = (3, 5),計(jì)算 G=hP=P=(3,5),恰好滿足要求。

4.5 域參數(shù)

如前所述,橢圓曲線加密算法工作在素?cái)?shù)域下的橢圓曲線循環(huán)子群中,需要的域參數(shù)(Domain Parameter)包括 (p, a, b, G, n, h)

  • p: 素?cái)?shù)域的大小。
  • a, b: 橢圓曲線 y^2 = x^3 + ax + b 的系數(shù)。
  • G:生成子群的基點(diǎn)。
  • n:子群的階。
  • h:子群的余因子。

如比特幣用來做數(shù)字簽名中采用的橢圓曲線 [secp256k1] 的域參數(shù)如下:

  • p = 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F = 2^{256} - 2^{32} - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
  • a = 0, b = 7,即曲線方程是 y^2 = x^3 + 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 的私鑰是 d_A,公鑰則為 H_A=d_AG,Bob 的則是 d_BH_B = d_BG。他們用的同一個(gè)基點(diǎn) G、同一個(gè)整數(shù)有限域,同一條橢圓曲線。
  • Alice 和 Bob 通過不安全的信道交換公鑰 H_AH_B
  • Alice 計(jì)算 S = d_AH_B,Bob 計(jì)算 S = d_BH_A,共享密鑰就是 S。對稱加密算法 AES 或者 3DES 只用 S 的一個(gè)坐標(biāo)如x坐標(biāo)作為密鑰即可。
    S = d_AH_B = d_BH_A = d_Ad_BG
  • 要想破解密鑰就好比"已知 G,aG,bG 求 a 和 b?",當(dāng) ab 很大的時(shí)候,破解是很困難的,這也被稱為橢圓曲線的離散對數(shù)問題,即 ECDLP。
ECDH 示意圖

ECDHE (Ephemeral ECDH) 與 ECDH 不同之處在于,它的公私鑰并不固定,而是每次會話臨時(shí)生成,這樣就能具有前向安全性,實(shí)際項(xiàng)目中也用的更多。

5.2 ECDSA

ECDSA 是 DSA 算法的變種,常用于數(shù)字簽名。Alice 通過橢圓曲線算法生成公私鑰 d_A, H_A,對要簽名的消息通過哈希算法生成摘要 z (z為整數(shù)),然后 Alice 用私鑰 d_A 按照下面步驟對摘要 z 生成簽名。 Bob 通過公鑰 H_A 驗(yàn)證簽名。

生成簽名

  • 1)Alice 選取一個(gè)隨機(jī)數(shù) k,其中 k \in \{1, 2, ...n-1\},n為子群的階。
  • 2)計(jì)算 P = kG,G 是曲線的基點(diǎn)。
  • 3)計(jì)算 r = x_P \bmod n,如果 r = 0,則回到第1步重新選擇一個(gè) k 重試。
  • 4)計(jì)算 s = k^{-1}(z + rd_A) \bmod n。如果 s = 0,則回到第1步重新選擇一個(gè) k 重試。
  • 5)(r, s) 就是最終的簽名對。

校驗(yàn)簽名

  • 1)計(jì)算 u_1 = s^{-1}z \bmod n
  • 2)計(jì)算 u_2 = s^{-1}r \bmod n
  • 3)計(jì)算 P = u_1G + u_2H_A
  • 4)如果 x_P \bmod n = r,則簽名有效。
ECDSA 示意圖

證明

因?yàn)?H_A = d_AG,于是:

P = u_1G + u_2H_A = u_1G + u_2d_AG = (u_1 + u_2d_A)G
= ((s^{-1}z + s^{-1}rd_A) ~ mod ~ n) G = (s^{-1}(z + d_A) ~ mod ~ n) G

而之前定義有:s = k^{-1}(z + rd_A) \bmod n \Rightarrow k = s^{-1}(z + rd_A) \bmod n

因此 P = (s^{-1}(z + d_A) ~mod~ n)G = kG,這與生成簽名時(shí)一致,故而證明完畢。

實(shí)例分析

還是以y^2 \equiv x^3 - x + 1(mod ~ 29)為例,n=37,選取 G=(3,5)。選擇 d_A=7,則 H_A = d_AG = 7G = (27, 16)。假設(shè)要簽名的消息摘要 z = 88。經(jīng)過計(jì)算發(fā)現(xiàn),驗(yàn)證成功。

生成簽名:

  • 選擇隨機(jī)數(shù) k = 11
  • P = kG = 11G = (2, 6)
  • r = x_P \bmod n = 2 \bmod 37 = 2
  • s = k^{-1}(z + rd_A) \bmod n = 27(88 + 2*7) \bmod 37= 16
  • 所以簽名對就是 (r, s) = (2, 16)

驗(yàn)證簽名:

  • u_1 = s^{-1}z \bmod n = 7*88 \bmod 37 = 24
  • u_2 = s^{-1}r \bmod n=7*2 \bmod 37 = 14
  • P = u_1G + u_2H_A = 122G = (2, 6)
  • x_P \bmod n = 2 \bmod 37 = 2 = r

注意事項(xiàng)

  • ECDSA 中用的子群的階 n 必須是素?cái)?shù),否則 k^{-1} \bmod n 可能不存在。
  • 選擇 k 的隨機(jī)數(shù)生成器一定要設(shè)計(jì)好,不能有漏洞。如果隨機(jī)數(shù)生成不夠隨機(jī)或者可預(yù)測,則可能出現(xiàn)兩個(gè)相同的隨機(jī)數(shù),繼而會有兩個(gè)相同的簽名,如 r_1 = r_2。則根據(jù)公式可以計(jì)算出 k,繼而就能計(jì)算出私鑰 d_A 了。

(s_1 - s_2) \bmod n = k^{-1}(z_1 - z_2) \bmod n \Rightarrow k = (z_1 - z_2)(s_1 - s_2)^{-1} \bmod n

s = k^{-1}(z + rd_S) \bmod{n} \Rightarrow\ \ d_S = r^{-1} (sk - z) \bmod{n}

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)量乘法,Q = kP,通過隨機(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 需要滿足 p \neq hn,否則會有風(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)采納。

參考資料

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

推薦閱讀更多精彩內(nèi)容