[SSL]SSL演算法庫的理解與測試

鄒德強發表於2013-07-15
SSL演算法庫包含3類演算法,這裡分別說明SSH所用到和我們可能用到的演算法:
對稱加密演算法——DES、AES、RC4;
非對稱加密演算法——RSA、DH;
資訊摘要演算法(單向雜湊演算法)——MD5、SHA;
在SSH中,使用RSA演算法加密SSH v1的金鑰交換過程;使用DH演算法加密SSH v2的金鑰交換過程,通過DH演算法獲得會話金鑰;使用DES演算法加密SSH的會話過程。
 
DES演算法
DES演算法屬於對稱加密演算法,使用塊加密方式,每次加密64bit(8位元組)的資料塊。
對稱加密演算法使用同一金鑰進行加/解密,可分為塊加密和流加密2種方式。其中,塊加密可分為4種模式:
1、ECB(Electronic Code Book,電子密碼本):在ECB模式中,每塊明文都是獨立於其他塊加密的。雖然這樣做比較高效(可以並行執行多個資料塊的加密),但是易受攻擊,因為對相同明文塊的加密總是產生相同的密文塊。在SSL演算法庫中這是DES基本的加密方式。
2、CBC(Cipher Block Chaining,密碼塊連結):在CBC模式中,塊是連續加密的,在加密當前明文塊之前,用前一次塊加密的結果修改當前明文塊。這個過程改進了加密的一些特徵(例如,相同的明文塊不會產生相同的密文塊),但是由於其加密過程是連續的,CBC方式不支援加密的並行化。CBC方式使用初始向量(Initialization Vector,IV)來開始連結過程。IV 用於修改被加密的第一個明文塊。在SSL演算法庫中這是DES為SSL提供的加密方式。
3、CFB(Cipher Feedback,密碼反饋)
4、OFB(Output Feedback,輸出反饋)
對於DES演算法的擴充套件,有3DES和DESX兩種演算法。
3DES簡單的說是使用DES演算法進行3重加密,其做法有4種:
1、DES-EEE3:使用3把不同的金鑰,依次進行加密-加密-加密。
2、DES-EDE3:使用3把不同的金鑰,依次進行加密-解密-加密。
3、DES-EEE3:使用2把不同的金鑰,依次進行加密-加密-加密,第3次和第1次使用的金鑰相同。
4、DES-EDE3:使用2把不同的金鑰,依次進行加密-解密-加密,第3次和第1次使用的金鑰相同。
但是3DES做了3次DES加密,所以其效率只有DES的1/3,DESX演算法可以不損失效率,同時提高金鑰長度。
DESX使用3把不同的金鑰,第1把金鑰用來對準備加密的塊做XOR運算,第2把金鑰再對已經作過XOR運算的塊再做一次XOR運算,第3把金鑰用來進行DES加密。這樣,只做了1次DES加密,但是金鑰長度是3把金鑰的總長度。
 
AES演算法
AES演算法是美國新的對稱資料加密演算法,它是作為DES的替代者推出的。相對於DES而言,其特點主要是速度快、保密性高。
AES也採用塊加密方式,AES處理的基本塊是128bits,即16位元組;DES處理的基本塊是64bits,即8位元組。
AES的金鑰長度有3種,128bits、192bits、256bits;DES的金鑰長度為56bits,加上8bits的校驗位,通常看上去是64bits。
但是AES出來的時間不長,把AES當作註冊演算法還沒有得到大量普及,其實際效果還需要時間的檢驗
 
RC4演算法
RC4演算法通常用於金鑰長度可變的流加密,其特點是演算法簡捷、速度快。不過目前已經發現了RC4比較大的安全漏洞,正在逐步被RC5取代。
 
RSA演算法
RSA演算法大家應該比較熟悉,這裡提下PKCS和OAEP,PKCS padding和OAEP padding是RSA的兩種比較安全的padding方法。
在RSA加密時,是對每個加密塊進行加密,加密塊在格式化時有一個padding的概念。我們簡稱:填充字串為PS,加密塊為EB,加密塊型別為BT,明文資料為D,則EB格式化表示為:EB = 00||BT||PS||00||D。PS必須由k-3-||D||個位元組組成,其中k為模數的長度。
 
DH演算法
DH演算法通常用於雙方協商加密金鑰,同時需要DH協商流程的配合。在SSH中用於金鑰交換的過程。
 
MD5演算法
MD5演算法是常用的資訊摘要演算法(或者說雜湊演算法)之一,其典型應用是對一段資訊產生資訊摘要,防止資訊被篡改。MD5可以把一個任意長度的位元組串變換成一定長的大整數,從而壓縮成一種保密的格式。
MD5的雜湊值長度是128bits。
目前MD5演算法已經被實際破解了——呵呵,那是中國山東的王小云牛人。
 
SHA演算法
SSL演算法庫中的SHA演算法包含了SHA和SHA1,以及SHA256、SHA384、SHA512。
SHA是SHA演算法的早期版本,存在安全問題。
廣泛應用的是SHA1,它也是常用的資訊摘要演算法之一。SHA1的雜湊值長度是160bits,比128bits雜湊值演算法(如MD5)更安全,但是速度也更慢。
目前SHA1也被理論破解了(破解需要的時間長了點,6000年)——呵呵,還是中國山東的王小云牛人。
SHA256、SHA384、SHA512對應的雜湊值長度,顧名思義則是256bits、384bits、512bits。
演算法庫的測試主要就是針對這7種演算法的測試,測試環境是CPU=PPC440,OS=vxworks,Platform=6503

