国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

PBOC3.0中使用的國(guó)密SM2算法

2019-11-09 15:02:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
一、知識(shí)準(zhǔn)備PBOC3.0規(guī)范就是《中國(guó)金融集成電路(IC)卡規(guī)范》3.0版本。

 

SM2是國(guó)密局推出的一種他們自己說(shuō)具有自主知識(shí)產(chǎn)權(quán)的非對(duì)稱商用密碼算法。本身是基于ECC橢圓曲線算法的,所以要講SM2, 先要弄懂ECC。

 

完全理解ECC算法需要一定的數(shù)學(xué)功底,因?yàn)樯婕暗缴溆捌矫孀鴺?biāo)系,齊次方程求解, 曲線的運(yùn)算規(guī)則等概念。

 

本篇的主旨還是希望能以簡(jiǎn)單通俗的語(yǔ)言,講清楚PBOC3.0認(rèn)證過(guò)程中,所用到的SM2的相關(guān)概念,包括它的實(shí)現(xiàn),使用等。

 

1、橢圓曲線到底是什么樣的

 

圖1

圖2

上面是兩個(gè)不同橢圓曲線在坐標(biāo)系中的幾何表示, 不過(guò)這個(gè)坐標(biāo)系不是二維坐標(biāo)系,而是射影坐標(biāo)系??梢杂每臻g思維想像一下(但是注意不是三維坐標(biāo)系),打個(gè)比方,你晚上站在一個(gè)路燈前面,地上有你的影子,你本身是在一個(gè)二維坐標(biāo)系(把你想像成一個(gè)紙片),和你的影子一起構(gòu)成一個(gè)射影坐標(biāo)系。

 

曲線的每一個(gè)點(diǎn), 用三個(gè)參量表示, (X,Y,Z)。我們知道在二維坐標(biāo)系里的每個(gè)圖形都遵循一個(gè)方程,比如直接的二元一次方程是y=kx+b, 圓的方程是(x-a)2+(y-b)2=r2, 橢圓曲線在射影坐標(biāo)系里也有自己的定義:

 

Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4XZ2+a6Z3

 

所有橢圓曲線上的點(diǎn)都滿足上述方程,a1,a2,a3,a4,a6是系數(shù),決定曲線的形狀和位置。

 

二維坐標(biāo)和射影坐標(biāo)有一個(gè)對(duì)應(yīng)關(guān)系,即x=X/Z, y=Y/Z, 這樣就可以把上面的方程轉(zhuǎn)成普通的二維坐標(biāo)系方程:

y2+a1xy+a3y= x3+a2x2+a4x+a6

 

2、離散的橢圓曲線

上面的坐標(biāo)系都是基于實(shí)數(shù)的,橢圓曲線看起來(lái)都是平滑的,如果我們限制曲線的點(diǎn)都必須是整數(shù),曲線就變成離散的了,如圖3所示:

圖3

 

再進(jìn)一步限制,要求整數(shù)必須大于0, 小于某個(gè)大整數(shù)P, 這樣就形成了一個(gè)有限域Fp.然后我們?cè)谶@個(gè)有限域里定義一些點(diǎn)與點(diǎn)之間的加減乘除運(yùn)算規(guī)則,比如A點(diǎn)加B點(diǎn)得到C點(diǎn)(記做A+B≡C (mod p)),或者A點(diǎn)乘以n得到K點(diǎn)(記做A×n≡K (mod p))。至于具體規(guī)則細(xì)節(jié)可以不用關(guān)心,只要知道有這樣的操作即可。

 

選一條曲線,比如

y2=x3+ax+b

把它定義在Fp上, 要求a,b滿足:

4a3+27b2≠0 (mod p)

 

我們把這樣的曲線記為Ep(a,b)

 

加解密是基于這樣的數(shù)學(xué)難題,K=kG,其中 K,G為Ep(a,b)上的點(diǎn),k是整數(shù),小于G點(diǎn)(注意區(qū)分,不是我們平常說(shuō)的那個(gè)意思)的階(不用關(guān)心什么是點(diǎn)的階)。給定k和G,計(jì)算K很容易;但給定K和G,求k就困難了。這樣,G就叫做基點(diǎn),k是私鑰,K是公鑰。

 

