鄧 健,鄭林華
(國防科學技術大學,長沙410073)
流密碼[1]也稱序列密碼,它是對稱密碼算法的一種,具有長度可靈活變化,加解密速度快、復雜度低的特點。流密碼采用逐個字符加解密的策略,不需要緩存,同步流密碼還可以實現無錯誤擴散[2]。在高保密強度要求的場合,核心密多采用“一次一密”的流密碼體制。
流密碼的設計通常采用多重密鑰、多重環節、多重安全措施等技術[3],達到“一次一密”、最終靠密鑰保密的目標。鑒于流密碼系統存在多重相似運算過程,在核心部分——密鑰生成器設計可以采用模塊化復用的設計方法,通過程序共用、時分復用,實現精簡程序、節省芯片資源、降低功耗。
流密碼加解密系統通常由密鑰管理模塊、密鑰流發生器和流密碼的加解密運算模塊組成。在文獻[4]中采用了一種Geffe發生器串接單向陷門的Hash函數的方式,如圖1所示,生成超長周期的偽隨機序列,密鑰的強度依賴于Hash函數,使通過最終輸出的流密碼碼字逆向得到Geffe發生器的內部狀態的難度大大增加,從而保證了此密鑰流發生器的安全性。文獻[4]中提到可采用多組Geffe序列生成器并行來提高Geffe發生器的輸出速度,但我們在實際設計中發現組數過多則大大增加運算復雜度,密鑰強度降低[5],本文采用2組數Geffe發生器并行結構,獲得了較好的效果。

圖1 密鑰生成基本流程
初始密鑰經過運算產生數據密鑰,數據密鑰發生器輸出生成密鑰流,數據密鑰即時產生即時銷毀。為了提高密鑰安全性和破解難度,通常選取舍棄若干長度密鑰流序列。隨機數可以稱為公鑰,由加密系統隨加密數據幀傳遞給解密系統,為驗證隨機數的正確性,加密系統會將摘要隨隨機數同時傳遞給解密系統,解密系統根據接收到的隨機數與預置的種子密鑰產生本地摘要,并與接收到的摘要進行對比,以確認隨機數的正確與否。摘要由初始密鑰確定,對初始密鑰通過Hash函數而產生。
采用二級密鑰模式——即種子密鑰和數據密鑰,對密鑰進行管理。其中,數據密鑰即上文所說的密鑰流發生器的輸出密鑰,一般在每次通信時臨時產生,通信結束后被銷毀。種子密鑰是初始密鑰的加密密鑰,在通信前通過安全渠道共同確定,并長時間存在。考慮到硬件實現過程中的通用性,由種子密鑰產生初始密鑰的方式如圖2所示。

圖2 初始密鑰生成方法
其中,隨機數是打包在加密流中傳輸給解碼端的,解碼端得到此實時采集的隨機數之后,通過上述運算得到數據密鑰,由此完成數據密鑰的交換。這種方式的采用,將為下一步設計工作中實現模塊復用、節約資源提供了可能。
流密碼系統僅需密鑰保密,一個流密碼是否具有很高的密碼強度主要取決于密鑰流生成器的設計,因此密鑰流產生器是加解密系統的核心。
在流密碼系統中,加解密系統的諸多環節,如初始密鑰生成、摘要生成、密鑰流產生等,若要針對不同功能分別編寫各自的程序代碼,將會占用大量的Slice資源,造成FPGA資源的極大浪費,不便于控制成本。上述環節均采用同樣的Geffe和Hash函數,實現過程則會非常相似,方案就可以采用模塊化設計思想,將相近的措施和環節模塊化,利用狀態機來實現各個模塊之間的狀態轉換和進程控制,以實現這些功能模塊的統一處理,從而提高硬件資源的利用率。
密鑰生成控制模塊為密鑰生成模塊提供輸入接口和狀態控制,包括初始密鑰生成、初始密鑰滾動、密鑰舍棄、摘要生成和密鑰流產生等工作,以狀態機的形式來描述和實現,如圖3所示。
密鑰生成控制模塊的狀態機共包括5種狀態,其中狀態4為空閑狀態,狀態0是初始密鑰生成狀態,狀態1是密鑰舍棄狀態,狀態2是密鑰產生狀態,狀態3是摘要生成狀態。

