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客戶端通過簽名來證明交易的有效性,反之,礦工則是通過驗證這樣的簽名,來批准並廣播合法的交易。橢圓曲線簽名演算法就是...