最后總結(jié)。描述一條Fp上的橢圓曲線,有六個(gè)參量: T=(p,a,b,G,n,h)。 

p 、a 、b 用來(lái)確定一條橢圓曲線, G為基點(diǎn), n為點(diǎn)G的階, h 是橢圓曲線上所有點(diǎn)的個(gè)數(shù)m與n相除的整數(shù)部分)

 

知識(shí)準(zhǔn)備階段知道這么多就可以了。

 

二、SM2在PBOC認(rèn)證中的使用

 

1、簽名和驗(yàn)簽的原理

 

前面提到根據(jù)系數(shù)的不同,ECC曲線可以有很多,SM2使用其中一種,這就表明它的曲線方程,以及前面說(shuō)到的六個(gè)參量都是固定的。根據(jù)國(guó)密局給出的規(guī)范定義如下:

[cpp] view plain copyy2=x3+ax+b     p=FFFFFFFE FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF  a=FFFFFFFE FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC  b=28E9FA9E 9D9F5E344D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93  n=FFFFFFFE FFFFFFFFFFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123  Gx=32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7  Gy=BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0  

這里容易引起一個(gè)誤解,會(huì)認(rèn)為參數(shù)都固定了,公私鑰是不是只能有一對(duì)?當(dāng)然不是,注意前面提到的K=kG的模型,K才是公鑰,所以公鑰其實(shí)是曲線在離散坐標(biāo)系中,滿足條件的一個(gè)曲線上的點(diǎn)??梢杂泻芏鄠€(gè)。另外, 從這幾個(gè)參量可以獲知PBOC 3.0的公鑰長(zhǎng)度都是256位。

 

基于這種離散橢圓曲線原理的SM2算法一般有三種用法,簽名驗(yàn)簽,加解密, 密鑰交換。PBOC 3.0中的脫機(jī)數(shù)據(jù)認(rèn)證只用到簽名驗(yàn)簽的功能。終端關(guān)心的是如何驗(yàn)簽,卡片則要考慮如何實(shí)現(xiàn)生成簽名。

 

2、基于openssl實(shí)現(xiàn)sm2

這里給出一個(gè)基于openssl的sm2實(shí)現(xiàn), 如果不了解openssl,可以先搜索一下相關(guān)知識(shí),這里不講解。openssl已經(jīng)實(shí)現(xiàn)ECC算法接口,也就是核心已經(jīng)有了,實(shí)現(xiàn)sm2其實(shí)并不難,關(guān)鍵是理解它里面各種接口如何使用。下面就分析一個(gè)終端驗(yàn)簽的sm2實(shí)現(xiàn)。另外需要說(shuō)明這里給出的只是代碼片段,僅供理解用。

 

函數(shù)接口

[cpp] view plain copyint SM2_Verify(BYTE* Px,BYTE* Py, BYTE* DataIn,DWord DataLen, BYTE* sigrs)  

前兩個(gè)參數(shù)是K的坐標(biāo)值,也就是公鑰。Datain和datalen分別是明文數(shù)據(jù)和其長(zhǎng)度,最后一個(gè)參數(shù)是待驗(yàn)證的簽名。

 

曲線的參數(shù)常量定義如下:

[cpp] view plain copy////////////////////////////////////////////////////////////////  static const char *group_p ="FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF";  static const char *group_a ="FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC";  static const char *group_b ="28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93";  static const char *group_Gx ="32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7";  static const char *group_Gy ="BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0";  static const char *group_n = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123";  static const char *ENTL_ID ="008031323334353637383132333435363738";  #define SM2_KEY_LENGTH 32 //256位曲線  ////////////////////////////////////////////////////////////////  

ENTL_ID是pboc規(guī)范中指定的用于SM3產(chǎn)生摘要的報(bào)文頭數(shù)據(jù)。

