概論
在平時的開發(fā)過程中,我們基本上會使用到對稱加解密算法,非對稱加解密算法以及摘要算法。雖然有很多輪子可供開發(fā)者直接調(diào)用,但我想,深入了解一下加解密算法常見套路會幫助我們在不同的場景下選擇合適的加解密算法。
- 首先對于對稱加密算法而言,輸入的明文與密鑰長度之間是存在相關(guān)關(guān)系的。多長的密鑰長度決定了它能加密多長的明文。那要是超過了密鑰長度怎么辦?這就涉及到了分組模式的概念。那要是明文不如密鑰長度長怎么辦?這就涉及到了填充的概念。
- 其次,對于非對稱加密算法而言,同樣存在對稱加密存在的明文過長和過短的問題。但是對于非對稱加密算法而言,不涉及分組模式,這就意味著,非對稱加密的分組模式并不在標(biāo)準(zhǔn)中定義,需要自己實(shí)現(xiàn)。對于明文過短的問題,非對稱加密算法也是支持填充的。
填充
正如上文所述,明文與密鑰長度之間存在相關(guān)性。當(dāng)明文長度不如密鑰長度時,就需要進(jìn)行填充,即在明文尾部填充一定數(shù)量的固定內(nèi)容使得明文長度與密鑰長度一致。 常見的填充算法有:
- PKCS1
- PKCS5:PKCS5是8字節(jié)填充的,即填充一定數(shù)量的內(nèi)容,使得成為8的整數(shù)倍,而填充的內(nèi)容取決于需要填充的數(shù)目。例如,串
0x56在經(jīng)過PKCS5填充之后會成為0x56 0x07 0x07 0x07 0x07 0x07 0x07 0x07因為需要填充7字節(jié),因此填充的內(nèi)容就是7。當(dāng)然特殊情況下,如果已經(jīng)滿足了8的整倍數(shù),按照PKCS5的規(guī)則,仍然需要在尾部填充8個字節(jié),并且內(nèi)容是0x08,目的是為了加解密時統(tǒng)一處理填充。 - PKCS7:PKCS7與PKCS5的區(qū)別在于PKCS5只填充到8字節(jié),而PKCS7可以在1-255之間任意填充。
- Zero:如果數(shù)據(jù)長度是分組塊的倍數(shù),則不填充,否者最后一個分組塊填充
0x00至分組塊長度。 - ANSIX923:ANSIX923 填充字符串由一個字節(jié)序列組成,此字節(jié)序列的最后一個字節(jié)填充字節(jié)序列的長度,其余字節(jié)均填充
0x00 - ISO10126:ISO10126 填充字符串由一個字節(jié)序列組成,此字節(jié)序列的最后一個字節(jié)填充字節(jié)序列的長度,其余字節(jié)填充隨機(jī)數(shù)據(jù)
分組
對稱加解密為了能夠處理明文長度大于密鑰長度的情況,按密鑰長度切分明文,并且采取一定的策略對每一個分塊進(jìn)行處理,這種策略就是分組模式。常見的分組模式有ECB和CBC。
- ECB就是將明文切分成與密鑰長度一致的分塊,對每一個分塊進(jìn)行加解密,不同分塊之間互不影響,因此,使用ECB模式下,可以對不同的分塊進(jìn)行并發(fā)加解密,性能極佳。
- CBC模式略有不同,不同的分塊之間相互影響。首先需要設(shè)置初始向量iv與第一個區(qū)塊一起被加密,加密的結(jié)果再作用于第二個區(qū)塊,再進(jìn)行加密,以此類推。解密時倒推。
相對來講,CBC模式更加安全。
非對稱加密
所謂非對稱加密,即加密密鑰和解密密鑰并非是同一把密鑰。通信的雙方分別使用公鑰和私鑰進(jìn)行加解密,比如A使用公鑰對一段明文進(jìn)行加密后發(fā)送給B,B使用對應(yīng)的私鑰對密文進(jìn)行解密得到明文。 一般而言,我們會使用非對稱加解密算法進(jìn)行密鑰協(xié)商或者對長度很小的明文進(jìn)行加密,這是因為非對稱加密的性能相比于對稱加密差距巨大。
常見的非對稱加密算法有RSA和橢圓曲線,當(dāng)然不得不提的還有我國提出的國密算法SM2.
RSA加解密算法
RSA加解密算法是依靠的是, 一般只是指模值的位長度,目前主流的有 RSA-1024, RSA-2048,RSA-4096等,數(shù)字代表的是密鑰長度,密鑰長度越長,安全性越高,但相應(yīng)的性能會下降。
對RSA算法來說,不存在分組模式的概念,對輸入的明文長度有所限制,要求輸入的明文長度一定小于密鑰長度。理論上講,多長的密鑰就加密多長的明文,產(chǎn)生的密文長度與密鑰長度一致。但實(shí)際上,1024bit的RSA最多加密117字節(jié),也就是936bit的明文,這是因為PKCS1填充規(guī)則導(dǎo)致的。
橢圓曲線算法
相比于RSA加解密算法,橢圓曲線一般用在密鑰交換上,極少聽說使用橢圓曲線進(jìn)行明文加密,但是經(jīng)過中國工程師們的設(shè)計,SM2算法可以替代RSA算法進(jìn)行明文加密。
對稱加密
故名思義,對稱加密就是加密和解密使用同一把密鑰。從最原始的凱撒密鑰到現(xiàn)如今安全系統(tǒng)極高的AES加密算法。
因為對稱加密性能較好,因此它常常被用來加密大量數(shù)據(jù),因此,需要對大量數(shù)據(jù)進(jìn)行切分,對每一部分按照一定的規(guī)則進(jìn)行加解密,這就是對稱加密中的分組模式。常見的對稱加解密算法有DES 、3DES(又叫DESede)、AES。
| 算法名稱 | 密鑰長bit | 塊長bit | 速度 | 說明 |
|---|---|---|---|---|
| DES | 56 | 64 | 慢 | 不安全, 不要使用 |
| 3DES | 112/168 | 64 | 很慢 | 中等安全, 適合加密較小的數(shù)據(jù) |
| AES | 128/192/ 256 | 128 | 快 | 安全 |
DES算法常用實(shí)踐
目前DES已被證明安全性不足,因此在實(shí)際業(yè)務(wù)場景中,多使用3DES進(jìn)行替代。3DES就是按照一定的規(guī)則使用3次DES加密,一般而言,存在兩種使用方式。
雙倍長DES,即3DES密鑰長度為16字節(jié)
這種算法可簡述為:
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);
}
復(fù)制代碼
偽代碼的含義為: 雙倍長密鑰被細(xì)分成為前半部分和后半部分。首先使用前半部分密鑰對明文幾進(jìn)行DES加密的到密文cipher1,然后再用后半部分密鑰對cipher1進(jìn)行解密的到plain2,然后再用前半部分密鑰對plain2進(jìn)行DES加密,的到最終的加密結(jié)果。
三倍長DES,即3DES密鑰長度為24字節(jié)
三倍長算法可簡述為:
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);
}
復(fù)制代碼
偽代碼的含義為: 整個過程與雙倍長算法基本類似,唯一的區(qū)別就是在進(jìn)行第二步的解密時使用的是密鑰的中間8字節(jié)。
AES算法常用實(shí)踐
AES相比于DES和3DES,安全系數(shù)更高。 常見的AES密鑰長度是128bit。
摘要算法
摘要指的是通過一定規(guī)則的計算,將輸入的串轉(zhuǎn)化成唯一的一串?dāng)?shù)字,對明文的任何改動都會導(dǎo)致數(shù)字串的改變。因此摘要算法主要用于防信息篡改。
目前常用的算法有MD5,SHA-1,SHA-256。SHA-256產(chǎn)生的數(shù)字串長度正如其名所示,是256bit的,而SHA-1時160bit,MD5時128bit。
數(shù)字串長度越長越安全,事實(shí)也是如此,目前MD5和SHA-1已經(jīng)被破解。因此在生產(chǎn)上,為了保證足夠的安全性可以采用SHA-256算法。
國密SM3算法同樣提供了非常安全的摘要算法,它產(chǎn)生的串長度為256bit,提供了與SHA-256相似的安全性和計算效率。
| 算法 | 哈希串長度 | 安全性 |
|---|---|---|
| MD5 | 128bit | 不足 |
| SHA-1 | 190bit | 不足 |
| SHA-256 | 256bit | 強(qiáng) |
| SM3 | 256bit | 強(qiáng) |