假定A和B都是網絡中的成員,針對特定的數字簽名算法,每個參與者都有相應的公鑰和私鑰。在這種環境中,總是需要提供壹種裝置來證實網絡中其他用戶的公鑰,這就需要某種公鑰基礎設施(PKI)。總之,假定有壹個可信的授權機構(Trust Authenticator, TA),由它來簽署網絡中所有用戶的公鑰,所有用戶都知道TA的公開驗證密鑰VerTA。
Schnorr身份識別協議就是基於數字簽名的協議,融合了幾種身份識別協議的思想,主要有ElGamal簽名算法、Fiat-Shamir身份識別協議和Chaum-Evertse-Van de Graff交互式協議等,其安全性建立在離散對數問題的困難性之上。
Schnorr身份識別協議需要壹個可信中心,記為TA。TA選擇下列參數。
p是壹個大素數(p>21024),在Z*p上計算離散對數是困難的。q是壹個大素數(q>2160),並且q|(p–1)。a∈Z*p,階為q(如可取a=g(p-1)/q,g為Zp的本原元)。壹個安全參數t,2t<q(對大多數應用來說,取t=40將已提供足夠的安全性,為了更高的安全性,Schnorr建議使用t=72)。TA選擇壹個安全的簽名方案,記簽名算法為SigTA,驗證算法為VerTA。選定壹個安全的Hash函數。所有的信息在簽名之前先進行Hash,為了便於閱讀,在描述協議時將略去Hash這壹步。
參數p、q、a、VerTA和Hash函數都是公開的。
TA給每個用戶頒布壹個證書。當A想從TA那裏獲得證書時,A和TA執行下列協議。TA給申請者A建立並頒布壹個標識串ID(A),ID(A)包含A的足夠多的信息,如姓名、性別、生日、職業、電話號碼等識別信息、A秘密地選擇壹個隨機指數a, 0≤a≤q–1,計算v=a-a mod p並將v發送給TA。TA對(ID(A),v)簽名,s=SigTA(ID(A),v)。TA將證書C(A)= (ID(A),v,s)發送給A。
證明者A向驗證者B證明他的身份的協議,即Schnorr身份識別協議可描述如下。
A隨機選擇壹個數k,0≤k≤q–1,計算γ=ak mod p。A把他的證書C(A)= (ID(A),v,s)和γ發送給B。B通過檢查VerTA(ID(A),v,s)是否為真來驗證TA的簽名。B隨機選擇壹個數r,1≤r≤2t,並將r發送給A。A計算y=(k+ar) mod q,並將y發送給B。B通過驗證γ=ayvrmod p是否成立來識別A,只要等式成立,B就承認A的身份。
下面首先對Schnorr協議做壹些解釋。第1步可進行預處理,即在B出現之前完成。設置安全參數t的目的是阻止冒充者C偽裝成A猜測B的挑戰r。因為如果t不夠大,C有可能事先猜測到r的正確值,那麽C在第1步任取y,計算γ=ayvrmod p,當他收到B發送來的挑戰r時,他將已選好的y提供給B,那麽y和γ必能通過第6步B的驗證。將把γ發送給B,如果B隨機的猜測r,那麽C能猜中的概率是2-t。這樣對大部分應用來說,t=40將是壹個合理的選擇。
簽名s用來證明A的證書的合法性。當B驗證了TA對A的證書的簽名,他自己就相信證書本身是真實的。A秘密選擇的值a功能上類似於個人識別號PIN,它使B相信完成識別協議的的確是A。但它與PIN有本質的差別:在識別協議中,a的值壹直沒有被泄漏。而是A(更精確的說是A的智能卡)向B證明他知道a的值。這壹證明過程在識別協議的第5步完成,它通過A計算值y,以便響應B的挑戰完成。
現在來看Schnorr協議的安全性。
首先,冒充者C通過偽造壹個證書Cˊ(A)= (ID(A),vˊ,sˊ),v≠vˊ,來模仿A是難以成功的,因為這裏的sˊ必須是TA對(ID(A),vˊ)的簽名,才能通過協議第3步中B的驗證。但只要TA的簽名方案是安全的,C就不能偽造TA的這個簽名sˊ。
其次,C改用A的正確證書C(A)= (ID(A),v,s)(證書不保密,是公開的)來模仿A也是難以成功的。因為此時他必須猜出A的密鑰a,才能在第5步計算出y=(k+ar) mod q來響應B的挑戰r。但是求a涉及離散對數問題,而已經假定Zp上計算離散對數不可行。
盡管如此,到目前為止,仍然沒有證明Schnorr協議是安全的。
Schnorr識別協議從計算量和需要交換的信息量兩方面來看都是很快和有效的。它也極小化了A需要完成的計算量。這事考慮到在實際應用中,A的計算將由壹個低計算能力的Smart卡來完成,而B的計算將由壹個具有較強計算能力的計算機來完成。
(轉載前請告知)