[cpp] view plain copystrcpy(szBuff, ENTL_ID);  strcat(szBuff,group_a);  strcat(szBuff,group_b);  strcat(szBuff,group_Gx);  strcat(szBuff,group_Gy);  AscToBcd(szDataForDigest,(unsigned char *)szBuff, nLen);           ….     SM3(szDataForDigest,nLen+SM2_KEY_LENGTH*2, digestZA);     memcpy(szDataForDigest,digestZA, ECC_LENGTH);  memcpy(szDataForDigest+ECC_LENGTH,DataIn, DataLen);     SM3(szDataForDigest,DataLen+ECC_LENGTH, digestH);  第一步,對(duì)上述數(shù)據(jù)用sm3做摘要,摘要的結(jié)果與數(shù)據(jù)拼接后再做摘要。

[cpp] view plain copyp = BN_new();  a = BN_new();  b = BN_new();  group = EC_GROUP_new(EC_GFp_mont_method());     BN_hex2bn(&p, group_p))  BN_hex2bn(&a, group_a))  BN_hex2bn(&b, group_b))  這里是把定義的曲線常量轉(zhuǎn)換成大數(shù)表式,這樣才能使用openssl中的接口。

Group是ECC中的曲線組,它是ECC算法的核心,為什么這么說(shuō)呢? 因?yàn)檫@個(gè)group里的所有字段就確定了曲線的所有信息, 后面會(huì)看到,這里只是用EC_GROUP_new生成一個(gè)空的group, 然后由p,a,b等參數(shù)來(lái)填充group, 再以這個(gè)group為基礎(chǔ)去生成曲線上的點(diǎn)。

[cpp] view plain copyif (!EC_GROUP_set_curve_GFp(group, p, a, b,ctx))  {                     gotoerr_PRocess;  }     P = EC_POINT_new(group);  Q = EC_POINT_new(group);  R = EC_POINT_new(group);  if (!P || !Q || !R)  {           gotoerr_process;  }  這一段就確定了group的所有信息,并且根據(jù)group生成三個(gè)曲線上的點(diǎn)(點(diǎn)一定在曲線上,這個(gè)很重要)。

[cpp] view plain copy<span style="white-space:pre">    </span>x = BN_new();           y= BN_new();           z= BN_new();           if(!x || !y || !z)           {                     gotoerr_process;           }              //Gx           if(!BN_hex2bn(&x, group_Gx))           {                     gotoerr_process;           }              if(!EC_POINT_set_compressed_coordinates_GFp(group, P, x, 0, ctx))           {                     gotoerr_process;           }                     if(!BN_hex2bn(&z, group_n))           {                     gotoerr_process;           }           if(!EC_GROUP_set_generator(group, P, z, BN_value_one()))           {                     gotoerr_process;           }              if(!EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx))           {                     gotoerr_process;           }  

這一段首先是設(shè)置n到group, n前面講過(guò),是曲線的階。另外就是由G點(diǎn)坐標(biāo)x,y確定點(diǎn)P,這里我其實(shí)也有點(diǎn)不太明白,G點(diǎn)坐標(biāo)y本來(lái)就是已知的,為什么要再通過(guò)曲線變換表式生成y,是不是想要對(duì)比前面的group信息是否正確?只是為了校驗(yàn)?

[cpp] view plain copyif ((eckey = EC_KEY_new()) == NULL)           {                     gotoerr_process;           }           if(EC_KEY_set_group(eckey, group) == 0)           {                     gotoerr_process;           }     EC_KEY_set_public_key(eckey, P);           if(!EC_KEY_check_key(eckey))           {                     gotoerr_process;           }                 if(SM2_do_verify(1, digestH, SM2_KEY_LENGTH, signature, sig_len, eckey) != 1)           {                     gotoerr_process;           }  

