一、橢圓曲線密碼算法? ? ? ??
????????橢圓曲線密碼編碼學(xué)(ECC)是一種理論性很強的學(xué)科。后來隨著計算科學(xué)和密碼學(xué)的發(fā)展,被應(yīng)用到了公鑰密碼體制這個領(lǐng)域中。橢圓曲線密碼體制最早是由Kobiliz和Millr于185年提出的,是迄今為止安全性最高的一種算法,它的安全性是基于有限域橢圓曲線離散對數(shù)(Eliptic Curve Discrete Logarithm Problem,ECDLP)的難解性,是目前公認的3種安全有效的公鑰密碼體制之一另外2種分別是基于大整數(shù)分解問題(nteger Factorization Problem,IFP)的公鑰密碼體制和基于有限域離散對數(shù)問題(Discrete Logarithm Problem,DLP)的公鑰密碼體制。ECDLP比DLP更難處理.這使得橢圓曲線密碼體制采用較短的密鑰就可以達到與有限域上使用較長的密鑰所達的安全性。橢圓曲線的安全性除了依賴于ECC上離散對數(shù)的分解難度,還依賴于曲線的選擇。因此建立橢圓曲線密碼體制的首要問題就是產(chǎn)生可以抵御所有已有算法攻擊的橢圓曲線。
? ? ? ? SM2是國家密碼管理局組織制定并提出的橢圓曲線密碼算法標準。關(guān)于其具體算法內(nèi)容及國標內(nèi)容可以參考:在線預(yù)覽|GB/T 32918.1-2016
二、密鑰對生成大致流程
輸入:一個有效的Fq(包含q個元素的有限域,q=p且p為大于3的素數(shù)或q=2^m)上橢圓系統(tǒng)參數(shù)的集合。
基于橢圓曲線的密碼系統(tǒng)有7個主要域參數(shù)T=(q,a,b,FR,G,n,h):
????????q代表有限域GF(q),其中q為p或2m(p為素數(shù)),相應(yīng)的有限域分別為素域和二進制域;
????????a,b是橢圓曲線方程的系數(shù);
????????FR為曲線的方程,如素域GF(q)上的曲線方程為y^2=x^3+ax+b,二進制域GF(2^m)上的曲線方程為y^2+xy=x^3+a^2x+b;G為基點;
????????G為基點;
????????n為大素數(shù)并且等于基點G的階6,橢圓曲線系統(tǒng)中最主要的參數(shù)是n,因此橢圓曲線的密鑰長度就定義為n的長度;
????????h是n的余因子,其為一個小整數(shù)且h=#E(Fq)/n;
輸出:與橢圓系統(tǒng)參數(shù)相關(guān)的密鑰對(d,P),d為私鑰,P為公鑰
1)初始化橢圓系統(tǒng)
2)產(chǎn)生隨機整數(shù)d∈[1,n-2]
3)以G為基點,計算P(Xp,Yp)=[d]G(橢圓曲線上點G的d倍點),可用多種方法如:加減法、滑動窗法等計算
4)輸出(d,P),d為私鑰,P為公鑰
注:以上所有計算都可以借助庫函數(shù)實現(xiàn)
三、代碼實現(xiàn)
我采用的是C實現(xiàn),使用的是miracl庫
輸入的參數(shù)可參考:文章來源:http://www.zghlxwxcb.cn/news/detail-403007.html
struct FPECC
{
char* p;
char* a;
char* b;
char* n; //G的階
char* x; //g=(x,y)
char* y;
};
struct FPECC Ecc256 =
{
"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",
"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",
"28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",
"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",
"32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",
"BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0",
};
若想使用其他參數(shù)可參考?http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=3EE2FD47B962578070541ED468497C5B中的附錄C文章來源地址http://www.zghlxwxcb.cn/news/detail-403007.html
/**
* @brief 生成SM2公私鑰對
* @param wx: 公鑰的X坐標,不足32字節(jié)在前面加0x00
* @param wxlen: wx的字節(jié)數(shù),32
* @param wy: 公鑰的Y坐標,不足32字節(jié)在前面加0x00
* @param wylen: wy的字節(jié)數(shù),32
* @param privkey: 私鑰,不足32字節(jié)在前面加0x00
* @param privkeylen: privkey的字節(jié)數(shù),32
* @retval void
*/
void sm2_keygen(unsigned char* wx, int* wxlen, unsigned char* wy, int* wylen, unsigned char* privkey, int* privkeylen)
{
struct FPECC *cfig = &Ecc256;
epoint* g, * pB;
big a, b, p, n, x, y, key1;
miracl* mip = mirsys(20, 0); //初始化大數(shù)系統(tǒng)
mip->IOBASE = 16; //輸入為16進制數(shù)改為大數(shù)
p = mirvar(0); //將大數(shù)字符串轉(zhuǎn)換成大數(shù),這里是16進制的字符串轉(zhuǎn)換大數(shù)
a = mirvar(0);
b = mirvar(0);
n = mirvar(0);
x = mirvar(0);
y = mirvar(0);
key1 = mirvar(0);
cinstr(p, cfig->p); //將大數(shù)字符串轉(zhuǎn)換成大數(shù),這里是16進制的字符串轉(zhuǎn)換大數(shù)
cinstr(a, cfig->a);
cinstr(b, cfig->b);
cinstr(n, cfig->n);
cinstr(x, cfig->x);
cinstr(y, cfig->y);
ecurve_init(a, b, p, MR_PROJECTIVE); //初始化橢圓曲線
g = epoint_init();
pB = epoint_init();
epoint_set(x, y, 0, g); //g=(x,y)為基點G
//產(chǎn)生私鑰
irand(time(NULL) + SEED_CONST); //初始化種子
bigrand(n, key1); //生成隨機數(shù)key1,即為私鑰
//產(chǎn)生公鑰
ecurve_mult(key1, g, pB); //pB=[key1]G
epoint_get(pB, x, y); //取pB上的點(x,y)x和y即為公鑰
*wxlen = big_to_bytes(0, x, (char*)wx, FALSE); //公鑰寫入wx、wy,長度wxlen
*wylen = big_to_bytes(0, y, (char*)wy, FALSE);
*privkeylen = big_to_bytes(0, key1, (char*)privkey, FALSE);
//清內(nèi)存
mirkill(key1);
mirkill(p);
mirkill(a);
mirkill(b);
mirkill(n);
mirkill(x);
mirkill(y);
epoint_free(g);
epoint_free(pB);
mirexit();
}
到了這里,關(guān)于國密算法SM2 密鑰對的生成的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!