ECC橢圓曲線加密

2022-08-11 22:51:21 字數 3155 閱讀 5291

rust實現

注: 本博文是sec1 v2中描述的橢圓加密標準(參考資料[1]);

目錄加密元件

金鑰生成

diffie-hellman原根

mqv原根

簽名方案

加密和金鑰傳輸方案

金鑰協商方案

參考資料

記有一串二進位制位表示的資料\(b=b_0 b_1\dots b_\), 那麼按如下規則轉為八位組\(\\):

八位組\(\\)轉為\(\\): 將八位組的二進位制位從左往右一次填充到\(b_j\), 轉換後的二進位製組的位長度位\(8*m\);

記有一自然數\(x\), 滿足\(2^ \le x \lt 2^\), 那麼轉換規則如下:

簡而言之是大端序;

記\(p\)是\(e(f_q)\)上的一點, \(m\)表示八位組(其位元組長度記為\(m\)), 那麼轉換規則如下:

若\(f_q=f_\), 那麼:

若\(y_p=0\), 則\(y=0x02\). 若\(y_p=1\), 則\(y=0x03\);

將\(x\)和\(y\)拼接為\(m=y||x\), \(m=\lceil (\log_2^q)/8 \rceil + 1\);

若\(p=(x,y)\ne\mathcal\)不採用點壓縮的方式表示, 那麼:

記\(p\)是\(e(f_q)\)上的一點, \(m\)表示八位組(其位元組長度記為\(m\)), 那麼轉換規則如下:

若\(f_q=f_\), 那麼:

\(p=(x,y)\);

若\(m=2\lceil (log_2^q)/8 \rceil + 1\), 那麼:

群\(f_p\)上的橢圓曲線域引數

群\(f_p\)上的橢圓曲線域引數為\(t=(p,a,b,g,n,h)\). 記有以二進位制位數表示的近似加密安全級別\(t, t\in \\), \(a\)和可選的八位組表示的隨機數\(s\)作為輸入, 則域引數計算如下:

若提供了隨機數\(s\), 則按照下一節的規則生成曲線等式係數和基點;

曲線等式係數和基點生成

\(e=e_0 2^ + e_1 2^+\dots + e_s \mod 2^\);

若\(q \mod 2 = 0\):

若\(q \mod 2 = 1\):

置\(a=0x421736520706f696e74\)("base point"的ascii), \(b=0x01\);

從\(c=1\)開始迭代迴圈, 每次迭代\(c=c+1\):

如果得到的是不合法的\(y\), 那麼繼續迭代;

注: 該標準中採用sha演算法作為hash函式來雜湊資料;

群\(f_\)上的橢圓曲線域引數

群\(f_\)上的橢圓曲線域引數為\(t=(m,f(x),a,b,g,n,h)\), 記有輸入\(t, t\in\)和可選的隨機數\(s\), 及係數\(a\), 那麼域引數計算規則如下:

若提供了隨機數\(s\), 則按照上一節的規則生成曲線等式係數和基點;

表1: \(f_\)約化多項式表:

群約化多項式

\(f_}\)

\(f(x)=x^+x^+x^6+x^3+1\)

\(f_}\)

\(f(x) = x^+x^+1\)

\(f_}\)

\(f(x)=x^+x^+1\)

or \(x^+x^+1\)

\(f_}\)

\(f(x)=x^+x^+x^+x^+1\)

\(f_}\)

\(f(x)=x^+x^+1\)

\(f_}\)

\(f(x)=x^+x^+x^+x^+1\)

群\(f_p\)上的橢圓曲線域引數驗證

記有域引數\(t=(p,a,b,g,n,h)\), 則該域引數需要滿足以下條件:

群\(f_\)上的橢圓曲線域引數驗證

記有域引數\(t=(m,f(x),a,b,g,n,h)\), 則該域引數需要滿足如下條件:

記有域引數\(t=(p,a,b,g,n,h)\)或\(t=(p,a,b,g,n,h)\);

公鑰驗證

記有域引數\(t=(p,a,b,g,n,h)\)或\(t=(p,a,b,g,n,h)\), 及公鑰\(q=(x,y)\);

\(q\ne \mathcal\);

若t是\(f_p\)上的域引數, 則\(x,y\)需滿足\(x,y\in [0,p-1]\), 且\(y^2=x^3+ax^2+b \mod p\);

若t是\(f_\)上的域引數, 則\(x,y\)需滿足\(x,y\in [0,2^m-1]\), 且\(y^2+xy=x^3+ax^2+b \mod 2^m\);

\(nq=\mathcal\);

完全驗證: 需要驗證條件1/2/3/4;

部分驗證: 只需驗證條件1/2/3;

記有域引數\(t\), 實體\(u\)擁有私鑰\(d_u\), 實體\(v\)擁有公鑰\(q_v=(x,y)\), \(u\)和\(v\)的金鑰是由同一域引數得到的;

橢圓曲線diffie-hellman原根

橢圓曲線余因子diffie-hellman原根

記有域引數\(t\)(所屬群的階記為\(q\)), 實體\(u\)擁有金鑰對\((d_, q_=(x_, y_))\)和\((d_, q_=(x_, y_))\), 實體\(v\)擁有公鑰\(q_=(x_, y_)\)和\(q_=(x_, y_)\), \(u\)和\(v\)的金鑰是由同一域引數得到的;

記有明文資料\(m\), 雜湊函式\(hash\), 及期望的安全級別\(t\), :

\(v\)收到明文\(m\)及簽名\((r,s)\), 對簽名進行認證:

記有明文資料\(m\), 金鑰派生函式

\(kdf\), 訊息認證碼函式

\(mac\), 對稱加密函式

\(enc\), 域引數\(t\), 記有實體\(u\)和\(v\), \(u\)和\(v\)之間的共享資料\(sharedinfo1\)和\(sharedinfo2\)(可選);

加密:解密:

記有域引數\(t\), 實體\(u\)和\(v\);

金鑰協商:

將橢圓曲線diffie-hellman方案過程基本一致, 只需將其中的\(diffie-hellman\)原根替換\(mqv原根\);

[1]. standars for efficient cryptography 1 (sec1: elliptic curve cryptography), daniel r.l.brown;

橢圓曲線ECC加密演算法入門介紹

前言 同rsa ron rivest,adi shamir,len adleman三位天才的名字 一樣,ecc elliptic curves cryptography,橢圓曲線密碼編碼學 也屬於公開金鑰演算法。目前,國內詳細介紹ecc的公開文獻並不多 反正我沒有找到 有一些簡介,也是泛泛而談,看完...

橢圓曲線密碼體制 ECC 簡介

簡單的說橢圓曲線並不是橢圓,之所以稱為橢圓曲線是因為他們是用三次方程來表示,並且該方程與計算橢圓周長的方程相似。對密碼學比較有意義的是基於素數域gf p 和基於二進位制域 gf 2 m 上的橢圓曲線。下面重點介紹基於gf p 上的橢圓曲線 y 2 x 3 a x b modp 其中p是素數,a和b滿...

橢圓曲線密碼體制 ECC 簡介

簡單的說橢圓曲線並不是橢圓,之所以稱為橢圓曲線是因為他們是用三次方程來表示,並且該方程與計算橢圓周長的方程相似。對密碼學比較有意義的是基於素數域gf p 和基於二進位制域 gf 2 m 上的橢圓曲線。下面重點介紹基於gf p 上的橢圓曲線 y 2 x 3 a x b modp 其中p是素數,a和b滿...