當沒有任何外部激勵信號或者密鑰生成模塊停止工作的時候,處于空閑狀態,而一旦接收到外部激勵信號,立即轉入相應的狀態處理程序。
當種子密鑰和隨機數準備好,并接到生成初始密鑰的通知(EncPrmKeyEn=1)時,密鑰生成控制模塊由空閑狀態轉入狀態0,啟用初始密鑰生成功能,當初始密鑰生成完畢后,立即轉入狀態1,密鑰舍棄功能啟動,密鑰舍棄完畢后,發出工作完成標志(KeyStrmOV=1),通知狀態機重新進入空閑狀態。
當密鑰生成控制模塊接收到生成摘要的通知后(AbstGenDe=1),即刻轉入狀態3,摘要生成功能生效,當摘要生成完畢,發出結束標志(KeyStrmOV=1),通知密鑰生成控制模塊摘要已生成,可以轉入空閑等待狀態。
當外部激勵信號變成密鑰生成的通知(EncK-eyGenEn=1)時,密鑰生成控制模塊由空閑狀態轉入狀態2,進入密鑰生成模塊的密鑰產生功能,生成完一組密鑰后,同樣會使密鑰生成控制模塊轉入空閑狀態。
密鑰生成模塊實現的功能包括初始密鑰生成、初始密鑰滾動、摘要生成、密鑰生成和密鑰舍棄。借鑒高級編程語言中的函數共用思想,將密鑰生成模塊劃分為復位子模塊、初始化子模塊、Geffe子模塊和Hash函數模塊四個部分,如圖4所示。
在密鑰生成模塊使能信號無效,即密鑰生成控制模塊處于空閑狀態時,密鑰生成模塊一直處于復位狀態,模塊的各參數均被恢復為初始值,此即為復位子模塊;一旦密鑰控制模塊處于非空閑狀態時,首先會進入初始化子模塊,該模塊會根據接收狀態的不同對模塊的各參數實施不同的初始化,包括根據隨機數和種子密鑰初始化初始密鑰發生器的Geffe中各m序列發生器的狀態和本征多項式,或根據初始密鑰來初始化密鑰流發生器的Geffe,或讀取密鑰流發生器上一次的Geffe狀態和本征來初始化Geffe,或讀取初始密鑰初始化Hash函數的輸入,以及Geffe子模塊和Hash函數中所使用到的各寄存器等等。初始化過程完畢后,Geffe子模塊啟動(生成摘要時,將跳過Geffe子模塊直接進入Hash函數子模塊),生成啟動Hash函數子模塊所需要的輸入數據,并在Geffe子模塊停止工作時存儲Geffe的最終狀態和本征多項式以便下次啟動Geffe時能夠正確實施初始化。一旦Geffe子模塊輸出Hash函數所需要的數據,Hash函數子模塊即可被啟動(當接收狀態為密鑰舍棄時,無需再啟動Hash函數,可以直接退出),根據接收狀態的不同,生成初始密鑰、摘要或者數據密鑰,并存儲到不同的存儲區域,以用于Geffe初始化、摘要驗證和數據加解密。

圖4 密鑰生成模塊流程簡圖
在進入狀態3時,啟動摘要生成功能,若初始密鑰比特數不足啟動Hash函數需要的輸入長度h,則必須對初始密鑰進行擴展至h。
對于Hash函數子模塊的實現,可采用流水操作[6]。如果采用串行方案,需要時鐘通常會超過Geffe的主時鐘總數g,造成Hash函數無法與Geffe同步運行。如果Geffe和Hash函數串行運行,產生一幀明文/密文數據的密鑰所需要的時鐘往往會遠大于一幀數據所占用的主時鐘個數,無法實施密鑰的生成。Hash函數一般是將給定的輸入m分成若干個分組{m1,m2,…mk},并以迭代的方式,逐組處理[7],因此可以考慮采用流水操作來減少Hash函數子模塊的運算時間。以Hash函數采用MD5為例,對于MD5子模塊的實現,采用流水操作便可滿足上述條件。

圖5 MD5內部運算流水操作過程
設密鑰生成模塊最開始有n個主時鐘的初始化過程,Geffe串行連續運行g次,Geffe每運行一次就啟動一次Hash函數(摘要生成和密鑰舍棄除外),Hash函數隨下一個Geffe同時啟動。這使Hash函數的運行時間要小于一次Geffe的運行時間,因此Hash函數可以與Geffe并行工作而不會影響下一次的Hash函數運行,而且每次Hash函數結束后會有若干個主時鐘來完成Hash函數運算結果的存儲工作。當g次Geffe運行完畢后,緊接著是若干個主時鐘的Geffe存儲工作,而最后一次Hash函數也隨Geffe存儲工作的開始而開始。這種時序關系能有效避免Geffe的等待,提高工作效率。
在該流密碼加解密系統中,在對核心部分—密鑰生成器進行實現時,充分運用模塊化復用思想,通過函數體共用、時分復用和流水操作等方法,使程序設計得到了精簡,程序的可移植性增強,減少了硬件資源占用,有效降低了功耗,在實際應用中效果明顯。
[1]丁存生,肖國鎮.流密碼及其應用[M].北京:國防工業出版社,1994.
[2]羅啟彬,張健.流密碼的現狀和發展[J].信息與電子工程學報,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]雷彥云,林嘉宇.基于流密碼的數據加解密系統設計[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]宋震.密碼學[M].北京:中國水利水電出版社,2002.