劉程遠
(深圳中電長城信息安全系統(tǒng)有限公司,廣東 深圳 518057)
在加密通信中,單密鑰密碼被廣泛應用于一對一的雙邊通信中。在單密鑰密碼中,通信雙方使用同一密鑰進行加密與解密,即加密運算與解密運算互為逆運算,雙方必須持有同一密鑰,并保守秘密。流密碼作為一種單密碼體制密碼,它與傳統(tǒng)單密鑰密碼最大的不同點是不使用固定密鑰,而是使用不斷變化的密鑰流進行加密與解密,通信雙方只需商議初始密鑰,然后根據(jù)相同的密鑰流生成算法,生成隨機性強、不可預測性強且相同的密鑰流即可,避免了密鑰在公網(wǎng)上傳輸?shù)娘L險。流密碼有著實現(xiàn)簡單、速度快、方便軟件和硬件實現(xiàn)、密鑰管理安全性高等優(yōu)點。本文將介紹基于RC4算法的密碼體制實現(xiàn)原理和實現(xiàn)方法。
流密碼是密碼體制中的重要一支,也是手工和機械密碼時代的主流。20世紀50年代以來,由于數(shù)字電子技術的發(fā)展,使密鑰流可以方便地利用以位移寄存器為基礎的電路來產(chǎn)生,促進了線性和非線性移位寄存器理論的迅速發(fā)展。代數(shù)和譜分析等數(shù)學工具的引入,使得流密碼理論迅速發(fā)展并走向較成熟的階段。由于具有實現(xiàn)簡單和速度快的優(yōu)勢,以及在通信傳播中幾乎沒有或只有有限的錯誤,因此流密碼在實際應用中,特別是在專用機和機密機構中仍保持優(yōu)勢[1]。
流密碼目前沒有標準化的算法,大多數(shù)流密碼是以硬件為基礎實現(xiàn)的專用算法,例如銀行產(chǎn)品的中銀e令等。
流密碼的最大特點是采用由非固定的不斷變化的密鑰組成的密鑰序列,稱為密鑰流。加密時,信息發(fā)送者將明文劃分成字符或數(shù)據(jù)位,分別與密鑰流進行加密運算;解密者以同樣的密鑰流生成器產(chǎn)生的同樣密鑰流與密文參與解密運算。流密碼強度完全依賴于密鑰流生成器產(chǎn)生序列的隨機性和不可預測性[2]?;究驁D如圖1所示。
圖1 流密碼原理框架
圖1中k0表示初始密鑰,KG表示密鑰生成器,mi表示明文流,ci表示密文流,Eki(mi)表示加密或解密算法,通信雙方通過安全信道交換初始密鑰后,通過密鑰生成器生成密鑰流,密鑰流與明文流通過加密算法生成密文流,密文通過不安全信道傳輸?shù)浇邮辗?,接收方用同樣的密鑰與密文進行解密運算,輸出明文,通信成功[3]。
根據(jù)密鑰的不同,流密鑰可以分為同步流密鑰和自同步流密鑰。
基于同步流密碼的流密鑰獨立于明文,相同的明文隨著密鑰的不同而被加密成不同的密文字符。此類密碼只要通信雙方密鑰流生成器的初始密鑰相同就可以生成相同的密鑰。通信雙方保持精確同步地更新密鑰流才能保證密碼系統(tǒng)正常工作,一旦失去同步就不能正確解密,必須恢復同步才能工作,這是同步流密碼最大的缺點。但是由于其對失步的敏感性,使得系統(tǒng)對竄擾者的注入、刪除、重放等主動攻擊也很敏感,有利于檢測。同步流密碼在失步后如何重新同步是一個重要問題,處理不好將嚴重影響安全性。
基于自同步流密碼的流密鑰在失去同步后能自行恢復同步。如圖2所示,其密文ci不僅與當前明文mi有關,還與歷史明文m1,m2,……mi-1有關,一般在有限的n級存儲下,每個密文字符將影響以后n個輸入明文字符的加密結果。密鑰流可表示為
ki=f(k1,ci-n,ci-n+1,……,ci-1)
由于密文ci與明文mi的一對一映射關系,密鑰ki最終受到所有n個輸入明文的影響。
圖2 自同步流密鑰
自同步流密碼傳輸過程中有一位出錯,它將在n級移存器中存活n個周期,繼而影響其后n位密鑰的正確性。但是只要繼續(xù)接收正確信息,在n位正確密文以后,通信雙方又會產(chǎn)生相同的密鑰。因此,它具有自同步能力。
RC4是RSA公司提出的密鑰長度可變流密碼,是一種同步流密鑰。該算法利用8×8的S盒,在變長密鑰控制下對0~255的數(shù)進行置換,通過一系列非線性運算生成密鑰序列,具體算法如下:
初始化盒子S0~ S255:
i=(i+1) mod 256
j=(j+Si) mod 256
互換Si與Sj:
t=(Si+Sj) mod 256
K=St
ci=K⊕mi
i和j初始為0,Si,Sj表示第i和第j個S盒子,K為產(chǎn)生的隨機字節(jié),K與明文異或即可得到密文,與密文異或即可得到明文。
RC4算法對差分攻擊和線性攻擊具有免疫力,這是因為它采用了高度非線性算法。RC4算法有256個S盒,初始化時首先將0~255依次填入所有S盒,然后將密鑰填入另一個256字節(jié)的陣列(密鑰長度不足則循環(huán)填入),S盒記為S0~S255密鑰陣列記為k0~k255,然后從i=0開始循環(huán)256次,取j初值為0,循環(huán)計算j=(j+Si+Sj)mod 256,并互換Si和Sj的位置,直至i=255。因此它大約有256!×2562=21 700種可能的狀態(tài)。各S盒在i和j的控制下進行卷入加密。指標i保證每個元素變化,指標j保證元素的隨機改變。該算法簡單明了,易于實現(xiàn),速度快。關于RC4的攻擊方法的文獻有許多,但主要針對弱密鑰攻擊,目前沒有查明哪種方法能有效攻擊足夠長密鑰(128 bit或以上)的RC4。
RC4流密碼適用于一對一的通信。如圖3所示,公司某項目需要在Web服務器和app服務器之間設計一個密碼系統(tǒng)在內網(wǎng)進行通信。
圖3 應用場景
該密碼體制具體需求有:使用AES密碼系統(tǒng)通信作為基礎;在AES基礎上進行安全加固;對信道攻擊(竊聽、干擾、重放、偽造)敏感,有恢復能力;AES是一種單密鑰密碼,相關內容在此不做贅述。
考慮到安全需求,同時使用了AES與RC4兩種密碼體制,64 bit RC4提供密鑰流,128 bit AES進行加密與解密,如圖4所示,k0表示初始密鑰,ki表示當前密鑰,ci表示當前明文,mi表示當前密文。RC4提供高隨機性和不可預測性的密鑰流,考慮到密鑰從內部泄露的可能性,在這里不采用原RC4加密方法(直接按位與明文異或),使用128 bit AES增加密碼系統(tǒng)復雜度,比簡單使用RC4密碼更安全。AES雖然稍微增加了算法復雜度,但對于服務器加密與解密效率影響很小。在項目后期壓力測試中,項目組使用了jmeter模擬200個用戶端向服務器發(fā)送udp請求,測試中每輪加密與解密均在1 s以內完成,與單獨使用RC4無明顯差異,且多輪壓力測試中均沒有發(fā)現(xiàn)問題,因此,使用AES算法增加的復雜度對服務器造成的負擔在允許范圍內。
圖4 總體結構
同步流密鑰由于密文與密鑰無關,因此,通信雙方必須通過分析密文之外的信息來保持密鑰流同步。
根據(jù)項目架構和硬件資源的實際情況,項目采用了在數(shù)據(jù)庫服務器寫入一位標志位的方式來檢測雙方密鑰是否同步,如圖5所示。
圖5 密鑰同步原理
由于RC4流密鑰只要初始密鑰K0相同,就能產(chǎn)生相同的密鑰流k1k2…ki。因此,只要檢測通信雙方使用的密鑰是否更新了相同次數(shù),即ki的下標是否相同即可,這里把i記作標志位。通信發(fā)送方將通信密鑰的標志位i寫入數(shù)據(jù)庫,接收方收到密文后,先檢查數(shù)據(jù)庫中標志位i與本地的標志位j是否相等即可。
RC4具有產(chǎn)生密鑰流的能力,由于其密鑰是變化的,因此需要不斷更新密鑰。
考慮到系統(tǒng)的具體安全需求,密鑰更新采取了“手動更新+自動化運維更新”的方式。即用戶可以手動更新密鑰,將Web和app的密鑰同時同步更新,更新流程如圖6所示。
圖6 密鑰更新流程
用戶在網(wǎng)頁端點擊頁面更新后,向Web服務器發(fā)送一個請求。Web服務器收到請求后,更改數(shù)據(jù)庫標志位為自身更新后的標志位,然后向app服務器發(fā)出命令,app服務器收到命令后查詢數(shù)據(jù)庫的標志位是否與自身更新一次后的標志位相同,若相同,則app服務器更新本地密鑰,并返回成功信息至Web服務器,Web服務器更新本地密鑰,雙方均更新一次密鑰,仍然保持密鑰同步,密鑰更新成功;若不同,則app服務器返回失敗信息發(fā)送至Web服務器,Web服務器通知頁面,建議用戶啟動密鑰重置功能,此時app和Web服務器均不執(zhí)行密鑰更新操作,以免密鑰更新不同步導致原本正常使用的密碼系統(tǒng)無法使用。
同步流密碼的最大問題就是失去同步后如何恢復同步。密鑰重置提供了一種恢復同步的方法。
密鑰重置的流程與密鑰更新流程大致相同,唯一不同的是密鑰重置將密鑰置為初始密鑰k0。該方法存在一定風險,攻擊者可以通過重放攻擊誘使app服務器重置密鑰。因此,兩個服務器對本地密鑰設置了嚴格的保護。
為方便排查密鑰更新故障和監(jiān)控密鑰安全,在密鑰更新模塊里加入了密鑰更新日志。app服務器每次更新都將密鑰更新的時間和命令內容寫入日志,以便診斷故障和安全監(jiān)控。
使用單密碼體系的通信者們,通常會面臨密鑰交換的難題:既不能長期使用同一密鑰,又無法保證交換密鑰時通信信道是安全的?;诖藛栴},RC4流密碼提供了一種簡單、安全、無需交換密鑰的單密鑰密碼,使用該密碼體系可以在保持密鑰不斷更新的同時從物理上隔絕密鑰與網(wǎng)絡環(huán)境,有效提升單密鑰通信系統(tǒng)的安全性。該密碼體系適用于所有單密鑰互聯(lián)網(wǎng)通信的應用場景,硬件要求較低,實現(xiàn)方便,完全免疫差分攻擊與線性攻擊,對重放攻擊有檢測能力,經(jīng)過多輪測試證明具有較高的安全性和穩(wěn)定性,適合作為互聯(lián)網(wǎng)通信商業(yè)密碼使用。