本發(fā)明屬于公鑰密碼領(lǐng)域,特別涉及基于國(guó)密sm2算法的無(wú)證書認(rèn)證系統(tǒng)的安全簽名方法。
背景技術(shù):
公鑰密碼技術(shù)在計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)技術(shù)高度發(fā)展的今天,已得到了廣泛應(yīng)用。數(shù)字簽名技術(shù)和公鑰加密技術(shù)已深入到人們的日常生活。為了保證數(shù)字簽名的唯一性和簽名私鑰的安全性,通常由私鑰所有者將簽名私鑰保存在密碼設(shè)備內(nèi),簽名運(yùn)算也在密碼設(shè)備內(nèi)執(zhí)行。所采用的密碼設(shè)備在服務(wù)器端通常為密碼機(jī),在客戶端為帶cpu的usbkey和ic卡等。在云計(jì)算環(huán)境和手機(jī)移動(dòng)終端等環(huán)境下,使用這些密碼設(shè)備來(lái)保存密鑰和執(zhí)行密碼運(yùn)算就很不方便,因而出現(xiàn)了將密鑰保存在手機(jī)文件中并在手機(jī)上執(zhí)行密碼運(yùn)算的應(yīng)用需求。這種軟環(huán)境給密鑰的存儲(chǔ)安全和使用安全帶來(lái)很大隱患。為了提高密鑰存儲(chǔ)和密碼運(yùn)算的安全性,可以采用密鑰共享的方式,由多個(gè)用戶聯(lián)合對(duì)同一消息簽名,最后形成的簽名可使用共享的公鑰進(jìn)行驗(yàn)證。對(duì)于國(guó)密sm2簽名算法,由于其算法的特殊性,實(shí)現(xiàn)密鑰共享和聯(lián)合簽名比較困難。此外,對(duì)于一種無(wú)雙性對(duì)運(yùn)算的無(wú)證書公鑰密碼體制(參見(jiàn)申請(qǐng)?zhí)枮?01410772127.5的專利),由多方聯(lián)合完成基于sm2算法的簽名則更加困難,目前尚未發(fā)現(xiàn)解決這種應(yīng)用需求的方法。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明針對(duì)無(wú)雙性對(duì)運(yùn)算的無(wú)證書公鑰密碼體制,提出一種用戶密鑰共享方法,在無(wú)證書密鑰生成中心的協(xié)助下,n(n≥2)個(gè)用戶分別生成不同的私鑰,并生成一個(gè)共享公鑰。在需要對(duì)消息作數(shù)字簽名時(shí),由多方聯(lián)合完成對(duì)消息的sm2簽名,簽名依賴方可用共享公鑰按sm2驗(yàn)證簽名算法進(jìn)行驗(yàn)證。這種密鑰共享和簽名方法滿足以下要求:
(1)n個(gè)用戶對(duì)各自的私鑰具有完全自主權(quán),其他用戶或任何第三方(包括無(wú)證書密鑰生成中心)對(duì)該私鑰都不可知。
(2)多方合作完成的數(shù)字簽名符合國(guó)密sm2簽名標(biāo)準(zhǔn)要求,簽名依賴方可使用共享公鑰進(jìn)行驗(yàn)證。
(3)少于n個(gè)用戶合作不能構(gòu)造完整合法的sm2簽名。
本發(fā)明所涉及到的橢圓曲線參數(shù)按國(guó)密sm2算法標(biāo)準(zhǔn)設(shè)置。有限域上的橢圓曲線記為e(fq),其基點(diǎn)為g,而g的階為素?cái)?shù)n。
本發(fā)明中,無(wú)證書密鑰生成中心稱為kgc,n個(gè)用戶分別記為u1,u2,…,un,他們共享一個(gè)標(biāo)識(shí)id,h(x)為sm3雜湊函數(shù)。
一、密鑰生成
本發(fā)明所述生成無(wú)證書共享密鑰的方法涉及kgc和用戶u1,u2,…,un,具體技術(shù)方案描述如下。
g01所述kgc設(shè)置系統(tǒng)私鑰sm和系統(tǒng)公鑰ppub,完成系統(tǒng)建立。
g02所述用戶u1隨機(jī)選取k1∈[1,n-1],計(jì)算p1=k1g,發(fā)送p1到用戶u2。
g03對(duì)于i=2,3,…,n-1,所述用戶ui在收到pi-1后隨機(jī)選取di,ki∈[1,n-1],計(jì)算pi=(di)-1pi-1+kig,發(fā)送pi到ui+1。
g04所述用戶un在收到pn-1后隨機(jī)選取dn,kn∈[1,n-1],計(jì)算pn=(dn)-1pn-1+kng,發(fā)送pn到kgc。
g05所述kgc隨機(jī)選取k0∈[1,n-1],計(jì)算p=pn+k0g,s0=k0+h(id||p)sm(modn),kgc將p作為用戶實(shí)體的部分公鑰發(fā)布,發(fā)送s0到用戶un。
g06所述用戶un計(jì)算sn=dn(kn+s0+1)(modn),qn=(dn)-1g,發(fā)送sn和qn到用戶un-1。并將dn作為用戶un的私鑰保存,將qn作為用戶un的公鑰參數(shù)保存。
g07對(duì)于i=n-1,n-2,…,2,所述用戶ui計(jì)算si=di(ki+si+1)(modn),qi=(di)-1qi+1,發(fā)送si和qi到ui-1。并將di作為用戶ui的私鑰保存,將qi作為用戶ui的公鑰參數(shù)保存。
g08所述用戶u1計(jì)算d1=(k1+s2)-1(modn),q1=(d1)-1q2,將d1作為用戶u1的私鑰保存,將q1作為用戶u1的公鑰參數(shù)保存。
按此過(guò)程生成的用戶密鑰信息匯總?cè)缦拢?/p>
(1)用戶ui的私鑰為di(i=1,2,…,n)。
(2)用戶ui的公鑰參數(shù)為qi=(di…dn)-1g(i=1,2,…,n)。
(3)n個(gè)用戶的共享公鑰為q=((d1d2…dn)-1–1)g。
(4)n個(gè)用戶的共同私鑰為d=(d1d2…dn)-1–1(modn)。
(5)n個(gè)用戶的共同部分公鑰為p。
在密鑰生成的所有環(huán)節(jié)中,共同私鑰d并不實(shí)際出現(xiàn),任何人都可以通過(guò)公式q=p+h(id||p)ppub計(jì)算得到共享公鑰。
二、簽名與驗(yàn)簽
本發(fā)明所述安全簽名方法是指用戶實(shí)體需要對(duì)消息作數(shù)字簽名時(shí),由n個(gè)用戶聯(lián)合按序完成對(duì)消息的簽名,且簽名結(jié)果為普通的sm2簽名,簽名接收方可以使用共享公鑰進(jìn)行驗(yàn)證。
所述安全簽名方法涉及到的n個(gè)用戶為u1,u2,…,un。用戶ui具有私鑰di和公鑰參數(shù)qi,他們的共享公鑰為q=((d1d2…dn)-1–1)g,且有q1=(d1d2…dn)-1g,q2=(d2…dn)-1g,…,qn=(dn-1)g。
設(shè)待簽名的消息為m,e=h(z||m)是對(duì)消息m的摘要值。由n個(gè)用戶按次序聯(lián)合完成對(duì)摘要值e的sm2簽名。所述多方聯(lián)合簽名的方案如下。
s01所述用戶u1計(jì)算摘要值e,再隨機(jī)選取k1∈[1,n-1],計(jì)算r1=k1q1,發(fā)送e和r1到用戶u2。
s02對(duì)于i=2,3,…,n-1,所述用戶ui在收到ri-1后隨機(jī)選取ki∈[1,n-1],計(jì)算ri=ri-1+kiqi,發(fā)送e和ri到用戶ui+1。
s03所述用戶un在收到rn-1后隨機(jī)選取kn∈[1,n-1],計(jì)算rn=rn-1+knqn。
s04設(shè)rn=(x1,y1),所述用戶un計(jì)算r=(e+x1)(modn),sn=kn+rdn(modn),生成部分簽名(r,sn),發(fā)送部分簽名(r,sn)到用戶un-1。
s05對(duì)于i=n-1,n-2,…,1,所述用戶ui在收到用戶ui+1的部分簽名(r,si+1)后,首先驗(yàn)證該部分簽名。驗(yàn)證過(guò)程為:計(jì)算qi+1=diqi,ri+si+1qi+1–rg=(x1’,y1’),檢驗(yàn)r=(e+x1’)(modn)是否成立。若驗(yàn)證通過(guò),再計(jì)算si=ki+si+1di(modn),生成部分簽名(r,si),當(dāng)i>1時(shí),用戶ui發(fā)送部分簽名(r,si)到用戶ui-1。
s06所述用戶u1計(jì)算s=s1–r(modn),生成最終簽名(r,s)。
按此步驟生成的簽名(r,s)可以使用共享公鑰q按sm2簽名的驗(yàn)證算法進(jìn)行驗(yàn)證。
簽名接收者在接收到消息m和簽名(r,s)后,首先根據(jù)用戶id及部分公鑰p計(jì)算共享公鑰q,再按sm2簽名驗(yàn)證算法,令u=r+s(modn),計(jì)算摘要值e=h(z||m),sg+uq=(x1’,y1’),最后驗(yàn)證r=(e+x1’)(modn)是否成立。
通過(guò)下面三個(gè)步驟,可以證明本發(fā)明所述的多方聯(lián)合簽名方法生成的簽名能夠通過(guò)sm2簽名驗(yàn)證算法的驗(yàn)證。首先證明對(duì)于i=n-1,n-2,…,1,步驟s05中對(duì)部分簽名(r,si+1)的驗(yàn)證是正確的,然后證明最終簽名能夠使用共享公鑰q進(jìn)行驗(yàn)證。
v01驗(yàn)證部分簽名(r,sn)。
由于sn=kn+rdn(modn),qn=(dn)-1g,所以(x1’,y1’)=rn-1+snqn–rg=rn-1+knqn+rg–rg=rn-1+knqn=rn=(x1,y1),因此有x1’=x1,所以r=(e+x1’)(modn)成立。
v02對(duì)于i=n-1,n-2,…,2,假定已經(jīng)驗(yàn)證了部分簽名(r,si+1),即已經(jīng)有ri+si+1qi+1–rg=rn成立,來(lái)驗(yàn)證部分簽名(r,si),即驗(yàn)證ri-1+siqi–rg=rn成立。
由于qi=(di)-1qi+1,ri-1=ri–kiqi,si=ki+si+1di(modn),
所以ri-1+siqi–rg=(ri–kiqi)+(kiqi+si+1di(di)-1qi+1)–rg=ri+si+1qi+1–rg=rn。
于是部分簽名(r,si)得到驗(yàn)證。
v03驗(yàn)證最終簽名(r,s)。
按sm2簽名驗(yàn)證算法,只需要驗(yàn)證sg+uq=rn成立,其中q為用戶實(shí)體的實(shí)際公鑰。
在驗(yàn)證過(guò)程v02中,已經(jīng)驗(yàn)證了r1+s2q2–rg=rn成立。由于s=s1–r(modn),所以u(píng)=r+s=s1(modn),又因?yàn)閟1=k1+s2d1(modn),r1=k1q1,q1=(d1)-1q2,q=q1–g,所以
sg+uq=(s1–r)g+s1(q1–g)
=s1q1–rg=(k1+s2d1)q1–rg
=k1q1+s2d1(d1)-1q2–rg
=r1+s2q2–rg=rn
至此,所述最終簽名(r,s)得到完全驗(yàn)證,因此(r,s)就是一個(gè)標(biāo)準(zhǔn)的sm2簽名。
本發(fā)明所述安全簽名方法,共享公鑰的n個(gè)用戶都不能獲取其他用戶私鑰的信息,少于n個(gè)用戶聯(lián)合不能構(gòu)造對(duì)消息的合法數(shù)字簽名,必須由n個(gè)用戶聯(lián)合才能完成簽名。本發(fā)明所述簽名過(guò)程簡(jiǎn)單,簽名過(guò)程中,每個(gè)用戶只需要各做一次多倍點(diǎn)運(yùn)算,運(yùn)算效率高,簽名結(jié)果符合國(guó)密sm2簽名算法標(biāo)準(zhǔn)。
從前面的簽名過(guò)程和驗(yàn)證簽名的過(guò)程可見(jiàn),本發(fā)明所述安全簽名方法,不僅適應(yīng)于基于sm2的無(wú)證書公鑰密碼體制,而且可以適用于任何使用sm2算法的系統(tǒng),只要n個(gè)用戶分別持有的私鑰d1,d2,…,dn與共享公鑰q之間滿足q=((d1d2…dn)-1–1)g,這n個(gè)用戶就可以按上述簽名過(guò)程聯(lián)合完成對(duì)一個(gè)消息的sm2簽名。
本發(fā)明所述由n個(gè)用戶聯(lián)合完成簽名的方法,簽名過(guò)程是按次序完成的,但這個(gè)次序是可以調(diào)整的。如果需要調(diào)整簽名次序,只需要按新的簽名次序重新生成公鑰序列q1,q2,…,qn即可。例如,將簽名次序調(diào)整為ui1,ui2,…,uin后,n個(gè)用戶重新依次計(jì)算qin=(din)-1g,qi(n-1)=(di(n-1))-1qin,…,q1=(d1)-1q2,則可按新的次序來(lái)完成聯(lián)合簽名。
附圖說(shuō)明
圖1為本發(fā)明所述無(wú)證書共享密鑰生成流程。
圖2為本發(fā)明所述多方聯(lián)合安全簽名流程。
具體實(shí)施方式
本發(fā)明針對(duì)基于sm2算法無(wú)證書公鑰密碼體制提出了一種安全的簽名方案,下面根據(jù)附圖詳細(xì)說(shuō)明本發(fā)明的實(shí)施方式。
圖1所示為基于無(wú)證書公鑰密碼體制的密鑰生成實(shí)施流程。本發(fā)明所涉及到的有限域上的橢圓曲線參數(shù)按國(guó)密sm2算法標(biāo)準(zhǔn)設(shè)置,所使用的有限域上橢圓曲線記為e(fq),其基點(diǎn)為g,而g的階為素?cái)?shù)n,h(x)為sm3雜湊函數(shù)。
無(wú)證書密鑰生成中心稱為kgc,共享密鑰的n個(gè)用戶分別記為u1,u2,…,un,他們共享一個(gè)用戶標(biāo)識(shí)id。
步驟(1)所述kgc設(shè)置系統(tǒng)私鑰sm和系統(tǒng)公鑰ppub,完成系統(tǒng)建立。
步驟(2)所述用戶u1隨機(jī)選取k1∈[1,n-1],計(jì)算p1=k1g,發(fā)送p1到用戶u2。
步驟(3)對(duì)于i=2,3,…,n-1,所述用戶ui在收到pi-1后隨機(jī)選取di,ki∈[1,n-1],計(jì)算pi=(di)-1pi-1+kig,發(fā)送pi到用戶ui+1。
步驟(4)所述用戶un在收到pn-1后隨機(jī)選取dn,kn∈[1,n-1],計(jì)算pn=(dn)-1pn-1+kng,發(fā)送pn到kgc。
步驟(5)所述kgc根據(jù)所述用戶id和pn為用戶生成部分私鑰s0,發(fā)送s0到用戶un。
步驟(6)所述用戶un計(jì)算sn=dn(kn+s0+1)(modn),qn=(dn)-1g,發(fā)送sn和qn到用戶un-1。并將dn作為用戶un的私鑰保存,將qn作為用戶un的公鑰參數(shù)保存。
步驟(7)對(duì)于i=n-1,n-2,…,2,所述用戶ui計(jì)算si=di(ki+si+1)(modn),qi=(di)-1qi+1,發(fā)送si和qi到ui-1。并將di作為用戶ui的私鑰保存,將qi作為用戶ui的公鑰參數(shù)保存。
步驟(8)所述用戶u1計(jì)算d1=(k1+s2)-1(modn),q1=(d1)-1q2,將d1作為用戶u1的私鑰保存,將q1作為用戶u1的公鑰參數(shù)保存。
本實(shí)施例生成的共享公鑰為q=((d1d2…dn)-1–1)g,公眾用戶可以按無(wú)證書公鑰密碼體制的算法根據(jù)用戶標(biāo)識(shí)id和部分公鑰計(jì)算用戶的共享公鑰,符合無(wú)證書公鑰密碼體制的特征。
圖2所示為用戶u1,u2,…,un聯(lián)合對(duì)一個(gè)消息進(jìn)行簽名的實(shí)施流程。
有關(guān)橢圓曲線和密鑰的記號(hào)如前,各參數(shù)的選擇符合國(guó)密sm2算法標(biāo)準(zhǔn)的要求。假定待簽名的消息為m,e=h(z||m),其中z為用戶標(biāo)識(shí)和公鑰信息。多方聯(lián)合簽名按以下步驟實(shí)施。
步驟(9)所述用戶u1計(jì)算摘要值e,再隨機(jī)選取k1∈[1,n-1],計(jì)算r1=k1q1,發(fā)送e和r1到用戶u2。
步驟(10)對(duì)于i=2,3,…,n-1,所述用戶ui在收到ri-1后隨機(jī)選取ki∈[1,n-1],計(jì)算ri=ri-1+kiqi,發(fā)送e和ri到用戶ui+1。
步驟(11)所述用戶un在收到rn-1后隨機(jī)選取kn∈[1,n-1],計(jì)算rn=rn-1+knqn。
步驟(12)設(shè)rn=(x1,y1),所述用戶un計(jì)算r=(e+x1)(modn),sn=kn+rdn(modn),生成部分簽名(r,sn),發(fā)送部分簽名(r,sn)到用戶un-1。
步驟(13)對(duì)于i=n-1,n-2,…,2,所述用戶ui在收到用戶ui+1的部分簽名(r,si+1)后,首先驗(yàn)證該部分簽名。若驗(yàn)證通過(guò),再計(jì)算si=ki+si+1di(modn),生成部分簽名(r,si),發(fā)送部分簽名(r,si)到用戶ui-1。
步驟(14)所述用戶u1在收到用戶u2的部分簽名(r,s2)后,首先驗(yàn)證該部分簽名。若驗(yàn)證通過(guò),計(jì)算s=k1+s2d1–r(modn),輸出簽名(r,s)。
上述實(shí)施例僅從原理上描述了本發(fā)明的內(nèi)容,任何對(duì)本發(fā)明實(shí)質(zhì)內(nèi)容所作的數(shù)學(xué)上的變形和修飾都包含在本發(fā)明專利的保護(hù)范圍。