劉城霞
北京信息科技大學(xué)計(jì)算機(jī)學(xué)院 北京 100101
在無(wú)線通信中隨著移動(dòng)用戶(hù)對(duì)信息服務(wù)的需求越來(lái)越多,對(duì)移動(dòng)通信系統(tǒng)安全的要求也越來(lái)越高,這不僅包括數(shù)據(jù)通信的安全性,還要求身份認(rèn)證的合法性。目前實(shí)現(xiàn)身份認(rèn)證最可行最安全的方式是設(shè)計(jì)基于密碼技術(shù)的認(rèn)證協(xié)議,并將其運(yùn)用于認(rèn)證系統(tǒng)中,Beller-Yacobi認(rèn)證協(xié)議便是實(shí)現(xiàn)該功能的協(xié)議之一。
Beller-Yacobi密鑰傳輸協(xié)議被稱(chēng)為混合密鑰傳輸協(xié)議,它同時(shí)使用了對(duì)稱(chēng)加密技術(shù)和非對(duì)稱(chēng)加密技術(shù),也就是說(shuō)除了使用公鑰加密和數(shù)字簽名外,還使用了對(duì)稱(chēng)加密技術(shù)。
信息安全的基本模型可以用圖1表示。

圖1 信息安全的基本模型
通信雙方欲傳遞某個(gè)消息,則需要考慮通信的安全性。安全傳輸技術(shù)有以下兩個(gè)基本成分:①消息的安全傳輸,包括對(duì)消息的加密和認(rèn)證。②通信雙方共享的某些秘密信息,如加密密鑰。為了消息的安全傳輸,還需要一個(gè)可信的第三方,其作用可能是負(fù)責(zé)向通信雙方發(fā)布秘密信息或者在通信雙方有爭(zhēng)議時(shí)進(jìn)行仲裁。所以安全的網(wǎng)絡(luò)通信必須考慮4個(gè)方面:①加密算法。②用于加密算法的秘密信息。③秘密信息的分布和共享。④使用加密算法和秘密信息以獲得安全服務(wù)所需的協(xié)議。
Beller-Yacobi協(xié)議實(shí)現(xiàn)密鑰的傳輸,提供相互的實(shí)體認(rèn)證和顯式的密鑰認(rèn)證。首先介紹一下簡(jiǎn)化的Beller-Yacobi協(xié)議:
(1) 系統(tǒng)參數(shù)的選擇。模ns整數(shù)的乘法群中,適當(dāng)?shù)乃財(cái)?shù)ns和生成元a被確定為ElGamal系統(tǒng)參數(shù)。可信服務(wù)器T選擇適當(dāng)?shù)乃財(cái)?shù)p和q來(lái)為RSA簽名生成公開(kāi)模數(shù)nT =pq,然后為公開(kāi)指數(shù)eT=3計(jì)算一個(gè)私鑰dT,使得eT dT=1mod(p-1)(q -1)。
(2) 系統(tǒng)參數(shù)分發(fā)。T給每個(gè)參與方(A和B)分發(fā)一個(gè)可信副本,包括T的公鑰和系統(tǒng)參數(shù)nT,(ns,α),并為每個(gè)參與方X制定一個(gè)惟一的可辨別名稱(chēng)或識(shí)別串IX(如X的名稱(chēng)和地址)。
(3) 終端的初始化。每個(gè)充當(dāng)A(終端)的參與方都隨機(jī)選擇一個(gè)整數(shù)a,1<a≤ns-2,并且計(jì)算其ElGamal簽名公鑰uA =αamodnS。A保密相應(yīng)的私鑰a,并將uA的一個(gè)可信副本傳送給T,通過(guò)帶外方式(安全信道或者是親自送交)來(lái)向T識(shí)別它自己。T生成公鑰證書(shū)并返回給A:certA=(IA, uA, GA)(此證書(shū)包含A的身份和ElGamal簽名公鑰 , 以 及 由GA=ST( IA, uA)=(h( IA, uA))dTmodnT 產(chǎn) 生 的T的RSA簽名GA)。
(4) 服務(wù)器端的初始化。每個(gè)充當(dāng)B(服務(wù)器)的參與方都產(chǎn)生一個(gè)加密私鑰和一個(gè)基于公開(kāi)指數(shù)eB=3的RSA的相應(yīng)公鑰。B選擇一個(gè)公鑰模數(shù)nB,為兩個(gè)適當(dāng)?shù)拿孛芩財(cái)?shù)的乘積,并自己計(jì)算相應(yīng)的RSA私鑰dB。B將nB傳送給v,通過(guò)所謂的帶外(安全信道)方式來(lái)向T識(shí)別它自己。T產(chǎn)生公鑰證書(shū)并返回給B:certB=(IB,nB,GB)(此證書(shū)包含B的身份核RSA加密公鑰nB,以及由GA=ST(IA,uA)=(h(IA,uA))dTmodnT產(chǎn)生的T的RSA簽名GB)。
其中EK(y)表示使用密鑰K和算法E對(duì)y進(jìn)行對(duì)稱(chēng)加密。PX(y)表示應(yīng)用X的公鑰函數(shù)對(duì)y加密后的結(jié)果。SX(y)表示應(yīng)用X的私鑰函數(shù)對(duì)y簽名后的結(jié)果。IX表示參與方X的一個(gè)識(shí)別串。h(y)表示y的雜湊,它與簽名方案一同使用。如果y=(y1,...,yn),則輸入為這多個(gè)值的級(jí)聯(lián)。
協(xié)議執(zhí)行過(guò)程如圖2所示。

