張金輝 黃加成 梁紅梅 李慧敏
1(應(yīng)用數(shù)學(xué)福建省高校重點(diǎn)實(shí)驗(yàn)室 福建 莆田 351100)2(莆田學(xué)院數(shù)學(xué)與金融學(xué)院 福建 莆田 351100)3(閩南師范大學(xué)數(shù)學(xué)與統(tǒng)計學(xué)院 福建 漳州 363000)
在傳統(tǒng)的公鑰密碼系統(tǒng)中,用戶的公鑰是通過公鑰基礎(chǔ)設(shè)施PKI頒發(fā)證書來認(rèn)證的,由此出現(xiàn)了公鑰證書的管理、存儲、發(fā)布、驗(yàn)證等問題[1]。為了簡化證書的管理等問題,1984年,Shamir[2]首次提出了基于身份的公鑰密碼體制,在該體制中使用能夠唯一識別該用戶身份的公開信息來作為用戶的公鑰,這樣用戶的公鑰就不再需要PKI頒發(fā)證書認(rèn)證,從而降低了PKI的證書管理等問題的復(fù)雜性。但是,在基于身份的公鑰密碼體制中,用戶的私鑰完全由KGC產(chǎn)生,使得基于身份的公鑰密碼體制存在密鑰托管這一新問題。為了解決該問題,Al-Riyami等[3]在2003年的亞洲密碼學(xué)會議上首次引入了無證書公鑰密碼學(xué)概念,解決了基于身份公鑰密碼學(xué)中存在的用戶密鑰托管問題,也解決了PKI中存在的證書管理問題。
在無證書認(rèn)證動態(tài)群組密鑰協(xié)商協(xié)議中,對于動態(tài)群組中人員的變動后組密鑰的更新總是困難的。伍前紅等[4]提出針對基于ASGKA(Asymmetric Group Key Agreement)協(xié)議,允許成員的離開和加入,且高效地完成了密鑰的及時更新。但是由于群成員可能來自不同的時區(qū)、領(lǐng)域、網(wǎng)絡(luò)類型,而ASGKA不能滿足該需求。張啟坤等[5]提出基于身份的可認(rèn)證非對稱群群組密鑰協(xié)商協(xié)議(Identity-Base authenticated Asymmetric Group Key Agreement,IB-AAGKA)解決了群成員因各種差異不能保持多輪在線密鑰協(xié)商問題和實(shí)現(xiàn)匿名與可認(rèn)證性并且支持節(jié)點(diǎn)的動態(tài)群組密鑰更新的問題。由于是基于身份的公鑰密碼體制,存在密鑰的托管問題,陳若昕等[6]提出無證書非對稱群密鑰協(xié)商協(xié)議,實(shí)現(xiàn)了對于群成員公開信息認(rèn)證的同時又認(rèn)證了其身份,保證了成員的安全通信,提高了效率。現(xiàn)今隨著網(wǎng)絡(luò)計算、即時通信、對等網(wǎng)絡(luò)數(shù)據(jù)共享愈加重要,在這類通信中兩方密鑰協(xié)商協(xié)議顯得非常重要[7-11]。但是,對于三方以上的秘密通信問題,學(xué)者們提出了組密鑰協(xié)商協(xié)議[12-15]。最近,Kumar A和Tripathi S提出了一個無雙線性對的匿名無證書動態(tài)群組密鑰協(xié)商協(xié)議[13]。經(jīng)過分析發(fā)現(xiàn),該群組密鑰協(xié)商協(xié)議是不安全的。本文指出了該協(xié)議存在的安全問題,并給出了具體的攻擊方法,最后給出了應(yīng)對該攻擊的改進(jìn)方法。
設(shè)G1為p階加法循環(huán)群且P是它的一個生成元,G2為p階乘法循環(huán)群,若映射e:G1×G1→G2滿足下面三條性質(zhì),則稱為雙線性對運(yùn)算。
(2) 非退化性:存在P∈G1,使得e(P,P)≠1G2,其中1G2表示群G2是單位元。
(3) 高效性:對于任意P,Q∈G,都存在有效的算法計算e(P,Q)。
表1為本文用到的一些符號。
表1 符號說明表
(1) KGC選擇安全參數(shù)k∈Z+并執(zhí)行以下操作:
① 選擇一個k位素數(shù)p,并確定出{Fp,G,P}。
③ 對于安全參數(shù)k,KGC會選擇兩個安全Hash函數(shù)作為秘密值:
H2:G×G→{0,1}k
④ KGC發(fā)布{Fp,G,P,Ppub,H1,H2}作為系統(tǒng)參數(shù),然后秘密保存主私鑰s。
(2) KGC為用戶頒布部分私鑰Di,具體算法如下:
Ri=riP,hi=H1(IDi‖Ri‖Qi)
Si=(ri+shi)modp
KGC通過安全的信道向用戶Ui頒發(fā)用戶的部分私鑰Di=
在收到KGC的部分私鑰Di后,用戶Ui可以通過下列的等式來驗(yàn)證:
Ri+Hi(IDi‖Ri‖Qi)Ppub=SiP
如果等式成立則部分私鑰有效,反之無效。
(4) 用戶IDi將SKi=
(5) 設(shè)置公鑰,計算Pi=(xi+Si)P,Qi=xiP,用戶IDi的公鑰為PKi=
(1) 每個用戶按照下列步驟執(zhí)行:
① 用戶選擇一個臨時身份TIDi。
③ 用戶Ui向KGC發(fā)送以下信息:
(2) 在接收到來自每個用戶Ui的上述消息時,KGC執(zhí)行以下操作:
① 計算Ki=sTi=(Kix,Kiy),1≤i≤n。
② 使用Kix對來自Ui的消息進(jìn)行解密得到Ti的值。
③ KGC驗(yàn)證解密的Ti是否與從Ui接收到的Ti相同;如果驗(yàn)證成功,則執(zhí)行后面的操作,否則拒絕。
④ KGC計算hti=H1(TIDi),Sti=(ri+shti)modp,1≤i≤n。
⑤ KGC向每個使用Kix加密的用戶發(fā)送以下內(nèi)容:
{Sti‖ht1‖Q1‖ht2‖Q2‖…‖htn‖Qn}_kix
(1)Ui首先解密從KGC收到的消息并獲得它們的臨時部分密鑰Sti,TIDj的哈希值和其他成員的公開密鑰Qj(1≤j≤n),Ui也可以在列表中找到自己的位置,并根據(jù)列表中的位置設(shè)置下標(biāo)。
(3)Ui將
①Ki,i+1=(xi+Sti)Wi+1+wi(Qi+1+Ri+1+ht(i+1)Ppub);
④Ki,i-1=(xi+Sti)Wi-1+wi(Qi-1+Ri-1+ht(i-1)Ppub);
接著每個用戶都將它們的Xi傳播給群組中的其他用戶,在得到所有Xj(j≠i)之后,Ui首先驗(yàn)證收到的消息如下:X1⊕X2⊕…⊕Xn=0。
最后每個用戶的組會話密鑰計算為:
假設(shè)新用戶{Un+1,Un+2,…,Um}想要加入現(xiàn)有的組{U1,U2,…,Un},則步驟如下:
(1) 從{U1,U2,…,Un}選擇出兩個用戶U1和Un,重新選擇秘密值x1和xn,更新它們的公私鑰。此時的分組情況為{U1,U2,…,Un}與{U1,Un+1,Un+2,…,Um,Un}。
(3) 重復(fù)密鑰協(xié)商階段后與第一組{U1,U2,…,Un}得出密鑰SK1與第二組{U1,Un+1,Un+2,…,Um,Un}得出密鑰SK2。
(4)U1和Un把密鑰SK1發(fā)送給第二組的其余成員{Un+1,Un+2,…,Um},把SK2發(fā)送給第一組的其他成員{U2,…,Un-1}。
(5) 把兩組合并為{U1,U2,…,Un,Un+1,Un+2,…,Um},此時新的組密鑰為SKnew=H1(SK1‖SK2)。
假設(shè)U={U1,U2,…,Un}是當(dāng)前組,并且L={Ul1,Ul2,…,Uln}是離開成員的集合,其中{l1,l2,…,ln}∈{1,2,…,n},此時我們將剩下的成員集合表示為:
A={Ua1,Ua2,…,Ua(n-n′)}=U-Ln>n′
令Ua1∈A作為離開管理員,用Ua1的臨時身份將所有離開成員L的hti傳播給A。該操作步驟如下:
(2) 若成員Uk∈A,且其相鄰的成員沒有改變,就什么都不做,只是簡單地傳播它們之前已計算好的Xk作為新的Xnewk即(Xnewk=Xk),然后再傳播給A。
(3) 每個成員Ui∈A在接收到所有的Xnewj(j≠i)后驗(yàn)證:
Xnewa1⊕Xnewa2⊕…⊕Xnewa(n-n′)=0
本節(jié)對文獻(xiàn)[13]中的密鑰協(xié)商協(xié)議進(jìn)行分析,指出攻擊者無須知道用戶的私鑰即可以繞過KGC的身份驗(yàn)證,從而假冒用戶參與組密鑰的協(xié)商,盜取組密鑰。
式中:Ppub為群成員Ui的公鑰。
(3) 攻擊者向KGC發(fā)送以下信息:
在接收到來自攻擊者的上述消息時,KGC會執(zhí)行以下操作:
(2) 使用Kix對來自Ui的消息進(jìn)行解密得到Ti的值,所以得到的Kix可以成功地解密得到{Ti,TIDi,Qi}。
(4) 現(xiàn)在KGC計算如下:
hti=H1(TIDi)
Sti=(ri+s.hti)modp1≤i≤n
(5) KGC向每個使用Kix加密的用戶發(fā)送以下內(nèi)容:{Sti‖ht1‖Q1‖ht2‖Q2‖…‖htn‖Qn}_kix。
(1) 在驗(yàn)證成功之后攻擊者計算如下:
①Ki,i+1=(xi+Sti)Wi+1+wi(Qi+1+Ri+1+ht(i+1)Ppub);
④Ki,i-1=(xi+Sti)Wi-1+wi(Qi-1+Ri-1+ht(i-1)Ppub);
(2) 由于每個用戶也會把它們的Xi傳播給群組中的其他用戶,則攻擊者可以得到所有Xi,接收到消息之后,驗(yàn)證等式是否成立:X1⊕X2⊕…⊕Xn=0。
在成功驗(yàn)證后,攻擊者就可以通過上述數(shù)據(jù)計算:
通過上述分析可知,攻擊者可以成功繞過KGC的驗(yàn)證,從而偽裝某個用戶潛入進(jìn)行組密鑰的協(xié)商。因此,文獻(xiàn)[13]中的組密鑰協(xié)商協(xié)議是不安全的。
上述攻擊成功的原因是KGC在用戶匿名身份的注冊中無法證實(shí)用戶的真實(shí)身份。針對這個問題,下面給出兩種改進(jìn)方法,使得KGC可以確信用戶的真實(shí)身份。這里采用和文獻(xiàn)[13]一樣的系統(tǒng)參數(shù)。
(1) 讓用戶選擇一個臨時身份TIDi并且隨機(jī)選擇ti∈RZp*,計算如下:
Ti=tiP,Ki=tiPpub=(Kix,Kiy)
(2) 計算完成之后Ui向KGC發(fā)送以下信息:
(3) KGC接收到Ui信息后可計算Ki=sTi=(Kix,Kiy)得到Kix(因?yàn)閠iPpub=tisP=sTi)。
(4) KGC根據(jù)Kix解密得到{Ti,TIDi,Qi,
(6) KGC根據(jù)Kix解密得到的
顯然,由于用戶的部分私鑰是KGC為其生成并且通過安全信道發(fā)送給用戶的,即用戶的部分私鑰只有用戶和KGC擁有。攻擊者若想要替換用戶的公鑰,還需要生成和用戶身份及新公鑰一致的部分私鑰,就必須從Ri=riP,hi=H1(IDi‖Ri‖Qi),Si=(ri+shi)modp中獲得主私鑰s才可以做到,這是求離散對數(shù)困難問題,所以該改進(jìn)方法是可行的。
改進(jìn)方法一是把用于用戶的部分私鑰直接作為被加密的內(nèi)容進(jìn)行傳送,雖然是用加密的方式傳輸,但若在數(shù)據(jù)的解密過程中使用不當(dāng),容易導(dǎo)致用戶私鑰的泄露。所以這里采用數(shù)字簽名的方法加以改進(jìn),具體如下:
(1)Ti=tiP;
(2)Ki=tiPpub=(Kix,Kiy);
(3) 令v=H1(IDi‖Ri‖Qi‖Ti),計算u=ti+Siv;
(4) 發(fā)送
(5) KGC驗(yàn)證uP=Ti+vRi+vhiPpub,式中hi=H1(IDi‖Ri‖Qi)。
驗(yàn)證正確性:
uP=(ti+Siv)P=tiP+SivP=Ti+(ri+shi)vP=
Ti+rivP+shivP=Ti+vRi+vhiPpub
由此可知,(u,Ti)事實(shí)上為用戶使用部分私鑰Si對身份和公鑰消息IDi、Ri、Qi做的數(shù)字簽名。如果攻擊者想要冒充群組里的成員,就必須得到用戶的部分私鑰Si,而用戶的部分私鑰只有用戶和KGC擁有?;蛘吖粽叩脧腞i=riP、Ppub=sP中去計算得到ri和s,這顯然也是離散對數(shù)問題,所以該改進(jìn)方法是可行的。因此,通過這個方式KGC可以確信用戶的真實(shí)身份。
本文對文獻(xiàn)[13]中的組密鑰的協(xié)商進(jìn)行了分析,指出該協(xié)議是不安全的,給出具體的攻擊方法,并在此基礎(chǔ)上提出了應(yīng)對該攻擊的兩種改進(jìn)方法。第一種是在發(fā)送給KGC的內(nèi)容中直接添加用戶的部分私鑰去讓KGC驗(yàn)證;第二種是使用用戶的部分私鑰進(jìn)行簽名后再發(fā)送。本文給出的分析方法對于同類協(xié)議,特別是基于無證書公鑰系統(tǒng)的協(xié)議的設(shè)計具有借鑒意義。