ECDSA橢圓曲線數字簽名演算法

2022-08-11 22:33:24 字數 4434 閱讀 2478

rust實現;

目錄簽名

驗證橢圓曲線域引數

保證橢圓曲線安全性的一些必要條件

橢圓曲線的選擇

基點的選擇

橢圓曲線域引數的選擇

橢圓曲線金鑰對

素性參考資料

橢圓加密數學基礎

記有自然數\(x\), 與其對應的八位串記為\(m\). 其中, \(len(m) = k, 2^ \gt x\), 那麼整數和八位串之間的轉換可使用如下公式:

記有域元素\(\alpha, \alpha \in f_q\), 將其轉換為八位串\(m\):

\(q \mod 2 = 0, q = 2^m\):

記有域\(f_q\), 八位串\(m, len(m) = l, l = \lceil t/8 \rceil, t = \lceil \log_2(q) \rceil\), 將其轉為域元素\(\alpha\):

\(q \mod 2 = 0, q = 2^m\):

記有域元素\(\alpha \in f_q\), 將其轉為整數\(x\):

\(q \mod 2 = 0, q = 2^m\):

無窮遠點\(\mathcal\)轉為\(m = 0x00\);

記有橢圓曲線\(e(f_q)\)上的非無窮遠點\(p=(x_p, y_p)\), 將其轉為八位串\(m\):

\(z_p = 1\):

若以非壓縮形式表示點, 則:

若以混合形式表示點, 則:

\(z_p = 1\):

記有域\(f_q\), 和合法的八位串\(m\), 將其轉為點$p=(x_p, y_p);:

\(len(m) = l + 1\):

\(s = 0x03\);

將八位串\(m_x\)轉為域元素\(x_p\);

壓縮形式的點\((x_p, z_p)\)轉為點\((x_p, y_p)\);

\(len(m) = 2\cdot l + 1\):

\(s = 0x07\)

由\((x_p, y_p)\)計算\(z_^\), 驗證\(z_p = z_^\);

由\((x_p, z_p)\)計算\((x_p, y_^)\), 驗證\(y_p = y_^\);

\(s = k^\cdot (e+d\cdot r) \mod n,\quad s \ne 0\);

輸出\((r, s), r\in [1,n-1], s\in [1,n-1]\);

\(u_1 = e' \cdot (s')^ \mod n, u_2 = r' (s')^\mod n\);

計算橢圓曲線點\(r=(x_r, y_r) = u_1\cdot g + u_2\cdot q\);

驗證\(r \ne \mathcal\);

將\(x_r\)轉為整數\(j\);

\(v = j\mod n\);

驗證\(v = r'\);

\(u_1 = e' \cdot (s')^ \mod n, u_2 = r' (s')^\mod n\);