這段比較好理解,生成公鑰eckey,并由eckey最終驗(yàn)簽。驗(yàn)簽的執(zhí)行函數(shù)sm2_do_verify有點(diǎn)復(fù)雜,這里不做過(guò)多的解釋(其實(shí)是我解釋不清楚, 哇哈哈),在一個(gè)國(guó)外的網(wǎng)站上找到一個(gè)比較好的描述,拿過(guò)來(lái)用用。

 

3、脫機(jī)數(shù)據(jù)認(rèn)證使用sm2的具體流程

我假設(shè)看這篇文章的人對(duì)PBOC 2.0中基于RSA國(guó)際算法的脫機(jī)數(shù)據(jù)認(rèn)證流程已經(jīng)比較了解,相關(guān)概念不再過(guò)多描述,重點(diǎn)關(guān)注二者的差異性。

 

另外,簡(jiǎn)單說(shuō)一下sm3,因?yàn)橄旅鏁?huì)用到。sm3是一個(gè)類似hash的雜湊算法,即給定一個(gè)輸入(一般很長(zhǎng)),產(chǎn)生一個(gè)固定長(zhǎng)度的輸出(sm3是32個(gè)字節(jié),hash是20個(gè)字節(jié))。它有兩個(gè)特點(diǎn):

1 不可逆性,即無(wú)法由輸出推導(dǎo)出輸入。

2 不同的輸入,產(chǎn)生不同的輸出。

 

下面就拿終端SDA認(rèn)證卡片來(lái)看看sm2如何在pboc中使用的。

 

首先,發(fā)卡行公鑰等數(shù)據(jù)(還包括公鑰,算法標(biāo)識(shí),有效期等信息)被CA私鑰簽名(注意不是加密)生成發(fā)卡行公鑰證書,這個(gè)證書會(huì)個(gè)人化到ic卡中。這些數(shù)據(jù)如下圖所示:

圖4

 

簽名其實(shí)就是對(duì)這個(gè)表里的數(shù)據(jù)做一系列運(yùn)算,最終生成一個(gè)64字節(jié)的數(shù)據(jù),分別由各32字節(jié)的r和s拼接而成(r和s只是個(gè)符號(hào)而已,沒(méi)有特別意思)。這64字節(jié)的簽名拼接到圖4后面就是發(fā)卡行公鑰證書。

 

這里與國(guó)際算法的公鑰證書就有明顯的區(qū)別了。國(guó)際算法證書是密文的,發(fā)卡行公鑰用rsa加密。而國(guó)密的公鑰證書完全是明文。用數(shù)據(jù)舉例,下面這些數(shù)據(jù)來(lái)自pboc3.0的卡片送檢指南,就是檢測(cè)時(shí)要求個(gè)人化到卡里的數(shù)據(jù)。

[plain] view plain copy【發(fā)卡行公鑰】 :  173A31DD681C6F8FE3BA6C354AD3924A4ADFD15EB0581BC1B37A1EB1C88DA29B47155F62FCF4CCCD201B134351A049D77E81F6A6C66E9CB32664F41348DA11F     【CA哈希值】(r||s) :  3499A2A0A7FED8F74F119B416FF728BA98EF0A32A36BCCB8D0110623D466425CA44C68F8E49121D9BFA9484CAEF9B476C5EB576D1A8DD6BC4A0986AF4134ABAF     【Tag_90 】(發(fā)卡行公鑰證書) :  1262280001122000000204001140173A31DD681C6F8FE3BA6C354AD3924A4ADFD15EB0581BC1B37A1EB1C88DA29B47155F62FCF4CCCD201B134351A049D77E86A6C66E9CB32664F41348DA11F63499A2A0A7FED8F74F119B416FF728BA98EF0A32A36BCCB8D0110623D466425CA44C68F8E49121D9BFA9484CAEF9B476C5E56D1A8DD6BC4A0986AF4134ABAF  

可以自己的解析一下,看看是否和上面表格中的數(shù)據(jù)一致, 并且都是明文。

 

