壹般橢圓曲線方程式表示為:(其中a,b,c,d為系數)
> y2=ax3+ bx2+cx+d
典型的橢圓曲線如:y2=x3?4x2+16
先擺壹個栗子:
小米很難算到的那個數,就是公鑰密碼算法中的私鑰(壹個公鑰密碼算法安全的必要條件(非充分)是“由公鑰不能反推出私鑰”),公鑰密碼算法最根本的原理是利用信息的不對稱性:即掌握私鑰的人在整個通信過程中掌握最多的信息。
橢圓曲線加密算法是壹個基於加法階數難求問題的密碼方案。 對於橢圓曲線來講,橢圓曲線的基點就是例子裏面的5,而私鑰就是基點的加法階數(例子裏面的11),公鑰是基點(5)進行對應階數的加法(11次)得到的結果(55)。
簡單描述就是:G * k = K (G,K公開,k保密)
上述例子相對簡單,橢圓曲線加密算法裏的加法建立在 “有限域上的二元三次曲線上的點”上 ,組成壹個“有限加法循環群”。具體的說,這個加法的幾何定義如下圖,兩個點的加法結果是指這兩點的連線和曲線的交點關於x軸的鏡像。
如果我們從某壹點出發(所謂的單位元,比如正整數域的1,代表壹個空間裏的最基本單元),不停做自增操作(所謂群操作,比如++),枚舉出整個空間的集合元素。如圖:
因此給定橢圓曲線的某壹點G,從G出發,不停做切線,找對稱點,依次得到-2G,2G,-4G,4G,-8G,8G... 。即:當給定G點時,已知x,求xG點並不困難。反之,已知xG點,求x則非常困難。即Q = NG,N就是我們的私鑰,Q就是我們的公鑰。
現在我們知道了公鑰(Q)和私鑰(N)的生成的原理,我們在看看橢圓曲線數字簽名算法(ECDSA)的過程,橢圓曲線數字簽名算法(ECDSA)是使用橢圓曲線密碼(ECC)對數字簽名算法(DSA)的模擬。ECDSA於1999年成為ANSI標準,並於2000年成為IEEE和NIST標準。
私鑰主要用於 簽名,解密 ;公鑰主要用於 驗簽,加密 ,可以通過私鑰可以計算出公鑰,反之則不行。
公鑰加密:公鑰加密的內容可以用私鑰來解密——只有私鑰持有者才能解密。
私鑰簽名:私鑰簽名的內容可以用公鑰驗證。公鑰能驗證的簽名均可視為私鑰持有人所簽署。
通常需要六個參數來描敘壹個特定的橢圓曲線:T = (p, a, b, G, n, h).
p: 代表有限域Fp的那個質數 a,b:橢圓方程的參數 G: 橢圓曲線上的壹個基點G = (xG, yG) n:G在Fp中規定的序號,壹個質數。 h:余因數(cofactor),控制選取點的密度。h = #E(Fp) / n。
這裏以secp256k1曲線(比特幣簽名所使用的曲線)為例介紹壹下公私鑰對的產生的過成。
secp256k1的參數為:
本質上ECDSA的私鑰就是壹個隨機數滿足在曲線G的n階裏及k∈(0,n),根據Q=kG可以計算出公鑰,生成的私鑰壹般為32字節大小,公鑰通常為64個字節大小。如:
ECDSA簽名算法的輸入是數據的哈希值,而不是數據的本身,我們假設用戶的密鑰對:(d, Q);(d為私鑰,Q為公鑰) 待簽名的信息:M; e = Hash(M);簽名:Signature(e) = ( r, s)。
簽名接口:
驗證接口:
壹個例子: