SM2算法第三篇:實(shí)現(xiàn)SM2秘鑰交換協(xié)議的算法流程
參考文獻(xiàn):SM2橢圓曲線(xiàn)公鑰密碼算法-第三部分(秘鑰協(xié)商協(xié)議)
一、概述
本部分規(guī)定了SM2橢圓曲線(xiàn)公鑰密碼算法的密鑰交換協(xié)議,并給出了密鑰交換與驗(yàn)證示例及相應(yīng)的流程。本部分適用于商用密碼 應(yīng)用中的密鑰交換,可滿(mǎn)足通信雙方經(jīng)過(guò)兩次或可選三次信息傳遞過(guò)程,計(jì)算獲取一個(gè)由雙方共同決定的共享秘密密鑰(會(huì)話(huà)密鑰)。同時(shí),本部分還可為安全產(chǎn)品生產(chǎn)商提供產(chǎn)品和技術(shù)的標(biāo)準(zhǔn)定位以及標(biāo)準(zhǔn)化的參考,提高安全產(chǎn)品的可信性和互操作性。
二、術(shù)語(yǔ)和定義
1、密鑰 key
確定密碼參數(shù)運(yùn)算的一個(gè)參數(shù),它用于:
(a)加密和解密變換;
(b)同步產(chǎn)生共享秘鑰;
(c)數(shù)字簽名的生成和驗(yàn)證。
2、密鑰交換 key exchange
在通信實(shí)體之間安全地建立一個(gè)共享秘鑰的協(xié)商過(guò)程。
3、密鑰協(xié)商:key agreement
多個(gè)用戶(hù)之間建立一個(gè)共享秘密秘鑰的過(guò)程,并且其中任何一個(gè)用戶(hù)都不能預(yù)先確定該秘鑰的值。
4、從A到B的密鑰確認(rèn) key comfirmation from A to B
使用戶(hù)B確信用戶(hù)A擁有特定秘密秘鑰的保證。
5、密鑰派生函數(shù) key derivation function
通過(guò)作用于共享秘密和雙方都知道的其他參數(shù),產(chǎn)生一個(gè)或多個(gè)共享秘密秘鑰的函數(shù)。
6、雜湊函數(shù) hash function
將一個(gè)比特串映射為一個(gè)固定長(zhǎng)度比特串的函數(shù),該函數(shù)滿(mǎn)足如下性質(zhì):
(a)對(duì)于任意給定的輸出,要找其對(duì)應(yīng)的輸入,在計(jì)算上是不可行的;
(b)對(duì)于任意給定的輸入,要找到輸出相同的另一個(gè)輸入,在計(jì)算上是不可行的。
7、雜湊值 hash value
雜湊函數(shù)作用于一條消息時(shí)輸出的比特串。
8、對(duì)稱(chēng)密碼算法 symmetric cryptographic algrorithm
一種執(zhí)行加密/解密的算法,其中加密/解密使用的秘鑰容易從計(jì)算上相互求得。
9、發(fā)起方 initiator
在一個(gè)協(xié)議的操作過(guò)程中發(fā)送首輪交換信息的用戶(hù)。
10、響應(yīng)方 responder
在一個(gè)協(xié)議的操作過(guò)程中不是發(fā)送首輪交換信息的用戶(hù)。
11、可辨別標(biāo)識(shí) disdinguishing identifier
可以無(wú)歧義辨別某一實(shí)體身份的信息。
三、符號(hào)
A,B:使用公鑰密碼系統(tǒng)的兩個(gè)用戶(hù)。
a,b:Fq中的元素,它們定義Fq上的一條橢圓曲線(xiàn)E。
dA:用戶(hù)A的私鑰。
dB:用戶(hù)B的私鑰。
E(Fq):Fq上橢圓曲線(xiàn)E的所有有理點(diǎn)(包括無(wú)窮遠(yuǎn)點(diǎn)O)組成的集合。
Fq:包含q個(gè)元素的有限域。
G:橢圓曲線(xiàn)的上一個(gè)基點(diǎn),其階為素?cái)?shù)。
Hash():密碼雜湊函數(shù)。
Hv():消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù)。
消息摘要百度百科:
HASH函數(shù)的抗沖突性使得如果一段明文稍有變化,哪怕只更改該段落的一個(gè)字母,通過(guò)哈希算法作用后都將產(chǎn)生不同的值。而HASH算法的單向性使得要找到哈希值相同的兩個(gè)不同的輸入消息,在計(jì)算上是不可能的。所以數(shù)據(jù)的哈希值,即消息摘要,可以檢驗(yàn)數(shù)據(jù)的完整性。
哈希函數(shù)的這種對(duì)不同的輸入能夠生成不同的值的特性使得無(wú)法找到兩個(gè)具有相同哈希值的輸入。因此,如果兩個(gè)文檔經(jīng)哈希轉(zhuǎn)換后成為相同的值,就可以肯定它們是同一文檔。所以,當(dāng)希望有效地比較兩個(gè)數(shù)據(jù)塊時(shí),就可以比較它們的哈希值。例如,可以通過(guò)比較郵件發(fā)送前和發(fā)送后的哈希值來(lái)驗(yàn)證該郵件在傳遞時(shí)是否修改。
h:余因子,h=#E(Fq)/n,其中n是Fq的階。
IDA,IDB:用戶(hù)A和用戶(hù)B的可辨別標(biāo)識(shí)。
K,KA,KB:秘鑰交換協(xié)議商定的共享秘密秘鑰。
KDF():秘鑰派生函數(shù)。
modn:模n運(yùn)算。
n:基點(diǎn)G的階(n是#E(Fq)的素因子)。
O:橢圓曲線(xiàn)上的一個(gè)特殊點(diǎn),稱(chēng)為無(wú)窮遠(yuǎn)點(diǎn)或零點(diǎn),是橢圓曲線(xiàn)加法群的單位元。
------------------------------------------分割線(xiàn)在此,不要看我(2016.04.20更新)---------------------------------------------------
PA:用戶(hù)A的公鑰。
PB:用戶(hù)B的公鑰。
q:有限域Fq中元素的數(shù)目。
rA:秘鑰交換中用戶(hù)A產(chǎn)生的臨時(shí)秘鑰值。
rB:秘鑰交換中用戶(hù)B產(chǎn)生的臨時(shí)秘鑰值。
x||y:x與y的拼接,其中x與y可以是比特串或字符串。
ZA:關(guān)于用戶(hù)A的可辨別標(biāo)識(shí)、部分橢圓曲線(xiàn)系統(tǒng)參數(shù)和用戶(hù)A公鑰的雜湊值。
ZB:關(guān)于用戶(hù)B的可辨別標(biāo)識(shí)、部分橢圓曲線(xiàn)系統(tǒng)參數(shù)和用戶(hù)B公鑰的雜湊值。
#E(Fq):E(Fq)上點(diǎn)的數(shù)目,稱(chēng)為橢圓曲線(xiàn)E(Fq)的階。
|k|P:橢圓曲線(xiàn)上點(diǎn)P的k倍點(diǎn),k是正整數(shù)。
x.y]:大于或等于x且小于或等于y的整數(shù)的集合。
頂函數(shù):大于或等于x的最小整數(shù)。
底函數(shù):小于或等于x的最小整數(shù)。
&:兩個(gè)整數(shù)按比特與運(yùn)算。
四、算法參數(shù)與輔助函數(shù)
1、總則:
密鑰交換協(xié)議是兩個(gè)用戶(hù)A和B通過(guò)交互的信息傳遞,用各自的私鑰和對(duì)方的公鑰來(lái)商定一個(gè)只有他們自己知道的秘密密鑰。這個(gè)共享的秘密密鑰通常用在某個(gè)對(duì)稱(chēng)密碼算法中。該密鑰交換協(xié)議能夠用于密鑰管理和協(xié)商。
2、橢圓曲線(xiàn)系統(tǒng)參數(shù):
(1)有限域Fq的規(guī)模q;
(2)定義橢圓曲線(xiàn)E(Fq)的兩個(gè)參數(shù)啊,a、b∈Fq;
(3)E(Fq)上的基點(diǎn)G=(xG,yG)(G≠O),其中xG、yG是Fq中的兩個(gè)元素;
(4)G的階n及其可選項(xiàng)(如n的余因子h等)。
3、用戶(hù)密鑰對(duì)
用戶(hù)A的密鑰對(duì)應(yīng)包括其私鑰dA和公鑰PA=[dA]G=(xA,yA),用戶(hù)B的密鑰對(duì)應(yīng)包括其私鑰dB和公鑰PB=[dB]G=(xB,yB)。
用戶(hù)密鑰對(duì)的生成算法與公鑰驗(yàn)證算法應(yīng)符合第一部分第六章的規(guī)定。
4、輔助函數(shù)
(1)密碼雜湊函數(shù):如SM3;
(2)密鑰派生函數(shù):從一個(gè)共享的秘密比特串中派生出密鑰數(shù)據(jù)。在密鑰協(xié)商過(guò)程中,密鑰派生函數(shù)作用在密鑰交換所獲共享的秘密比特串上,從中產(chǎn)生所需要的會(huì)話(huà)密鑰或進(jìn)一步加密所需要的秘鑰數(shù)據(jù)。
密鑰派生函數(shù)需要調(diào)用秘鑰雜湊函數(shù)。
(3)隨機(jī)數(shù)發(fā)生器:使用國(guó)密局規(guī)定的隨機(jī)數(shù)發(fā)生器。
5、用戶(hù)其他信息
五、密鑰交換協(xié)議及流程
1、密鑰交換協(xié)議
設(shè)用戶(hù)A和B協(xié)商獲取密鑰數(shù)據(jù)的長(zhǎng)度為klen比特,用戶(hù)A是發(fā)起方,用戶(hù)B是響應(yīng)方。用戶(hù)A和B雙方為了獲取相同的密鑰,應(yīng)實(shí)現(xiàn)如下運(yùn)算步驟:
w=[[log2(n)]/2]-1。(注:此處的[]指的是頂函數(shù))
用戶(hù)A:
A1:用隨機(jī)數(shù)發(fā)生器產(chǎn)生隨機(jī)數(shù)rA∈[1,n-1];
A2:計(jì)算橢圓曲線(xiàn)點(diǎn)RA=[rA]G=(x1,y1);
A3:將RA發(fā)送給用戶(hù)B。
用戶(hù)B:
B1:用隨機(jī)數(shù)發(fā)生器產(chǎn)生隨機(jī)數(shù)rB∈[1,n-1];
B2:計(jì)算橢圓曲線(xiàn)點(diǎn)RB=[rB]G=(x2,y2);
B3:從RB中取出域元素x2,按本文第一部分的4.2.7給出的方法將x2的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為整數(shù),計(jì)算x2`=2^w+(x2&(2^w-1));
B4:計(jì)算tB=(dB+x2`*rB)mod n;
B5:驗(yàn)證RA是否滿(mǎn)足橢圓曲線(xiàn)的方程,若不滿(mǎn)足則協(xié)商失??;否則從從RB中取出域元素x1,按本文第一部分的4.2.7給出的方法將x2的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為整數(shù),
計(jì)算x1`=2^w+(x1&(2^w-1));
B6:計(jì)算橢圓曲線(xiàn)點(diǎn)V=[h*tB](PA+[x1`]RA)=(xv,yv),若V是無(wú)窮遠(yuǎn)點(diǎn),則B協(xié)商失?。环駝t按本文第一部分4.2.5和4.2.4給出的方法將xv,yv的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為比特串;
B7:計(jì)算KB=KDF(xv||yv||ZA||ZB,klen);
B8:(選項(xiàng))按本文第一部分4.2.5和4.2.4給出的方法將RA的坐標(biāo)x1、y1和RB的坐標(biāo)x2、y2的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為比特串,計(jì)算SB==Hash.......;
B9:將RB、(選項(xiàng)SB)發(fā)送給用戶(hù)A;
用戶(hù)A:
A4:從RA中提取出域元素x1,按本文第一本分4.2.7給出的方法將x1的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為整數(shù),計(jì)算x1`=2^w+(x1&(2^w-1));
A5:tA=(dA+x2`*rA)mod n;
A6:驗(yàn)證RB是否滿(mǎn)足橢圓曲線(xiàn)的方程,若不滿(mǎn)足則協(xié)商失敗;否則從從RB中取出域元素x2,按本文第一部分的4.2.7給出的方法將x2的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為整數(shù),
計(jì)算x2`=2^w+(x2&(2^w-1));
A7:計(jì)算橢圓曲線(xiàn)點(diǎn)U=[h*tA](PB+[x2`]RB)=(xu,yu),若U是無(wú)窮遠(yuǎn)點(diǎn),則A協(xié)商失??;否則按本文第一部分4.2.5和4.2.4給出的方法將xu,yu的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為比特串;
A8:計(jì)算KA=KDF(xu||yu||ZA||ZB,klen);
A9:(選項(xiàng))計(jì)算S1,并檢驗(yàn)S1=SB是否成立,若不成立則從B到A的秘鑰確認(rèn)失??;
A10:(選項(xiàng))計(jì)算SA,并將SA發(fā)送給用戶(hù)B。
用戶(hù)B;
B10:計(jì)算S2,并檢驗(yàn)S2=SA是否成立,若不成立則從A到B的秘鑰確認(rèn)失敗。
(二)秘鑰交換協(xié)議流程
、
————————————————
版權(quán)聲明:本文為CSDN博主「qq_30866297」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_30866297/article/details/51194236
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。