拓展 欧几里得算法 求逆元_ECC椭圆曲线加密算法:有限域和离散对数
Hi all,我來翻譯第二篇啦。若大家發(fā)現(xiàn)那些翻譯的不夠準(zhǔn)確還望指出,不勝感激。首先放上原文鏈接:
http://andrea.corbellini.name/2015/05/23/elliptic-curve-cryptography-finite-fields-and-discrete-logarithms/?andrea.corbellini.name在上一篇文章里,我們已經(jīng)展示了在實數(shù)域上的橢圓曲線在“群”上是如何使用的。尤其是,我們還針對“加”(point addition) 定義了一個規(guī)則:對于在一條線上的三個點,他們的和是0(P+Q+R=0). 我們也推出了一個幾何方法和代數(shù)方法去計算這些點的加法。
然后呢,我們介紹了標(biāo)量積(scalar multiplication) (nP=P+P+...+P),我們還發(fā)現(xiàn)了一個“簡單的”算法去計算這些標(biāo)量積。double and add
整數(shù)域模p
首先,有限域是一個帶有有限元素的集合。比如,有一個有限域是整數(shù)模p的集合(integers mod p,p是素數(shù)),可表示為
或 ,我們一般用后者。在這個有限域中,我們有兩個二元操作:加(+)和乘( * )。這兩種操作都是封閉的,滿足結(jié)合律和交換律,[這塊的封閉應(yīng)當(dāng)這樣理解:在有限域中,兩個數(shù)的加和乘的結(jié)果仍然在這個有限域中。--譯者注] 且含有一個獨一無二的單位元,對于所有的有限域里的元素,都有一個獨一無二的相反數(shù)。最后,乘法還滿足分配律:
。整數(shù)模p的集合包含所有從0到
的整數(shù)。加法和乘法都按模數(shù)運算規(guī)則去計算。這里有一些 的例子:- 加:
- 減:
- 乘:
- 加法逆元: 的確:
- 乘法逆元: 的確:
如果這些式子你覺得不太能理解,那么你可能需要一些關(guān)于模運算的入門指導(dǎo),請參考:Khan Academy.
就如我前面提到的,整數(shù)模p是一個域,因此上面列的所有屬性都是滿足的。請注意p是素數(shù)這個條件很重要!比如 整數(shù)模4的集合就不是域:2沒有乘法逆元(
無解)。模p的除法
我們即將定義在
上的橢圓曲線,但是在這之前我們需要弄清在 上 代表什么?可以簡單表示為: , 等于x 乘上 y的逆元。這個解釋給了我們基本的做除法的方法:1.求逆元,2.做乘法。用歐幾里得拓展算法來計算乘法逆元非常的“簡單易做”,它的時間復(fù)雜度是
(或者是 如果考慮bit長度的話) 在最壞的情況下。 這里不會給出歐幾里得拓展算法的細節(jié),但是放上Python的代碼:def在
上的橢圓曲線現(xiàn)在,所有的必要元素都已就位,用來在
上定義橢圓曲線,它的形式是點集,在上一篇文章中我們是這樣寫的:現(xiàn)在,可以寫成:
這里的0仍然是無限遠的點,a和b是
上的兩個整數(shù)。圖1圖1:曲線
且 . 請注意,對于每一個 ,至多有兩個對稱的點滿足: .圖2圖2:曲線
是一個奇點,并且在 處有三個點,這是一個無效的橢圓曲線。圖1是連續(xù)的橢圓曲線在xy軸平面上表現(xiàn)為不相交的點集。在
上的橢圓曲線仍然可以形成阿貝爾群。(elliptic curves in still form an abelian group.)點加
顯然,我們需要改變一點點關(guān)于加法的定義,為了使它能更好的工作在
。 在實數(shù)域上,我們約定俗成三個對齊的點的和是0( )。在實數(shù)域上這個定義沒有問題,就是共線。但是在 上,我們?nèi)绾味x三個點的對齊?我們可以說,如果一條直線連接了三個點,這三個點就是對齊的。當(dāng)然,
上的直線不同于 上的直線。也就是說, 上的直線就是點集( ),這個點集滿足 (這是帶有" "的標(biāo)準(zhǔn)的線性方程式)請見注釋1(方程式在這里長的不標(biāo)準(zhǔn)...)注釋1: 上圖的所有點都在
, 請注意連接某些點的一次方程 在圖中不停的“重復(fù)(因為有mod 127...)”自己。鑒于這已經(jīng)是一個群,所以點加具備一些通用的屬性:
- (單位元的定義)
- 給定一個非零點Q, 逆元-Q和它具有相同的橫坐標(biāo),但是縱坐標(biāo)相反。或者還有一種方式, 。舉個例子,如果曲線在 上有一個點 ,逆元是 。
- (相反數(shù)的定義)
代數(shù)和
點加的計算和上篇文章中基本差不多,除了要在每個等式后加上“
”。因此,鑒于 和 ,我們可以計算 ,如下:如果
,假設(shè)斜率是:如果
,斜率是:這個式子長的和在實數(shù)域的點加差不多吧,這不是個巧合,事實上,以上的方程式適用于任一域,無論是有限域還是無限域(除了
和 )。有個問題是:證明這些法則通常要引入一些復(fù)雜的數(shù)學(xué)概念。但是我發(fā)現(xiàn)Stefan Friedl給出的證明淺顯易懂。如果你對“為什么這個方程式幾乎適用于所有環(huán)境”很感興趣,read it!言歸正傳,由于在幾何方法上有一些問題,所以我們不會定義一個幾何方法。比如,在第一篇稿子中,我們說 要計算
我們需要在曲線 上正切,但是如果不是一條線的話(without continuity, 即沒有連續(xù)性),“正切”沒有任何意義。確實我們可以權(quán)衡利弊后做一些變通,但是這種純幾何方法太復(fù)雜而且不實用。橢圓曲線的階
我們之前說到每個在有限域上的橢圓曲線都由有限個點組成。那么我們不禁要問:到底是多少個點?
首先,我們要定義一下 在一個群有多少個點就叫做這個群的“階”(order)【在此放上wiki關(guān)于order的解釋】。
群舉從
到 所有可能的值去數(shù)有多少個點不太可行,因為它的時間復(fù)雜度是 ,當(dāng) 很大的時候,這算下來就很慢很慢。還好,有一個更快的算法來計算階:Schoof算法。在此不展細節(jié),我們只需要知道他的復(fù)雜度是多項式時間(大名鼎鼎的Polynomial-Time.在此奉上wiki)
數(shù)乘和循環(huán)子群
在實數(shù)域乘法的定義是:
我們可以用倍加算法(請見上一篇)去做乘法,時間復(fù)雜度是
(或者 ,這里的 是 的二進制倍數(shù))。在
上的橢圓曲線的乘法有個很有意思的屬性。取一個曲線: 和點 ,現(xiàn)在來計算P的所有倍數(shù):p=(3,6)的所有倍乘的取值只有5個點(0, P, 2P, 3P, 4P )然后不停的循環(huán)重復(fù)。我們能很容易的發(fā)現(xiàn)橢圓曲線上的數(shù)乘和模運算的加法非常相似。- ...
到此,我們發(fā)現(xiàn)了兩個事情:第一,P的倍乘只有5個取值,永遠不會出現(xiàn)第6個。第二,他們是循環(huán)重復(fù)的。我們可以寫成這樣: (
取任意整數(shù))所以呢,這五個式子可以被“壓縮”成一個(模運算):
。不僅如此,我們可以立即驗證:P的加法是個閉環(huán)。(These five points are closed under addition. )這意味著:不論我加的是0, P, 2P, 3P 還是 4P, 結(jié)果永遠都是這五個點中的一個。Again, 其他點永遠不會出現(xiàn)在這根橢圓曲線的結(jié)果里。
這個規(guī)則同樣適用于所有的點,不僅僅是對
。事實上,對于任意的 :這意味著:如果我們將n倍的P進行相加,我們獲得的仍然是P的倍數(shù)(If we add two multiples of P, we obtain a multiple of P)【由于這個定理太重要了,我把英文也放上來】。(比如,nP的相加是個閉環(huán)。)這足夠來證明:nP的集合是橢圓曲線形成的群里的一個具有循環(huán)性質(zhì)的子群(the set of the multiples of P is a cyclic subgroup of the group formed by the elliptic curve.)。這里的點
叫做循環(huán)子群的 生成器 或者 基點。子群的階
我們可以捫心自問下,由P生成子群的階到底是什么?(或者,P的階是什么?)為了回答這個問題,我們不能使用Schoolf的算法,因為這個算法只能在整個的橢圓曲線上生效,在子群上無效。在解決這個問題之前,我們需要打點地基:
- 到現(xiàn)在為止,我們已經(jīng)定義了:階,就是一個群的點的數(shù)量。這個定義仍然是有效的,但是在循環(huán)的子群里我們可以下一個新的,與前面的定義相等的定義: 的階是最小的正整數(shù) , 滿足的條件是 。事實上,我們回顧前面的例子, 。
- 的階和橢圓曲線是有聯(lián)系的,拉格朗日定理告訴我們,子群的階是父群的階的因子。換句話說,如果一個橢圓曲線包含 個點,它的一個子群包含 個點,那么 是 的因子。
以上兩條規(guī)則結(jié)合起來給我們指了一條明路,如何根據(jù)基點
找到子群的階:舉個栗子,在
上的曲線 的階是 。它的子群的階可能是 。如果我們代入曲線上的點 我們可以發(fā)現(xiàn) 。因此, 的階是7。請注意,很重要的一點是一定一定要是最小的因子,而不是隨機的一個因子。如果我們隨機處理一下,我們可能取
,但它不是子群的階,僅僅是一個倍數(shù)。另一個例子:定義在
橢圓曲線上的方程式 的階是 ,這是一個素數(shù),所以它的子群的階可能只含有1和37. 很容易我們就可以猜出來,當(dāng) 的時候,子群僅包含一個點,就是0(參考上篇文章的point at infinity)。當(dāng) 時,子群包含橢圓曲線的所有的點。找基點
在ECC算法中,我們想找到一個階數(shù)比較大的子群。所以通常呢,我們會選擇一條橢圓曲線,然后去計算它的階(
), 選擇一個以較大的因子作為子群的階( ),最終,依此找到一個合適的基點。也就是說,我們不會選擇一個基點然后去計算它的階,我們會反著來操作一波。首先,我們要介紹一個術(shù)語。拉格朗日定理說,
里的 永遠是一個整數(shù)(因為 是 的因子)。這里的 有個名字:輔因子(cofactor of the subgroup)。現(xiàn)在,思考一下對于橢圓曲線中的每一個點,我們有
,且 是任意一個 的倍數(shù)。借助輔因子的概念,我們可以寫成: 。假設(shè)
是素數(shù),這個方程式告訴我們:點 生成了一個階為 的子群(除了當(dāng) ,在這個例子中子群的階是1)。現(xiàn)在我們總結(jié)一下算法:
請注意,上面這個算法僅僅適用于
是素數(shù)的情況下。如果 不是素數(shù),那么 的階可以是 的任何一個因子。離散對數(shù)
當(dāng)有一條連續(xù)的橢圓曲線,我們現(xiàn)在要討論的問題是:如果我們已知
,要想得到 ,我們應(yīng)該怎么去計算這個 ?這個問題,就是橢圓曲線中大名鼎鼎的離散對數(shù)問題,它被認為是個很難很難的問題!【插一句,這也是ECC的核心的核心,也是為什么ECC安全的原因】。到目前為止,沒有找到一個能在多項式時間內(nèi)解出來的算法。因此,也沒有數(shù)學(xué)證明。
這個難題同樣也是其他涉及離散對數(shù)問題的加密算法的難題,比如DSA算法,D-H密鑰交換算法,ElGamal算法。不同點在于,上述算法使用了模冪算法而不是數(shù)乘。模冪算法的離散對數(shù)問題可以簡述為:當(dāng)我們知道
, ,那么如何求 ?這兩個問題中,值都是“離散”的,因為他們都取自于有限的集合(循環(huán)的子群)。而且都是“對數(shù)”,就是普通意義上的對數(shù)運算。
ECC有趣的地方在于,到今天為止,它的離散問題看上去比其他密碼學(xué)中的離散問題難多了。這就說明我們可以用更少的位數(shù)的整數(shù)
做到和其他加密算法一樣安全級別的加密效果。其他
下一篇會介紹:鍵值對的生成,ECDH和ECDSA算法。
【我已經(jīng)盡量的還原文章了,其中加了一點點個人見解和wiki的簡介。閱讀愉快:)--xiaopei】
總結(jié)
以上是生活随笔為你收集整理的拓展 欧几里得算法 求逆元_ECC椭圆曲线加密算法:有限域和离散对数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot 根据传参返回不同的
- 下一篇: SpringBoot 页面跳转后css和