對稱加密演算法與TLS
來自專欄 TLS與OpenSSL
對稱加密加解密的速度相對於非對稱加密快很多,所以對稱加密演算法一般用於實際的信道建立之後的數據通信。對稱加密總體而言分為兩種:流加密和塊加密。顧名思義,流加密是指輸入演算法的是一個數據流,演算法不間斷的對整個數據流進行加密,一般會使用前面加密的結果作為一部分後續加密的一部分輸入,以做到整個流連貫加密的目的。塊加密的典型操作是將待加密數據分割成塊,演算法是處理一個一個的數據塊,將一個一個的數據塊加密最終生成密文。對稱加密演算法本身只有一個加密的作用,但是在實際的應用中一般配合哈希演算法,組成一個密碼套件,對數據同時進行加密和哈希計算。因為傳輸的數據只有加密功能,而不能保證數據的完整性,這在大部分的協議設計的時候都是不可能接受的。所以加密演算法在現實中幾乎沒有單獨使用的應用場景,絕大多數情況要配合以哈希演算法對加密的數據添加完整性校驗能力。這個完整性校驗的數據叫做MAC(message authentication code)。MAC使用哈希演算法生成,因此當哈希演算法用在數據完整性保證的時候,也通常稱為MAC演算法,MAC演算法與哈希演算法的邊界並不是很明顯。對於安全性要求更高的系統常用的演算法是HMAC,就是帶了密鑰的MAC,數據的接收者在不知道密鑰的情況下也不能得到正確的完整性校驗信息。
對稱加密演算法的種類很多,但是最常用的基本只有一兩種,一種是3DES,另外一種是AES。AES在TLS的對稱加密應用中幾乎佔據了絕對的市場優勢,其他還有IDEA,RC4也有一定的應用。密鑰套件的WITH單詞之後就表示的是對稱加密的演算法和對應的哈希演算法。例如TLS_RSA_WITH_AES_128_CBC_SHA256 就表示使用128位的AES對稱加密演算法,使用AES的CBC模式,使用SHA256作為MAC演算法。這裡面的最後一個單詞表示的MAC演算法,其他單詞都是用來描述對稱加密演算法的參數的。
CipherSuite TLS_RSA_WITH_NULL_MD5
CipherSuite TLS_RSA_WITH_NULL_SHA
CipherSuite TLS_RSA_WITH_NULL_SHA256
CipherSuite TLS_RSA_WITH_RC4_128_MD5
CipherSuite TLS_RSA_WITH_RC4_128_SHA
CipherSuite TLS_RSA_WITH_3DES_EDE_CBC_SHA
CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA
CipherSuite TLS_RSA_WITH_AES_256_CBC_SHA
CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA256
CipherSuite TLS_RSA_WITH_AES_256_CBC_SHA256
上表是一個TLS 1.2中使用RSA證書和密鑰交換方式的一個列表,雖然只是一種密鑰交換和證書格式,但是其對應的對稱加密部分的變種就基本上可以代表了大部分的可能。也就是說在TLS 1.2中,對稱加密的方法基本上只有上述幾種。
前三個的NULL代表了本套件的對稱加密的是不進行了,只是進行一下MAC演算法,這裡的MAC演算法包括了MD5,SHA或者是SHA256(MD5和SHA已經退出使用)。AES作為一種最常用的對稱加密演算法,本身有128位和256位的區別,AES是一個塊式加密的演算法,就是把數據分割為一系列等長度的數據塊,然後進行加密。這裡的128位和256位就是塊的大小的區別。AES本身有四種可能的模式,但是常用的只有兩種:CBC和GCM。GCM本質上是AES的CTR模式加上GMAC進行哈希計算的一種組合模式。上表是TLS 1.2的RFC(5246)發布的時候的Cipher Suites的一個列表,可以看到並沒有GCM。那個時候CBC還是最通用的方法,我在學校是學習通信工程的,典型的編碼教育案例也是CBC模式。CBC模式就是一個一個塊的計算每個塊的編碼結果,下一個塊輸入上一個塊的計算結果,第一個塊輸入的是IV(初始向量)。如此所有的數據塊形成一條鏈,逐個計算得到了最終的加密數據。
這個流程中並沒有哈希編碼的,所以說這個時期的對稱加密是硬生生的組合對稱加密和哈希演算法的,TLS中規定允許先加密再計算哈希,也可以先哈希再計算加密。這在OpenSSL的解密數據的時候都會首先進行判斷當前採用的加密模式。RFC 5346之後又出了很多補充的Cipher Suites相關的RFC,對於TLS 1.2的最重要的補充就是GCM。
GCM來自於AES的CTR模式,CTR是指計數器模式。GCM是利用GMAC(基於伽羅華域的MAC)和AES的CTR模式的組合。GMAC比普通的MAC演算法快(畢竟冠以伽羅華之名),GCM模式與CBC的一個最大的區別是GCM模式不再把上一個數據塊的計算結果輸入到下一個數據塊的計算,而是在分好的數據塊中任意位置開始計算,由一個計數器和一個不變的IV值(nounce)來控制每一次計算的隨機性。由於下一次的計算並不依賴於上一次的結果,所以GCM模式可以實現大規模的並行化,並且Intel還專門推出了clmul指令用於加速GCM的運算速度,可見其應用之廣。
GCM是一種加密範式,不是一種特定的加密演算法,在AES中可以應用GCM範式,在Camellia中也可以。比如Camellia GCM對稱加密演算法也有很高的知名度。Camellia是一個安全性和效率都和AES相當的演算法,但是實測結果Camellia的速度還是略低於AES,主要原因是AES的應用太廣,為其做的軟體和硬體上的優化就會額外多很多。這也反映了市場決定技術的一個方面。兩個具有理論上相當的效率能力,但是AES的市場廣泛,市場就會投入更多的資源讓AES更好。
TLS1.3中已經禁止了使用非AEAD的密碼學套件,AEAD也是一種範式,不是一種具體的加密標準。AEAD是指同時包含了加密和完整性哈希的加密演算法,可以由單純的CBC和SHA1組合而成,也可以直接是GCM這種內涵了加密演算法和MAC演算法的範式套件直接組成。GCM的完全勝出,使得AEAD的發展方向非常明朗。
openssl speed -elapsed -evp aes-128-gcm
openssl speed -decrypt -elapsed -evp aes-128-gcm
使用上述命令可以測試各種不同的對稱加密演算法的加密和解密速度。
還可以直接把OpenSSL當成一個加解密的工具,使用例如
openssl enc -des-cbc -in plain.txt -out encrypt.txt -pass pass:87654321
來對plaint.txt使用87654321作為密碼,使用DES-CBC模式進行加密,OpenSSL也支持直接使用對稱加密的密碼學名字進行加密解密的命令寫法:
openssl des-cbc -in plain.txt -out encrypt.txt -pass pass:87654321
使用openssl enc -help命令可以列出所有可用的對稱加密的名字,所有的對稱加密的用法都是大同小異。OpenSSL的強大在使用這個命令的時候初露端倪。也就是我們的加密需求完全可以使用OpenSSL命令在腳本中變成完成。不但是對稱加密的需求,幾乎所有與密碼學相關的運算,包括證書,幾乎都可以使用openssl命令作為入口來完成。openssl命令是密碼學相關的最強大的開源命令,沒有第二個。
在調用任何一個子命令的時候,都有對應的詳細參數可以選擇。一般使用openssl enc --help,也就是openssl 子命令 --help的模式就能夠看到針對對應命令的更加深入的用法。例如可以指定IV值,可以指定鹽(鹽是用於HMAC的時候需要提供的額外密鑰),還可以指定緩存大小,密碼等參數。每種命令都可以指定不同的參數。
在OpenSSL中子命令被稱作apps,每一個app在代碼上看通常很簡短,他們的簡短從另一方面反應了OpenSSL系統本身的強大。想要了解OpenSSL的編程方式,apps代碼是最有效的學習入口。
事實上,除了GCM,還有非常好的對稱加密範式,只是因為各種原因沒有引起廣泛的注意。例如CCM是廣泛應用在Wi-Fi上,實測效率並不亞於GCM,甚至在沒有硬體加速的情況下比GCM還快。但是GCM天生的並行能力使得在有硬體加速的情況下,效率就可以很高(例如Intel的clmul指令)。
TLS v1.3草案僅支持ChaCha20、AES-GCM和AES-CCM三種對稱加密。所以ChaCha20也是一種很值得關注的對稱加密演算法。Google Chrome曾經把手機端的ChaCha20作為默認的對稱加密演算法,可見這種演算法的有效性。但是跟CCM一樣,當GCM和AES有硬體優化的時候chacha20跟AES-GCM的速度根本沒有辦法比較。chacha20基本是完敗。AES-NI是Intel專門針對AES的加速指令集,但是Intel並沒有推出一個chacha20-NI的指令集。技術決定市場的廣度,市場決定技術的深度。 ChaCha20-Poly1305在AES硬體加速之前在手機上可以做到AES的四倍性能。所以沒有一成不變的軟體和演算法選擇,跟硬體的關係也是巨大的。 事實上,OpenSSL的大數引擎的代碼裡面,很多地方都已經說明了同樣的計算邏輯在不同平台下的巨大性能差別。但是有一點是不變的,能夠並行計算的演算法最後一定比只能串列的演算法更有市場優勢。因為並行就意味著硬體的參與,硬體的參與就意味著極高的性能。
推薦閱讀:
※Chrome下HTTPS證書的「沒有公開的審核記錄」是什麼意思?
※酷站推薦 - ssllabs.com/ssl-pulse - SSL/TLS Security Scan Summary
※Fiddler抓取https原理?
※如何看待 CNNIC 官方網站的證書改換成了 DigiCert 簽發的證書?