劉城霞
北京信息科技大學(xué)計算機學(xué)院 北京 100101
在無線通信中隨著移動用戶對信息服務(wù)的需求越來越多,對移動通信系統(tǒng)安全的要求也越來越高,這不僅包括數(shù)據(jù)通信的安全性,還要求身份認(rèn)證的合法性。目前實現(xiàn)身份認(rèn)證最可行最安全的方式是設(shè)計基于密碼技術(shù)的認(rèn)證協(xié)議,并將其運用于認(rèn)證系統(tǒng)中,Beller-Yacobi認(rèn)證協(xié)議便是實現(xiàn)該功能的協(xié)議之一。
Beller-Yacobi密鑰傳輸協(xié)議被稱為混合密鑰傳輸協(xié)議,它同時使用了對稱加密技術(shù)和非對稱加密技術(shù),也就是說除了使用公鑰加密和數(shù)字簽名外,還使用了對稱加密技術(shù)。
信息安全的基本模型可以用圖1表示。
圖1 信息安全的基本模型
通信雙方欲傳遞某個消息,則需要考慮通信的安全性。安全傳輸技術(shù)有以下兩個基本成分:①消息的安全傳輸,包括對消息的加密和認(rèn)證。②通信雙方共享的某些秘密信息,如加密密鑰。為了消息的安全傳輸,還需要一個可信的第三方,其作用可能是負(fù)責(zé)向通信雙方發(fā)布秘密信息或者在通信雙方有爭議時進(jìn)行仲裁。所以安全的網(wǎng)絡(luò)通信必須考慮4個方面:①加密算法。②用于加密算法的秘密信息。③秘密信息的分布和共享。④使用加密算法和秘密信息以獲得安全服務(wù)所需的協(xié)議。
Beller-Yacobi協(xié)議實現(xiàn)密鑰的傳輸,提供相互的實體認(rèn)證和顯式的密鑰認(rèn)證。首先介紹一下簡化的Beller-Yacobi協(xié)議:
(1) 系統(tǒng)參數(shù)的選擇。模ns整數(shù)的乘法群中,適當(dāng)?shù)乃財?shù)ns和生成元a被確定為ElGamal系統(tǒng)參數(shù)。可信服務(wù)器T選擇適當(dāng)?shù)乃財?shù)p和q來為RSA簽名生成公開模數(shù)nT =pq,然后為公開指數(shù)eT=3計算一個私鑰dT,使得eT dT=1mod(p-1)(q -1)。
(2) 系統(tǒng)參數(shù)分發(fā)。T給每個參與方(A和B)分發(fā)一個可信副本,包括T的公鑰和系統(tǒng)參數(shù)nT,(ns,α),并為每個參與方X制定一個惟一的可辨別名稱或識別串IX(如X的名稱和地址)。
(3) 終端的初始化。每個充當(dāng)A(終端)的參與方都隨機選擇一個整數(shù)a,1<a≤ns-2,并且計算其ElGamal簽名公鑰uA =αamodnS。A保密相應(yīng)的私鑰a,并將uA的一個可信副本傳送給T,通過帶外方式(安全信道或者是親自送交)來向T識別它自己。T生成公鑰證書并返回給A:certA=(IA, uA, GA)(此證書包含A的身份和ElGamal簽名公鑰 , 以 及 由GA=ST( IA, uA)=(h( IA, uA))dTmodnT 產(chǎn) 生 的T的RSA簽名GA)。
(4) 服務(wù)器端的初始化。每個充當(dāng)B(服務(wù)器)的參與方都產(chǎn)生一個加密私鑰和一個基于公開指數(shù)eB=3的RSA的相應(yīng)公鑰。B選擇一個公鑰模數(shù)nB,為兩個適當(dāng)?shù)拿孛芩財?shù)的乘積,并自己計算相應(yīng)的RSA私鑰dB。B將nB傳送給v,通過所謂的帶外(安全信道)方式來向T識別它自己。T產(chǎn)生公鑰證書并返回給B:certB=(IB,nB,GB)(此證書包含B的身份核RSA加密公鑰nB,以及由GA=ST(IA,uA)=(h(IA,uA))dTmodnT產(chǎn)生的T的RSA簽名GB)。
其中EK(y)表示使用密鑰K和算法E對y進(jìn)行對稱加密。PX(y)表示應(yīng)用X的公鑰函數(shù)對y加密后的結(jié)果。SX(y)表示應(yīng)用X的私鑰函數(shù)對y簽名后的結(jié)果。IX表示參與方X的一個識別串。h(y)表示y的雜湊,它與簽名方案一同使用。如果y=(y1,...,yn),則輸入為這多個值的級聯(lián)。
協(xié)議執(zhí)行過程如圖2所示。
圖2 Beller-Yacobi協(xié)議描述圖
可信服務(wù)器T負(fù)責(zé)分發(fā)統(tǒng)一的參數(shù),并且針對接收到的關(guān)于 A,B,產(chǎn)生相應(yīng)的簽名,然后發(fā)送相應(yīng)的公鑰證書??尚欧?wù)器T的所有操作都是該協(xié)議的系統(tǒng)設(shè)置準(zhǔn)備階段,也就是又可信第三方分發(fā)密鑰的階段,協(xié)議的關(guān)鍵在與A,B之間的信息交流,以達(dá)到傳送密鑰K的目的。每當(dāng)A,B要將信息傳送給對方的時候都要將由可信服務(wù)器T生成的公鑰認(rèn)證一并傳送,讓對方驗證自己的身份。其中 A使用ElGamal簽名用來產(chǎn)生會話密鑰K(協(xié)議傳輸對象)。而B對ElGamal簽名的認(rèn)證確定密鑰的來源,以及密鑰的正確性。
可信服務(wù)器T要進(jìn)行RSA公鑰的生成及生成公鑰認(rèn)證,那么就有必要了解一下RSA的算法原理和密鑰是如何生成的。
每個實體產(chǎn)生一個RSA公鑰以及一個相應(yīng)的私鑰。每個實體A執(zhí)行如下操作:
① 隨機生成兩個不同的大素數(shù)p和q。
② 計算n=pq和φ=(p-1)(q-1)。
③ 隨機選擇整數(shù)e,1<e<φ,使得gcd(e,φ)=1
④ 使用擴(kuò)展的歐幾里得算法計算滿足ed≡1modφ的惟一整數(shù)d,1<d<φ。
⑤A的公鑰為(n,e),私鑰為d。
RSA密鑰生成中的整數(shù)e,d分別稱為加密指數(shù)和解密指數(shù),n稱為模數(shù)。
B為A對消息m加密,A進(jìn)行解密。
(1) 加密,B執(zhí)行如下操作:
① 獲得A的可信公鑰(n,e)。
② 把消息表示成區(qū)間[0,n-1]內(nèi)的整數(shù)m。③ 計算c=memodn。
④ 將密文c發(fā)送給A。
(2) 解密,為了從c中恢復(fù)明文m,A執(zhí)行:用私鑰d恢復(fù)m=cdmodn。
實體A簽署消息m∈Μ。任何實體B都可驗證A的簽名,并從中恢復(fù)消息m。
(1) 簽名生成,實體A執(zhí)行如下操作:
① 計算取值在區(qū)間[0,n-1]內(nèi)的整數(shù)=R(m)。
② 計算s=modn。
③A對m的簽名s。
(2) 驗證,為驗證A的簽名s且恢復(fù)消息m,實體B應(yīng)當(dāng):
① 獲得A的可信公鑰(n,e)。
② 計算=semodn。
③ 驗證∈ΜR;否則拒絕接收簽名。
④ 恢復(fù)
簽名驗證可行性證明。若s是消息m的簽名,則有s=modn, 其 中=R(m)。 因 為ed≡1modφ, 故
(1) RSA公鑰產(chǎn)生
調(diào)用.NET環(huán)境下的類可直接產(chǎn)生由XML封裝的公鑰。將公鑰發(fā)給A,B,自己保留私鑰,用以后來的簽名和解密。代碼如下:
public void RSAKey(out string xmlKeys, out string xmlPublicKey)
{RSACryptoServiceProvider rsa = new RSACryptoService Provider();//初始化對象
xmlKeys=rsa.ToXmlString(true);//產(chǎn)生私鑰
xmlPublicKey=rsa.ToXmlString(false);//公鑰 }
RSA參數(shù)實際存儲在兩個字段中,一個是xmlKeys,存儲公開的RSA參數(shù),另一個是xmlPublicKey,存儲公開和私有的RSA參數(shù)。系統(tǒng)產(chǎn)生的公鑰和私鑰都由XML封裝,形式如:
由 (2) RSA公鑰加密 public string RSAEncrypt(string xmlPublicKey, string m_strEncryptString) {RSACryptoServiceProvider rsa = new RSACryptoService Provider();//產(chǎn)生對象 rsa.FromXmlString(xmlPublicKey); //初始化 PlainTextBArray = (new UnicodeEncoding()).GetBytes(m_strEncryptString);//轉(zhuǎn)字節(jié)序列 CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);//加密 Result = Convert.ToBase64String(CypherTextBArray);return Result; } 算法將所要機密的明文字符串轉(zhuǎn)換成一個字節(jié)序列,存儲在PlainTextBArray中。再調(diào)用RSA類的Encrypt方法對經(jīng)過處理的密文進(jìn)行加密,以字符串的類型返回。 (3) RSA簽名 RSA簽名需要關(guān)鍵的兩個步驟,求哈希(雜湊)值和簽名。下面是GetHash實現(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);//計算Hash值 strHashData = Convert.ToBase64String(HashData); return true; } 這里首先對要求哈希值的字符串進(jìn)行處理,轉(zhuǎn)換成字節(jié)序列,然后計算指定字節(jié)數(shù)組的哈希值,最后將哈希值以字符串的形式輸出。獲得哈希描述后,對該哈希值進(jìn)行簽名。代碼如下: public bool SignatureFormatter(string p_strKeyPrivate, byte[]HashbyteSignature, ref byte[] EncryptedSignatureData) { RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider(); RSA.FromXmlString(p_strKeyPrivate);//用已有的私鑰初始化對象 SignatureFormatter RSAFormatter = new SignatureFormatter(RSA); RSAFormatter.SetHashAlgorithm("MD5");//得到Hash算法 EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);//產(chǎn)生簽名 return true; } 首先用之前產(chǎn)生的公鑰進(jìn)行初始化,然后將簽名的算法設(shè)置為 MD5,最后對之前求得的哈希值進(jìn)行簽名。有關(guān)ElGamal簽名和DES對稱加密方法在系統(tǒng)中也實現(xiàn)了,篇幅原因這里不再贅述。 首先由可信服務(wù)器T產(chǎn)生各個參數(shù),如圖3。公鑰(nt,e)顯示的是系統(tǒng)產(chǎn)生的RSA公鑰,ElGamal參數(shù)是由系統(tǒng)產(chǎn)生的一個隨機大素數(shù)及其本原根。隨后,將參數(shù)發(fā)送給A,B,兩方接收并存儲參數(shù),以備后用。 圖3 可信服務(wù)器T的系統(tǒng)設(shè)置 接著,終端A和可信服務(wù)器B產(chǎn)生各自的識別串和參數(shù),然后傳送給可信服務(wù)器T。如圖4所示,Ib為B的識別串,nb是可信服務(wù)器用于RSA加密的公鑰。 終端A的系統(tǒng)設(shè)置與B類似,不在贅述。A和B設(shè)置后,可信服務(wù)器T接收A,B的參數(shù),通過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)生一個隨機數(shù)發(fā)送給終端A,發(fā)送的同時將準(zhǔn)備階段時T產(chǎn)生的公鑰認(rèn)證一起發(fā)送,用于A方對于信息來源的檢測。如圖5所示,終端A通過RSA認(rèn)證,來檢驗來自B方的信息。 圖5 終端A認(rèn)證信息 認(rèn)證成功之后,終端 A計算其 ElGamal簽名,并和 A的公鑰認(rèn)證一同發(fā)送給 B。發(fā)送前首先對簽名進(jìn)行相應(yīng)的RSA公鑰加密,以及DES對稱加密。由此,B方首先接收到的是加密之后的簽名以及認(rèn)證,然后B方再對加密結(jié)果進(jìn)行解密,最后便是服務(wù)器端B對來自A的信息的認(rèn)證,如圖6所示。 圖6 服務(wù)器B的最終驗證結(jié)果 認(rèn)證中首先進(jìn)行公鑰認(rèn)證,通過RSA認(rèn)證來檢驗信息的來源,而后是ElGamal認(rèn)證,認(rèn)證傳輸?shù)拿荑€K的真確性,兩者均驗證成功才能說明協(xié)議執(zhí)行成功。 本文分析了Beller-Yacobi協(xié)議的每一個步驟以及所涉及的加密、簽名算法。并以RSA加密算法及簽名算法為例做了詳細(xì)的介紹,并用C# 語言在.NET平臺下編寫了相應(yīng)的算法程序,實現(xiàn)了整個Beller-Yacobi密鑰傳輸協(xié)議的過程。 [1] 徐勝波,武傳坤,王新梅.移動通信網(wǎng)中的認(rèn)證與密鑰分配[J].電子學(xué)報.1996. [2] Alfred J.Menezes, PaulC.van Oorschot, Scott A.Vanstone著,胡磊,王鵬譯.應(yīng)用密碼學(xué)手冊[M].北京:電子工業(yè)出版社.2005. [3] 王亞弟,束妮娜,韓繼紅編著.密碼協(xié)議形式化分析[M].北京:機械工業(yè)出版社.2006.3 系統(tǒng)運行和測試
3.1 系統(tǒng)設(shè)置階段
3.2 協(xié)議執(zhí)行階段
4 總結(jié)