終端在讀記錄階段獲取發(fā)卡行公鑰證書,國(guó)際算法需要用rsa公鑰解密整個(gè)證書,然后驗(yàn)證hash,通過(guò)后取出發(fā)卡行公鑰。而國(guó)密算法,終端只要用sm2公鑰驗(yàn)64字節(jié)的簽名,通過(guò)后直接取明文發(fā)卡行公鑰,所以國(guó)密的驗(yàn)簽的動(dòng)作其實(shí)就相當(dāng)于國(guó)際里的rsa解密和hash對(duì)比兩個(gè)動(dòng)作。

 

接著終端進(jìn)行靜態(tài)數(shù)據(jù)簽名的驗(yàn)證,情況類似,對(duì)于國(guó)密,這些數(shù)據(jù)都是明文形式,后面拼接64字節(jié)的sm2簽名,這64字節(jié)是用發(fā)卡行私鑰對(duì)明文數(shù)據(jù)簽名得到的。終端要做的就是拿剛剛獲取的發(fā)卡行公鑰對(duì)這64字節(jié)數(shù)據(jù)驗(yàn)證即可,驗(yàn)證通過(guò)就表示SDA通過(guò)。

 

四、PBOC為什么要選擇國(guó)密

 

首先從技術(shù)角度,實(shí)現(xiàn)同樣的計(jì)算復(fù)雜度,ECC的計(jì)算量相對(duì)RSA較小,所以效率高。RSA現(xiàn)在在不斷的增加模長(zhǎng),目前都用到了2048位。并不是說(shuō)現(xiàn)在一定要用2048位才是安全的,只是它的安全性更高,破解難度更大,這個(gè)要綜合考慮,位數(shù)高也意味著成本高。有些不差錢的大公司比如谷歌就已經(jīng)未雨綢繆的把2048位用在了它們的Gmail郵箱服務(wù)中。PBOC3.0 認(rèn)證中目前只用到1984位,其實(shí)也是相對(duì)安全的。

 

不過(guò)這個(gè)觀點(diǎn)目前還存在爭(zhēng)議。前段時(shí)間在清華大學(xué)聽了一個(gè)關(guān)于密碼算法的課,清華有個(gè)教授認(rèn)為sm2并不見得比rsa更高級(jí),只是sm2的原理比rsa難理解,所以大部分人認(rèn)為它會(huì)相對(duì)安全些。一旦橢圓曲線被大家研究透了,sm2的光環(huán)也可能就此褪去。當(dāng)然這個(gè)也是他個(gè)人的觀點(diǎn)。

 

另外一個(gè)因素,要從國(guó)家戰(zhàn)略的角度考慮,RSA之前一直被傳與美國(guó)安全局合作,在算法中加入后門,這種事是寧可信其有的。國(guó)密算法咱起碼是自己研發(fā)的東西,所有的過(guò)程細(xì)節(jié)都一清二楚, 不用擔(dān)收后門的事情。

央行現(xiàn)在非常重視國(guó)產(chǎn)安全芯片的推進(jìn)工作,前些天央行的李曉楓還公開強(qiáng)調(diào)未來(lái)金融IC卡芯片要國(guó)產(chǎn)化,國(guó)密算法是其中很關(guān)鍵的一步。未來(lái)國(guó)產(chǎn)芯片加國(guó)密算法,才會(huì)有真正自主, 安全的國(guó)產(chǎn)金融IC卡產(chǎn)品。

轉(zhuǎn)自:http://blog.csdn.net/pony_maggie/article/details/39780825


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 昭平县| 泸溪县| 海口市| 章丘市| 马山县| 洛隆县| 界首市| 札达县| 梓潼县| 嘉荫县| 永清县| 曲沃县| 兴化市| 安义县| 正镶白旗| 利川市| 辉南县| 林芝县| 鹤庆县| 沧源| 民丰县| 溆浦县| 天等县| 绍兴市| 永丰县| 平潭县| 广饶县| 保定市| 白水县| 盱眙县| 彩票| 从江县| 富顺县| 福建省| 卢龙县| 林州市| 沾益县| 湖南省| 浏阳市| 阳曲县| 昆明市|