鄧 健,鄭林華
(國防科學(xué)技術(shù)大學(xué),長沙410073)
流密碼[1]也稱序列密碼,它是對稱密碼算法的一種,具有長度可靈活變化,加解密速度快、復(fù)雜度低的特點。流密碼采用逐個字符加解密的策略,不需要緩存,同步流密碼還可以實現(xiàn)無錯誤擴散[2]。在高保密強度要求的場合,核心密多采用“一次一密”的流密碼體制。
流密碼的設(shè)計通常采用多重密鑰、多重環(huán)節(jié)、多重安全措施等技術(shù)[3],達到“一次一密”、最終靠密鑰保密的目標(biāo)。鑒于流密碼系統(tǒng)存在多重相似運算過程,在核心部分——密鑰生成器設(shè)計可以采用模塊化復(fù)用的設(shè)計方法,通過程序共用、時分復(fù)用,實現(xiàn)精簡程序、節(jié)省芯片資源、降低功耗。
流密碼加解密系統(tǒng)通常由密鑰管理模塊、密鑰流發(fā)生器和流密碼的加解密運算模塊組成。在文獻[4]中采用了一種Geffe發(fā)生器串接單向陷門的Hash函數(shù)的方式,如圖1所示,生成超長周期的偽隨機序列,密鑰的強度依賴于Hash函數(shù),使通過最終輸出的流密碼碼字逆向得到Geffe發(fā)生器的內(nèi)部狀態(tài)的難度大大增加,從而保證了此密鑰流發(fā)生器的安全性。文獻[4]中提到可采用多組Geffe序列生成器并行來提高Geffe發(fā)生器的輸出速度,但我們在實際設(shè)計中發(fā)現(xiàn)組數(shù)過多則大大增加運算復(fù)雜度,密鑰強度降低[5],本文采用2組數(shù)Geffe發(fā)生器并行結(jié)構(gòu),獲得了較好的效果。
圖1 密鑰生成基本流程
初始密鑰經(jīng)過運算產(chǎn)生數(shù)據(jù)密鑰,數(shù)據(jù)密鑰發(fā)生器輸出生成密鑰流,數(shù)據(jù)密鑰即時產(chǎn)生即時銷毀。為了提高密鑰安全性和破解難度,通常選取舍棄若干長度密鑰流序列。隨機數(shù)可以稱為公鑰,由加密系統(tǒng)隨加密數(shù)據(jù)幀傳遞給解密系統(tǒng),為驗證隨機數(shù)的正確性,加密系統(tǒng)會將摘要隨隨機數(shù)同時傳遞給解密系統(tǒng),解密系統(tǒng)根據(jù)接收到的隨機數(shù)與預(yù)置的種子密鑰產(chǎn)生本地摘要,并與接收到的摘要進行對比,以確認(rèn)隨機數(shù)的正確與否。摘要由初始密鑰確定,對初始密鑰通過Hash函數(shù)而產(chǎn)生。
采用二級密鑰模式——即種子密鑰和數(shù)據(jù)密鑰,對密鑰進行管理。其中,數(shù)據(jù)密鑰即上文所說的密鑰流發(fā)生器的輸出密鑰,一般在每次通信時臨時產(chǎn)生,通信結(jié)束后被銷毀。種子密鑰是初始密鑰的加密密鑰,在通信前通過安全渠道共同確定,并長時間存在??紤]到硬件實現(xiàn)過程中的通用性,由種子密鑰產(chǎn)生初始密鑰的方式如圖2所示。
圖2 初始密鑰生成方法
其中,隨機數(shù)是打包在加密流中傳輸給解碼端的,解碼端得到此實時采集的隨機數(shù)之后,通過上述運算得到數(shù)據(jù)密鑰,由此完成數(shù)據(jù)密鑰的交換。這種方式的采用,將為下一步設(shè)計工作中實現(xiàn)模塊復(fù)用、節(jié)約資源提供了可能。
流密碼系統(tǒng)僅需密鑰保密,一個流密碼是否具有很高的密碼強度主要取決于密鑰流生成器的設(shè)計,因此密鑰流產(chǎn)生器是加解密系統(tǒng)的核心。
在流密碼系統(tǒng)中,加解密系統(tǒng)的諸多環(huán)節(jié),如初始密鑰生成、摘要生成、密鑰流產(chǎn)生等,若要針對不同功能分別編寫各自的程序代碼,將會占用大量的Slice資源,造成FPGA資源的極大浪費,不便于控制成本。上述環(huán)節(jié)均采用同樣的Geffe和Hash函數(shù),實現(xiàn)過程則會非常相似,方案就可以采用模塊化設(shè)計思想,將相近的措施和環(huán)節(jié)模塊化,利用狀態(tài)機來實現(xiàn)各個模塊之間的狀態(tài)轉(zhuǎn)換和進程控制,以實現(xiàn)這些功能模塊的統(tǒng)一處理,從而提高硬件資源的利用率。
密鑰生成控制模塊為密鑰生成模塊提供輸入接口和狀態(tài)控制,包括初始密鑰生成、初始密鑰滾動、密鑰舍棄、摘要生成和密鑰流產(chǎn)生等工作,以狀態(tài)機的形式來描述和實現(xiàn),如圖3所示。
密鑰生成控制模塊的狀態(tài)機共包括5種狀態(tài),其中狀態(tài)4為空閑狀態(tài),狀態(tài)0是初始密鑰生成狀態(tài),狀態(tài)1是密鑰舍棄狀態(tài),狀態(tài)2是密鑰產(chǎn)生狀態(tài),狀態(tài)3是摘要生成狀態(tài)。
當(dāng)沒有任何外部激勵信號或者密鑰生成模塊停止工作的時候,處于空閑狀態(tài),而一旦接收到外部激勵信號,立即轉(zhuǎn)入相應(yīng)的狀態(tài)處理程序。
當(dāng)種子密鑰和隨機數(shù)準(zhǔn)備好,并接到生成初始密鑰的通知(EncPrmKeyEn=1)時,密鑰生成控制模塊由空閑狀態(tài)轉(zhuǎn)入狀態(tài)0,啟用初始密鑰生成功能,當(dāng)初始密鑰生成完畢后,立即轉(zhuǎn)入狀態(tài)1,密鑰舍棄功能啟動,密鑰舍棄完畢后,發(fā)出工作完成標(biāo)志(KeyStrmOV=1),通知狀態(tài)機重新進入空閑狀態(tài)。
當(dāng)密鑰生成控制模塊接收到生成摘要的通知后(AbstGenDe=1),即刻轉(zhuǎn)入狀態(tài)3,摘要生成功能生效,當(dāng)摘要生成完畢,發(fā)出結(jié)束標(biāo)志(KeyStrmOV=1),通知密鑰生成控制模塊摘要已生成,可以轉(zhuǎn)入空閑等待狀態(tài)。
當(dāng)外部激勵信號變成密鑰生成的通知(EncK-eyGenEn=1)時,密鑰生成控制模塊由空閑狀態(tài)轉(zhuǎn)入狀態(tài)2,進入密鑰生成模塊的密鑰產(chǎn)生功能,生成完一組密鑰后,同樣會使密鑰生成控制模塊轉(zhuǎn)入空閑狀態(tài)。
密鑰生成模塊實現(xiàn)的功能包括初始密鑰生成、初始密鑰滾動、摘要生成、密鑰生成和密鑰舍棄。借鑒高級編程語言中的函數(shù)共用思想,將密鑰生成模塊劃分為復(fù)位子模塊、初始化子模塊、Geffe子模塊和Hash函數(shù)模塊四個部分,如圖4所示。
在密鑰生成模塊使能信號無效,即密鑰生成控制模塊處于空閑狀態(tài)時,密鑰生成模塊一直處于復(fù)位狀態(tài),模塊的各參數(shù)均被恢復(fù)為初始值,此即為復(fù)位子模塊;一旦密鑰控制模塊處于非空閑狀態(tài)時,首先會進入初始化子模塊,該模塊會根據(jù)接收狀態(tài)的不同對模塊的各參數(shù)實施不同的初始化,包括根據(jù)隨機數(shù)和種子密鑰初始化初始密鑰發(fā)生器的Geffe中各m序列發(fā)生器的狀態(tài)和本征多項式,或根據(jù)初始密鑰來初始化密鑰流發(fā)生器的Geffe,或讀取密鑰流發(fā)生器上一次的Geffe狀態(tài)和本征來初始化Geffe,或讀取初始密鑰初始化Hash函數(shù)的輸入,以及Geffe子模塊和Hash函數(shù)中所使用到的各寄存器等等。初始化過程完畢后,Geffe子模塊啟動(生成摘要時,將跳過Geffe子模塊直接進入Hash函數(shù)子模塊),生成啟動Hash函數(shù)子模塊所需要的輸入數(shù)據(jù),并在Geffe子模塊停止工作時存儲Geffe的最終狀態(tài)和本征多項式以便下次啟動Geffe時能夠正確實施初始化。一旦Geffe子模塊輸出Hash函數(shù)所需要的數(shù)據(jù),Hash函數(shù)子模塊即可被啟動(當(dāng)接收狀態(tài)為密鑰舍棄時,無需再啟動Hash函數(shù),可以直接退出),根據(jù)接收狀態(tài)的不同,生成初始密鑰、摘要或者數(shù)據(jù)密鑰,并存儲到不同的存儲區(qū)域,以用于Geffe初始化、摘要驗證和數(shù)據(jù)加解密。
圖4 密鑰生成模塊流程簡圖
在進入狀態(tài)3時,啟動摘要生成功能,若初始密鑰比特數(shù)不足啟動Hash函數(shù)需要的輸入長度h,則必須對初始密鑰進行擴展至h。
對于Hash函數(shù)子模塊的實現(xiàn),可采用流水操作[6]。如果采用串行方案,需要時鐘通常會超過Geffe的主時鐘總數(shù)g,造成Hash函數(shù)無法與Geffe同步運行。如果Geffe和Hash函數(shù)串行運行,產(chǎn)生一幀明文/密文數(shù)據(jù)的密鑰所需要的時鐘往往會遠(yuǎn)大于一幀數(shù)據(jù)所占用的主時鐘個數(shù),無法實施密鑰的生成。Hash函數(shù)一般是將給定的輸入m分成若干個分組{m1,m2,…mk},并以迭代的方式,逐組處理[7],因此可以考慮采用流水操作來減少Hash函數(shù)子模塊的運算時間。以Hash函數(shù)采用MD5為例,對于MD5子模塊的實現(xiàn),采用流水操作便可滿足上述條件。
圖5 MD5內(nèi)部運算流水操作過程
設(shè)密鑰生成模塊最開始有n個主時鐘的初始化過程,Geffe串行連續(xù)運行g(shù)次,Geffe每運行一次就啟動一次Hash函數(shù)(摘要生成和密鑰舍棄除外),Hash函數(shù)隨下一個Geffe同時啟動。這使Hash函數(shù)的運行時間要小于一次Geffe的運行時間,因此Hash函數(shù)可以與Geffe并行工作而不會影響下一次的Hash函數(shù)運行,而且每次Hash函數(shù)結(jié)束后會有若干個主時鐘來完成Hash函數(shù)運算結(jié)果的存儲工作。當(dāng)g次Geffe運行完畢后,緊接著是若干個主時鐘的Geffe存儲工作,而最后一次Hash函數(shù)也隨Geffe存儲工作的開始而開始。這種時序關(guān)系能有效避免Geffe的等待,提高工作效率。
在該流密碼加解密系統(tǒng)中,在對核心部分—密鑰生成器進行實現(xiàn)時,充分運用模塊化復(fù)用思想,通過函數(shù)體共用、時分復(fù)用和流水操作等方法,使程序設(shè)計得到了精簡,程序的可移植性增強,減少了硬件資源占用,有效降低了功耗,在實際應(yīng)用中效果明顯。
[1]丁存生,肖國鎮(zhèn).流密碼及其應(yīng)用[M].北京:國防工業(yè)出版社,1994.
[2]羅啟彬,張健.流密碼的現(xiàn)狀和發(fā)展[J].信息與電子工程學(xué)報,2006,1(4):75 -80.
[3]Rueppel R A.Good Stream Cipher Are Hard To Design[A].Proceedings of International Carnahan Conference on Security Technology[C].1989:163 -174.
[4]雷彥云,林嘉宇.基于流密碼的數(shù)據(jù)加解密系統(tǒng)設(shè)計[J].科技信息,2008(27):75 -57.
[5]Thiegenthaler T.Decrypting a class ofstream ciphers using ciphertext only[J].IEEE Trand.Computers,1985,C - 34(1):81-85.
[6]GUNOK J,PEREPELITSA V,SOBELMAN GE.Time borrowing in High-speed functional units using skew-tolerant domino circuits[A].The 2000 IEEE International Symposium on Circuits and Sys- terns,ISCAS 2000[C].Geneva,2001.
[7]宋震.密碼學(xué)[M].北京:中國水利水電出版社,2002.