\(k' = (u_1 + u_2\cdot d) \mod n\);

\(r = k'\cdot g\);

驗證\(r \ne \mathcal\);

\(v = j\mod n\);

驗證\(v = r'\);

記由橢圓曲線上的一點\(p=(x_p, y_p)\), 則點可以壓縮為\(x_p\)和\(y_p\)的某些位\(z_p\);

域\(f_p\)上點壓縮

\(p=(x_p,y_p), y^2 = x^3 + a\cdot x+b,\quad x,y\in f_p,\ z_p = rightmost_1(y_p)\);

域\(f_\)上點壓縮

\(p=(x_p,y_p), y^2 + x\cdot y = x^3 + a\cdot x^2 + b,\quad x,y\in f_\). 若\(x_p=0\), 則\(z_p=0\). 否則, \(z_p = rightmost_1(y_p\cdot x_^)\);

\(y_p = x_p\cdot \beta\);

mov條件

menezes-okamoto-vanstone(mov): \(f_q \rightarrow f_, b\ge 1\), ans x9.62中選擇\(b\)大於等於100;

return true;

異常條件(the anomalous condition)

若\(|e(f_q)| = q\), 則稱定義在\(f_q\)上的橢圓曲線\(e(f_q)\)是\(f_q-anomalous\), 該種情況下橢圓曲線的離散對數問題很容易被解出.

可驗證隨機橢圓曲線

給定隨機種子\(seed\), \(t=bitslen(hashval)\), \(|f_q|=q\), 求橢圓曲線的係數\((a,b)\);

\(c = c_0\cdot 2^ + c_1\cdot 2^+\dots + c_s\);

將整數\(c\)轉為域元素\(r\);

從\(f_q\)中隨機選擇乙個元素\(a\);

\(q \mod 2 = 0\):

\(q \mod 2 = 1\):

return (a,b);

橢圓曲線的驗證

\(a \notin [0,q-1], b \notin [0,q-1]\):

\(4\cdot a^3 + 27\cdot b^2 = 0\):

\(q\)是偶數, 若:

\(bitslen(a) \ne m, bitslen(b) \ne m\):

若\(seed\)提供, 驗證更具上一節的橢圓曲線生成演算法生成\((a', b')\):

return true;

可驗證隨機基點

給定隨機種子\(seed\), 整數計數器\(base\), \(hashlen = bitslen(hashval)\), 域大小\(q\), 余因子\(h\), 求基點\(x_g, y_g\);

\(t = e \mod (2\cdot q)\);

\(x = t\mod q, z = \lfloor t/q \rfloor\);

\(x\)轉為域元素\(x_g\);

由\((x_g, z)\)計算出\(y_g\);

輸出\((x_g, y_g)\);

基點的驗證

給定域引數, 驗證基點\(g\)是否合法;

\(q\)奇數, 若:

\(y_^2 \ne x_^3 + a\cdot x_g + b\):

\(q=2^m\)偶數, 若:

\(y_^2 + x_g\cdot y_g \ne x_^3 + a\cdot x_^2 + b\):

\(n\cdot g \ne \mathcal\):

若提供了隨機種子\(seed\):

return g' = g;

return true;

生成隨機種子\(seed\), 生成基點/曲線係數;

ec域引數的驗證

給定安全級別\(s\);

\(n\)不是素數:

橢圓曲線\(e(f_q, a, b)\)不合法:

\(h' = \lfloor (q^ + 1)^2 / n\);

如果域引數提供了\(h\), 若\(h \ne h'\):

\(h' \gt 2^\):

mov條件不合法:

anomalous條件不合法:

基點\(g\)不合法:

return true;

ec域引數的生成

給定安全級別\(s\), 和可選的一些限制: 最大的余因子值\(h_max\), 準素性驗證中的素除數界\(i_max\), mov條件的閾值\(b\);

\((d, q), d\in [1,n-1], q = d\cdot g\);

給定公鑰\(q\)和已經驗證正確的域引數, 驗證\(q\)的合法性:

\(q \mod 2 = 1\):

\(y_q^2 \ne x_q^3 + a\cdot x_q + b\):

\(q \mod 2 = 0, q = 2^m\):

\(y_q^2 + x_q \cdot y_q \ne x_q^3 + a\cdot x_q^2 + b\):

\(n\cdot q \ne \mathcal\):

\(n\cdot q = \mathcal\):

給定已經驗證正確的域引數, 金鑰對\((d, q)\)生成如下:

miller-rabin測試;

由於早期部落格符號不統一, 這裡重新描述下:

return 合數, if \(cnt = v-1\);

return 可能是素數;

準素性測試:

return (準素數, h, n), if \(n\)滿足概率素性測試;

return 非準素數;

橢圓曲線數字簽名演算法(ECDSA)

橢圓曲線數字簽名演算法 ecdsa 是使用 橢圓曲線密碼 ecc 對數字簽名演算法 dsa 的模擬。ecdsa於1999年成為ansi標準,並於2000年成為ieee和nist標準。它在1998年既已為iso所接受,並且包含它的其他一些標準亦在iso的考慮之中。與普通的離散對數問題 discrete...

橢圓曲線數字簽名演算法 ECDSA

具體包括確定模數p 係數a和b 生成器點a 構造素數階迴圈群q.隨機選取整數d,且有0 kpr db dakpb p,a,b,q,a,b 1.選擇臨時金鑰ke,其中0 ke a3.利用點r的x座標初始化變數r,即r xr 4.簽名formula s h m dr ke 1 mod q 其中m表示為訊...

區塊鏈中的DCDSA 橢圓曲線數字簽名

既然我們已經可以產生橢圓曲線金鑰對,我們接下來就用使用它來進行訊息的簽名和驗證。我所指的訊息是任何形式,無論是文字還是二進位制形式,只要它們有被驗證合法性的需要。特別的是,bitcoin客戶端通過簽名來證明交易的有效性,反之,礦工則是通過驗證這樣的簽名,來批准並廣播合法的交易。橢圓曲線簽名演算法就是...