DES測試
測試程式給出16組弱金鑰(目前已知64組),當然不是用來測試,而是排除,以及相應的測試資料。
1、cbcm方式
測試資料:1組,初始向量cbc_iv,三把金鑰cbc_key,cbc2_key,cbc3_key,明文cbc_data
測試過程:把明文和初始向量進行異或,再進行3des加密,再進行3des解密,再和初始向量進行異或,比較輸出和明文。全部一致就成功。
2、ecb方式
測試資料:34組,金鑰資料key_data,明文plain_data,密文cipher_data,一組金鑰資料產生一把金鑰。
測試過程:使用金鑰對明文進行des加密,比較輸出和密文;再把使用同一金鑰進行des解密,比較輸出和明文。全部一致就成功。
3、ede ecb方式
測試資料:34組,金鑰資料key_data,明文plain_data,密文cipher_ecb2,一組金鑰資料產生一把金鑰。
測試過程:使用2把金鑰,對明文進行3des-ede加密,比較輸出和密文;再進行3des-ede解密,比較輸出和明文。全部一致就成功。
4、cbc方式
測試資料:1組,初始向量cbc_iv,一把金鑰cbc_key,明文cbc_data,密文cbc_ok
測試過程:把明文和初始向量進行異或,再進行des加密,比較輸出和密文;再使用同一金鑰進行des解密,再和初始向量進行異或,比較輸出和明文。全部一致就成功。
5、desx cbc方式
測試資料:1組,初始向量cbc_iv,三把金鑰cbc_key,明文cbc_data,密文xcbc_ok
測試過程:把明文和初始向量進行異或,再進行desx加密,比較輸出和密文;再進行desx解密,再和初始向量進行異或,比較輸出和明文。全部一致就成功。
6、ede cbc方式
測試資料:1組,初始向量cbc_iv,三把金鑰cbc_key,明文cbc_data,密文cbc3_ok
測試過程:把明文和初始向量進行異或,再進行3des-ede加密,比較輸出和密文;再進行3des-ede解密,再和初始向量進行異或,比較輸出和明文。全部一致就成功。
7、pcbc方式
基本同cbc方式,只是進行des加密前的運算方式不同。
8、cfb方式
進行了cfb8、cfb16、cfb32、cfb48、cfb64、ede_cfb64的測試。
9、ofb方式
進行了ofb、ofb64、ede_ofb64的測試。
測試結果:
1、正確性測試:全部通過。
2、速度測試:結果比較穩定,資料如下
2.1、金鑰安裝:每秒進行298千次,每次耗時3.35us。
2.2、DES-ECB流加密,針對DES基本塊:每秒進行353千次,每次耗時2.83us,加密速度2.83M位元組/秒。
2.3、DES-CBC塊加密,針對1024位元組塊:每秒進行2.5千次,每次耗時400us,加密速度2.56M位元組/秒。
2.4、DES-ED
E-CBC塊加密,針對1024位元組塊:每秒進行0.89千次,每次耗時1120us,加密速度0.91M位元組/秒。
 
AES測試
測試資料
來自
http://csrc.nist.gov/,一個龐大的測試向量包,其中包含了4種通用塊加密模式(ECB、CBC、CFB、OFB),AES的6種測試模式(GFSbox、KeySbox、MCT、MMT、VarKey、VarTxt),以及3種金鑰長度(128、192、256bits)的測試向量檔案,共4*6*3=72個檔案,每個檔案含10-100組不等的測試向量。測試主要針對ECB和CBC這2種模式。
測試過程:
1、根據金鑰資料,構造加密金鑰。
2、對明文進行加密,獲得密文,比較密文和已知密文。
3、根據金鑰資料,構造解密金鑰。
4、對密文進行解密,獲得明文,比較明文和已知明文。
5、如果採用了CBC模式,則需要初始向量iv,在加密前使用iv和加密資料作指定運算。
測試注意事項:
1、如果採用了ECB-MMT模式,測試向量給出的明文和密文將超過基本塊長度128bits。由於ECB模式下是對固定塊加密,而且各塊加密是獨立的,所以加密時需要將明文分割成固定的128bits塊,依次送入加密後,比較時也是按照順序依次比較128bits密文塊資料;反之亦然。如果在CBC模式下,則需要給出加密資料長度。
2、如果採用CBC模式,加密函式會改變送入的初始向量iv。如果不注意這點,解密時送入改變後的iv,則解密會失敗。所以需要自己事先儲存iv副本,加/解密時送入相同的iv。

測試結果:
1、正確性測試:其中關於MCT的測試向量都失敗了,其餘的全部通過。
2、速度測試:結果比較穩定,資料如下
對於128位金鑰而言
2.1、加密金鑰安裝:每秒進行368千次,每次耗時2.71us。
2.2、解密金鑰安裝:每秒進行98千次,每次耗時10.18us。
2.3、AES-ECB塊加密,針對AES基本塊:每秒進行228千次,每次耗時4.38us,加密速度3.66M位元組/秒。
2.4、AES-CBC塊加密,針對AES基本塊:每秒進行182千次,每次耗時5.50us,加密速度2.91M位元組/秒。

相關文章