圖2 Beller-Yacobi協(xié)議描述圖
可信服務(wù)器T負(fù)責(zé)分發(fā)統(tǒng)一的參數(shù),并且針對(duì)接收到的關(guān)于 A,B,產(chǎn)生相應(yīng)的簽名,然后發(fā)送相應(yīng)的公鑰證書(shū)。可信服務(wù)器T的所有操作都是該協(xié)議的系統(tǒng)設(shè)置準(zhǔn)備階段,也就是又可信第三方分發(fā)密鑰的階段,協(xié)議的關(guān)鍵在與A,B之間的信息交流,以達(dá)到傳送密鑰K的目的。每當(dāng)A,B要將信息傳送給對(duì)方的時(shí)候都要將由可信服務(wù)器T生成的公鑰認(rèn)證一并傳送,讓對(duì)方驗(yàn)證自己的身份。其中 A使用ElGamal簽名用來(lái)產(chǎn)生會(huì)話密鑰K(協(xié)議傳輸對(duì)象)。而B(niǎo)對(duì)ElGamal簽名的認(rèn)證確定密鑰的來(lái)源,以及密鑰的正確性。
可信服務(wù)器T要進(jìn)行RSA公鑰的生成及生成公鑰認(rèn)證,那么就有必要了解一下RSA的算法原理和密鑰是如何生成的。
每個(gè)實(shí)體產(chǎn)生一個(gè)RSA公鑰以及一個(gè)相應(yīng)的私鑰。每個(gè)實(shí)體A執(zhí)行如下操作:
① 隨機(jī)生成兩個(gè)不同的大素?cái)?shù)p和q。
② 計(jì)算n=pq和φ=(p-1)(q-1)。
③ 隨機(jī)選擇整數(shù)e,1<e<φ,使得gcd(e,φ)=1
④ 使用擴(kuò)展的歐幾里得算法計(jì)算滿足ed≡1modφ的惟一整數(shù)d,1<d<φ。
⑤A的公鑰為(n,e),私鑰為d。
RSA密鑰生成中的整數(shù)e,d分別稱(chēng)為加密指數(shù)和解密指數(shù),n稱(chēng)為模數(shù)。
B為A對(duì)消息m加密,A進(jìn)行解密。
(1) 加密,B執(zhí)行如下操作:
① 獲得A的可信公鑰(n,e)。
② 把消息表示成區(qū)間[0,n-1]內(nèi)的整數(shù)m。③ 計(jì)算c=memodn。
④ 將密文c發(fā)送給A。
(2) 解密,為了從c中恢復(fù)明文m,A執(zhí)行:用私鑰d恢復(fù)m=cdmodn。
實(shí)體A簽署消息m∈Μ。任何實(shí)體B都可驗(yàn)證A的簽名,并從中恢復(fù)消息m。
(1) 簽名生成,實(shí)體A執(zhí)行如下操作:
① 計(jì)算取值在區(qū)間[0,n-1]內(nèi)的整數(shù)=R(m)。
② 計(jì)算s=modn。
③A對(duì)m的簽名s。
(2) 驗(yàn)證,為驗(yàn)證A的簽名s且恢復(fù)消息m,實(shí)體B應(yīng)當(dāng):
① 獲得A的可信公鑰(n,e)。
② 計(jì)算=semodn。
③ 驗(yàn)證∈ΜR;否則拒絕接收簽名。
④ 恢復(fù)
簽名驗(yàn)證可行性證明。若s是消息m的簽名,則有s=modn, 其 中=R(m)。 因 為ed≡1modφ, 故
(1) RSA公鑰產(chǎn)生
調(diào)用.NET環(huán)境下的類(lèi)可直接產(chǎn)生由XML封裝的公鑰。將公鑰發(fā)給A,B,自己保留私鑰,用以后來(lái)的簽名和解密。代碼如下:
public void RSAKey(out string xmlKeys, out string xmlPublicKey)
{RSACryptoServiceProvider rsa = new RSACryptoService Provider();//初始化對(duì)象
xmlKeys=rsa.ToXmlString(true);//產(chǎn)生私鑰
xmlPublicKey=rsa.ToXmlString(false);//公鑰 }
RSA參數(shù)實(shí)際存儲(chǔ)在兩個(gè)字段中,一個(gè)是xmlKeys,存儲(chǔ)公開(kāi)的RSA參數(shù),另一個(gè)是xmlPublicKey,存儲(chǔ)公開(kāi)和私有的RSA參數(shù)。系統(tǒng)產(chǎn)生的公鑰和私鑰都由XML封裝,形式如:
由 (2) RSA公鑰加密 public string RSAEncrypt(string xmlPublicKey, string m_strEncryptString) {RSACryptoServiceProvider rsa = new RSACryptoService Provider();//產(chǎn)生對(duì)象 rsa.FromXmlString(xmlPublicKey); //初始化 PlainTextBArray = (new UnicodeEncoding()).GetBytes(m_strEncryptString);//轉(zhuǎn)字節(jié)序列 CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);//加密 Result = Convert.ToBase64String(CypherTextBArray);return Result; } 算法將所要機(jī)密的明文字符串轉(zhuǎn)換成一個(gè)字節(jié)序列,存儲(chǔ)在PlainTextBArray中。再調(diào)用RSA類(lèi)的Encrypt方法對(duì)經(jīng)過(guò)處理的密文進(jìn)行加密,以字符串的類(lèi)型返回。 (3) RSA簽名 RSA簽名需要關(guān)鍵的兩個(gè)步驟,求哈希(雜湊)值和簽名。下面是GetHash實(shí)現(xiàn)代碼: public bool GetHash(string m_strSource, ref string strHashData) {HashAlgorithm MD5 = HashAlgorithm.Create("MD5");/產(chǎn)生Hash算法 Buffer =System.Text.Encoding.GetEncoding("GB2312").GetBytes(m_strSource); HashData = MD5.ComputeHash(Buffer);//計(jì)算Hash值 strHashData = Convert.ToBase64String(HashData); return true; } 這里首先對(duì)要求哈希值的字符串進(jìn)行處理,轉(zhuǎn)換成字節(jié)序列,然后計(jì)算指定字節(jié)數(shù)組的哈希值,最后將哈希值以字符串的形式輸出。獲得哈希描述后,對(duì)該哈希值進(jìn)行簽名。代碼如下: public bool SignatureFormatter(string p_strKeyPrivate, byte[]HashbyteSignature, ref byte[] EncryptedSignatureData) { RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider(); RSA.FromXmlString(p_strKeyPrivate);//用已有的私鑰初始化對(duì)象 SignatureFormatter RSAFormatter = new SignatureFormatter(RSA); RSAFormatter.SetHashAlgorithm("MD5");//得到Hash算法 EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);//產(chǎn)生簽名 return true; } 首先用之前產(chǎn)生的公鑰進(jìn)行初始化,然后將簽名的算法設(shè)置為 MD5,最后對(duì)之前求得的哈希值進(jìn)行簽名。有關(guān)ElGamal簽名和DES對(duì)稱(chēng)加密方法在系統(tǒng)中也實(shí)現(xiàn)了,篇幅原因這里不再贅述。 首先由可信服務(wù)器T產(chǎn)生各個(gè)參數(shù),如圖3。公鑰(nt,e)顯示的是系統(tǒng)產(chǎn)生的RSA公鑰,ElGamal參數(shù)是由系統(tǒng)產(chǎn)生的一個(gè)隨機(jī)大素?cái)?shù)及其本原根。隨后,將參數(shù)發(fā)送給A,B,兩方接收并存儲(chǔ)參數(shù),以備后用。 圖3 可信服務(wù)器T的系統(tǒng)設(shè)置 接著,終端A和可信服務(wù)器B產(chǎn)生各自的識(shí)別串和參數(shù),然后傳送給可信服務(wù)器T。如圖4所示,Ib為B的識(shí)別串,nb是可信服務(wù)器用于RSA加密的公鑰。 終端A的系統(tǒng)設(shè)置與B類(lèi)似,不在贅述。A和B設(shè)置后,可信服務(wù)器T接收A,B的參數(shù),通過(guò)RSA簽名產(chǎn)生Ga,Gb,再送給A,B。A,B接收各自簽名,即公鑰認(rèn)證,則準(zhǔn)備階段完成。 圖4 服務(wù)器端B的系統(tǒng)設(shè)置 這里只描述A與B之間的信息傳輸和發(fā)送。系統(tǒng)設(shè)置完成后,首先由服務(wù)器端B產(chǎn)生一個(gè)隨機(jī)數(shù)發(fā)送給終端A,發(fā)送的同時(shí)將準(zhǔn)備階段時(shí)T產(chǎn)生的公鑰認(rèn)證一起發(fā)送,用于A方對(duì)于信息來(lái)源的檢測(cè)。如圖5所示,終端A通過(guò)RSA認(rèn)證,來(lái)檢驗(yàn)來(lái)自B方的信息。 圖5 終端A認(rèn)證信息 認(rèn)證成功之后,終端 A計(jì)算其 ElGamal簽名,并和 A的公鑰認(rèn)證一同發(fā)送給 B。發(fā)送前首先對(duì)簽名進(jìn)行相應(yīng)的RSA公鑰加密,以及DES對(duì)稱(chēng)加密。由此,B方首先接收到的是加密之后的簽名以及認(rèn)證,然后B方再對(duì)加密結(jié)果進(jìn)行解密,最后便是服務(wù)器端B對(duì)來(lái)自A的信息的認(rèn)證,如圖6所示。 圖6 服務(wù)器B的最終驗(yàn)證結(jié)果 認(rèn)證中首先進(jìn)行公鑰認(rèn)證,通過(guò)RSA認(rèn)證來(lái)檢驗(yàn)信息的來(lái)源,而后是ElGamal認(rèn)證,認(rèn)證傳輸?shù)拿荑€K的真確性,兩者均驗(yàn)證成功才能說(shuō)明協(xié)議執(zhí)行成功。 本文分析了Beller-Yacobi協(xié)議的每一個(gè)步驟以及所涉及的加密、簽名算法。并以RSA加密算法及簽名算法為例做了詳細(xì)的介紹,并用C# 語(yǔ)言在.NET平臺(tái)下編寫(xiě)了相應(yīng)的算法程序,實(shí)現(xiàn)了整個(gè)Beller-Yacobi密鑰傳輸協(xié)議的過(guò)程。 [1] 徐勝波,武傳坤,王新梅.移動(dòng)通信網(wǎng)中的認(rèn)證與密鑰分配[J].電子學(xué)報(bào).1996. [2] Alfred J.Menezes, PaulC.van Oorschot, Scott A.Vanstone著,胡磊,王鵬譯.應(yīng)用密碼學(xué)手冊(cè)[M].北京:電子工業(yè)出版社.2005. [3] 王亞弟,束妮娜,韓繼紅編著.密碼協(xié)議形式化分析[M].北京:機(jī)械工業(yè)出版社.2006.3 系統(tǒng)運(yùn)行和測(cè)試
3.1 系統(tǒng)設(shè)置階段


3.2 協(xié)議執(zhí)行階段


4 總結(jié)