常用密碼演算法要點

BB8發表於2019-07-30
version date commit-msg
1.0 2019/7/30 first commit

在我們平時的開發當中,不可避免的會使用到加解密演算法,瞭解這些演算法的基本概念,對我們的開發工作大有裨益。本文將對這些常用的加解密演算法進行總結梳理。本人水平有限,文章內容如有錯誤,懇請各位大佬多多指點,小弟在此謝過。

概論

在平時的開發過程中,我們基本上會使用到對稱加解密演算法,非對稱加解密演算法以及摘要演算法。雖然有很多輪子可供開發者直接呼叫,但我想,深入瞭解一下加解密演算法常見套路會幫助我們在不同的場景下選擇合適的加解密演算法。

  • 首先對於對稱加密演算法而言,輸入的明文與金鑰長度之間是存在相關關係的。多長的金鑰長度決定了它能加密多長的明文。那要是超過了金鑰長度怎麼辦?這就涉及到了分組模式的概念。那要是明文不如金鑰長度長怎麼辦?這就涉及到了填充的概念。
  • 其次,對於非對稱加密演算法而言,同樣存在對稱加密存在的明文過長和過短的問題。但是對於非對稱加密演算法而言,不涉及分組模式,這就意味著,非對稱加密的分組模式並不在標準中定義,需要自己實現。對於明文過短的問題,非對稱加密演算法也是支援填充的。

填充

正如上文所述,明文與金鑰長度之間存在相關性。當明文長度不如金鑰長度時,就需要進行填充,即在明文尾部填充一定數量的固定內容使得明文長度與金鑰長度一致。 常見的填充演算法有:

  1. PKCS5:PKCS5是8位元組填充的,即填充一定數量的內容,使得成為8的整數倍,而填充的內容取決於需要填充的數目。例如,串0x56在經過PKCS5填充之後會成為0x560x070x070x070x070x070x070x07因為需要填充7位元組,因此填充的內容就是7。當然特殊情況下,如果已經滿足了8的整倍數,按照PKCS5的規則,仍然需要在尾部填充8個位元組,並且內容是0x08,目的是為了加解密時統一處理填充。
  2. PKCS7:PKCS7與PKCS5的區別在於PKCS5只填充到8位元組,而PKCS7可以在1-255之間任意填充。

分組

對稱加解密為了能夠處理明文長度大於金鑰長度的情況,按金鑰長度切分明文,並且採取一定的策略對每一個分塊進行處理,這種策略就是分組模式。常見的分組模式有ECB和CBC。

  • ECB就是將明文切分成與金鑰長度一致的分塊,對每一個分塊進行加解密,不同分塊之間互不影響,因此,使用ECB模式下,可以對不同的分塊進行併發加解密,效能極佳。
  • CBC模式略有不同,不同的分塊之間相互影響。首先需要設定初始向量iv與第一個區塊一起被加密,加密的結果再作用於第二個區塊,再進行加密,以此類推。解密時倒推。

相對來講,CBC模式更加安全。

非對稱加密

所謂非對稱加密,即加密金鑰和解密金鑰並非是同一把金鑰。通訊的雙方分別使用公鑰和私鑰進行加解密,比如A使用公鑰對一段明文進行加密後傳送給B,B使用對應的私鑰對密文進行解密得到明文。 一般而言,我們會使用非對稱加解密演算法進行金鑰協商或者對長度很小的明文進行加密,這是因為非對稱加密的效能相比於對稱加密差距巨大。

常見的非對稱加密演算法有RSA和橢圓曲線,當然不得不提的還有我國提出的國密演算法SM2.

RSA加解密演算法

RSA加解密演算法是依靠的是, 一般只是指模值的位長度,目前主流的有 RSA-1024, RSA-2048,RSA-4096等,數字代表的是金鑰長度,金鑰長度越長,安全性越高,但相應的效能會下降。

對RSA演算法來說,不存在分組模式的概念,對輸入的明文長度有所限制,要求輸入的明文長度一定小於金鑰長度。理論上講,多長的金鑰就加密多長的明文,產生的密文長度與金鑰長度一致。但實際上,1024bit的RSA最多加密117位元組,也就是936bit的明文,這是因為PKCS1填充規則導致的。

橢圓曲線演算法

相比於RSA加解密演算法,橢圓曲線一般用在金鑰交換上,極少聽說使用橢圓曲線進行明文加密,但是經過中國工程師們的設計,SM2演算法可以替代RSA演算法進行明文加密。

對稱加密

故名思義,對稱加密就是加密和解密使用同一把金鑰。從最原始的凱撒金鑰到現如今安全系統極高的AES加密演算法。

因為對稱加密效能較好,因此它常常被用來加密大量資料,因此,需要對大量資料進行切分,對每一部分按照一定的規則進行加解密,這就是對稱加密中的分組模式。常見的對稱加解密演算法有DES和AES。

DES演算法常用實踐

目前DES已被證明安全性不足,因此在實際業務場景中,多使用3DES進行替代。3DES就是按照一定的規則使用3次DES加密,一般而言,存在兩種使用方式。

雙倍長DES,即3DES金鑰長度為16位元組
這種演算法可簡述為:

cipher2 Encrypt(plain1, key) {
	lkey = key[0-8];
        rkey = key[8-16];
	1. ENCRYPT(plain1, lkey, cipher1);
	2. DECRYPT(cipher1, rkey, plain2);
	3. ENCRYPT(plain2, lkey, cipher2);
}
複製程式碼

虛擬碼的含義為: 雙倍長金鑰被細分成為前半部分和後半部分。首先使用前半部分金鑰對明文幾進行DES加密的到密文cipher1,然後再用後半部分金鑰對cipher1進行解密的到plain2,然後再用前半部分金鑰對plain2進行DES加密,的到最終的加密結果。

三倍長DES,即3DES金鑰長度為24位元組
三倍長演算法可簡述為:

cipher2 Encrypt(plain1, key) {
	lkey = key[0-8];
        ckey = key[8-16];
        rkey = key[16-24];
	1. ENCRYPT(plain1, lkey, cipher1);
	2. DECRYPT(cipher1, ckey, plain2);
	3. ENCRYPT(plain2, rkey, cipher2);
}
複製程式碼

虛擬碼的含義為: 整個過程與雙倍長演算法基本類似,唯一的區別就是在進行第二步的解密時使用的是金鑰的中間8位元組。

AES演算法常用實踐

AES相比於DES和3DES,安全係數更高。 常見的AES金鑰長度是128bit。

摘要演算法

摘要指的是通過一定規則的計算,將輸入的串轉化成唯一的一串數字,對明文的任何改動都會導致數字串的改變。因此摘要演算法主要用於防資訊篡改。
目前常用的演算法有MD5,SHA-1,SHA-256。SHA-256產生的數字串長度正如其名所示,是256bit的,而SHA-1時190bit,MD5時128bit。
數字串長度越長越安全,事實也是如此,目前MD5和SHA-1已經被破解。因此在生產上,為了保證足夠的安全性可以採用SHA-256演算法。

國密SM3演算法同樣提供了非常安全的摘要演算法,它產生的串長度為256bit,提供了與SHA-256相似的安全性和計算效率。

演算法 雜湊串長度 安全性
MD5 128bit 不足
SHA-1 190bit 不足
SHA-256 256bit
SM3 256bit

References

相關文章