導(dǎo)語(yǔ)
本文嘗試由古及今,論述加密算法的發(fā)展演變,以及在整個(gè)過程中先后出現(xiàn)的集中關(guān)鍵加密算法。由于個(gè)人水平有限,如果出現(xiàn)謬誤,還望不吝賜教。
加密算法那些事兒
加密算法乍一聽貌似和大部分人的日常生活十分遙遠(yuǎn),但實(shí)際卻密切相關(guān)。從網(wǎng)絡(luò)層到主機(jī)文件層,無論那層加密應(yīng)用或協(xié)議背后都是由各種加密算法所支撐。即便你不用任何加密產(chǎn)品,凡是使用https的網(wǎng)站都已經(jīng)使用了加密協(xié)議TLS/SSL。你也被動(dòng)享受了加密算法帶來的隱私保護(hù),及通訊安全。今天我們拋開淺層的應(yīng)用來扒一扒各種有趣的加密算法。
在扒加密算法前先稍微科普一下,加密算法主要作用是把明文變成密文。加密算法加密后,明文會(huì)變成密文,防止信息泄露。雖然看起來和亂碼很像,但密文不是亂碼。大部分亂碼是由于編碼不一致導(dǎo)致。編碼不屬于加密算法,編碼無法把明文變成密文,只是改變了一種顯示格式而已。所以base64只是一種編碼而已,它不是加密算法,不具備加密能力,不能保障您的明文安全。所以,以后要聽哪家說我們使用了base64進(jìn)行加密,趕緊屏蔽。
加密算法的采用需要符合以下三點(diǎn)訴求:
機(jī)密性:
保證數(shù)據(jù)即使被盜取,小偷也不知道是啥;
完整性:
保證數(shù)據(jù)在傳輸過程中即使被劫持修改,接收方能夠發(fā)現(xiàn)信息已被截取,而選擇換掉;
可用性:
保證加密算法的開銷、復(fù)雜度都在可用范圍。
結(jié)合上述訴求,加密算法的發(fā)展主要經(jīng)歷了古典密碼和現(xiàn)代密碼兩個(gè)重要時(shí)期。
一、古代人民怎么加密?
1. 歷史上最早的加密算法
早期加密算法主要使用在軍事中,歷史上最早關(guān)于加密算法的記載出自于周朝兵書《六韜.龍韜》中的《陰符》和《陰書》。其中記載:
太公曰:“主與將,有陰符,凡八等。有大勝克敵之符,長(zhǎng)一尺。破軍擒將之符,長(zhǎng)九寸。降城得邑之符,長(zhǎng)八寸。卻敵報(bào)遠(yuǎn)之符,長(zhǎng)七寸。警眾堅(jiān)守之符,長(zhǎng)六寸。請(qǐng)糧益兵之符,長(zhǎng)五寸。敗軍亡將之符,長(zhǎng)四寸。失利亡士之符,長(zhǎng)三寸。諸奉使行符,稽留,若符事聞,泄告者,皆誅之。八符者,主將秘聞,所以陰通言語(yǔ),不泄中外相知之術(shù)。敵雖圣智,莫之能識(shí)。”
武王問太公曰:“… 符不能明;相去遼遠(yuǎn),言語(yǔ)不通。為之奈何?” 太公曰:“諸有陰事大慮,當(dāng)用書,不用符。主以書遺將,將以書問主。書皆一合而再離,三發(fā)而一知。再離者,分書為三部。三發(fā)而一知者,言三人,人操一分,相參而不相知情也。此謂陰書。敵雖圣智,莫之能識(shí)。”
簡(jiǎn)單來說,陰符是以八等長(zhǎng)度的符來表達(dá)不同的消息和指令,屬于密碼學(xué)中的替代法,在應(yīng)用中是把信息轉(zhuǎn)變成敵人看不懂的符號(hào),但知情者知道這些符號(hào)代表的含義。這種符號(hào)法無法表達(dá)豐富的含義,只能表述最關(guān)鍵的八種含義。陰書作為陰符的補(bǔ)充,運(yùn)用了文字拆分法直接把一份文字拆成三分,由三種渠道發(fā)送到目標(biāo)方手中。敵人只有同時(shí)截獲三分內(nèi)容才可能破解陰書上寫的內(nèi)容。
上述樸素的加密算法思想主要使用了替換法。無獨(dú)有偶,在遙遠(yuǎn)的西方加密算法也大規(guī)模使用于戰(zhàn)爭(zhēng)之中。在希羅多德(Herodotus)的《歷史》中記載了公元前五世紀(jì),希臘城邦和波斯帝國(guó)發(fā)生多次沖突和戰(zhàn)爭(zhēng)。這些戰(zhàn)爭(zhēng)中希臘城邦中廣泛使用了移位法進(jìn)行加密處理戰(zhàn)爭(zhēng)通訊信息,使波斯帝國(guó)難以獲得希臘城邦的軍事情報(bào),也就無法提前做軍事部署。
希臘城邦用來傳輸軍事信息、命令的每段文字都有固定的字?jǐn)?shù),接密者手中會(huì)有一份文字移位說明。解密者拿到密文后,根據(jù)文字移位說明進(jìn)行解密,從而破解其中的軍事命令或消息。
2. 古代密碼演變的凱撒密碼
古典密碼主要采用的就是移動(dòng)法和替換法。經(jīng)過逐漸發(fā)展和完善,最有名的莫過于凱撒密碼。凱撒密碼有兩種模式——移位法和替換法。其中,移位法就是讓明文都向固定方向移動(dòng)特定位數(shù),例如I love you右移動(dòng)4位就變成了M pszi csy。但英文或拉丁文,字母出現(xiàn)的頻率并不一致。以英文字母為例:字母e出現(xiàn)頻率明顯高過其他字母。在獲得足夠多的密文樣本后,可以通過頻率計(jì)算準(zhǔn)確找到移位規(guī)則,從而破解密文。同時(shí)由于需要可逆操作,所以實(shí)際上密鑰的數(shù)量是有限的,只有25種可能。因此,完全可以通過暴力破解來對(duì)密文進(jìn)行解密。
于是大部分凱撒密碼在實(shí)際應(yīng)用中都采用了第二種模式——替換法。定義一張明文密文映射表:
這種方式可以在一定程度上解決密鑰可窮舉的問題,但仍對(duì)大數(shù)據(jù)量的頻率攻擊束手無策。
后來,這種模式發(fā)展為,靠引入一些特定參數(shù)來擾亂頻率,這在一定程度上提高了解密的難度,但仍屬于替換法和移位法的范疇。
古典密碼后期發(fā)展出維吉尼亞密碼、ROT5/13/18/47、摩爾斯密碼等一系列密碼種類。但都是以替換法和移位法為核心基礎(chǔ),安全性也主要是靠算法不公開來保證。所使用的加密算法只能算是現(xiàn)在加密算法的雛形,或者僅作為可以借鑒的最初加密思路。
二、現(xiàn)代人更科學(xué)的加密算法
古典加密算法本質(zhì)上主要考慮的是語(yǔ)言學(xué)上模式的改變。直到20世紀(jì)中葉,香農(nóng)發(fā)表了《秘密體制的通信理論》一文,標(biāo)志著加密算法的重心轉(zhuǎn)移往應(yīng)用數(shù)學(xué)上的轉(zhuǎn)移。于是,逐漸衍生出了當(dāng)今重要的三類加密算法:非對(duì)稱加密、對(duì)稱加密以及哈希算法。這三類算法在現(xiàn)實(shí)場(chǎng)景中也往往組合起來使用,以發(fā)揮最佳效果。
1. 對(duì)稱加密算法
對(duì)稱加密算法是使用最廣泛的加密算法之一。常用的對(duì)稱性加密算法有DES算法、AES算法、3DES算法、TDEA算法、Blowfish算法、RC5算法、IDEA算法等。對(duì)稱加密的特點(diǎn)是,加密和解密兩方使用同一密鑰進(jìn)行加、解密。加密算法本身泄露不會(huì)對(duì)安全性造成影響,密鑰才是安全性的關(guān)鍵。按照原理不同,對(duì)稱加密可以大體分成流加密和分組加密兩種類型。
流加密
流加密是將明文按字符逐位地,對(duì)應(yīng)地進(jìn)行加密的一類對(duì)稱密碼算法。流加密中最有名的算法是RC4和GSM。流加密算法相對(duì)簡(jiǎn)單,明文和密鑰按位對(duì)其做約定的運(yùn)算,即可獲得密文。
最簡(jiǎn)單的模型是異或流加密例如:
由于流加密原理簡(jiǎn)單,其算法結(jié)構(gòu)存在弱點(diǎn),如果密鑰流又多次重復(fù)使用,只要泄露局部明文,攻擊者很容易算出密鑰。另外,由于是按位進(jìn)行加密,攻擊者即使對(duì)數(shù)據(jù)進(jìn)行篡改,也不會(huì)破壞原有數(shù)據(jù)結(jié)構(gòu),接收者很難發(fā)現(xiàn)其中變化。流加密雖然是一種快捷高效的加密方法,但其安全性較低,不建議用戶使用流加密對(duì)關(guān)鍵信息進(jìn)行加密。
分組加密
分組加密內(nèi)部實(shí)現(xiàn)則復(fù)雜的多,每一個(gè)加密塊都會(huì)經(jīng)歷至少16輪運(yùn)算,其代表算法有DES和AES。目前推薦使用AES,DES已經(jīng)不在安全。
DES
DES是較早時(shí)期的對(duì)稱加密標(biāo)準(zhǔn),在當(dāng)時(shí)得到了廣泛的應(yīng)用。隨著計(jì)算機(jī)性能地不斷提高,暴力破解DES變得越來越容易。所以DES已經(jīng)不再安全,近十幾年逐漸地被3DES和AES代替。
DES核心主要分成初始置換、輪函數(shù)、逆置換三步。
初始置換:把輸入的64位數(shù)據(jù)塊按位重新組合,并把輸出分為L(zhǎng)0、R0兩部分,每部分長(zhǎng)32位,其置換規(guī)則為將輸入的第58位換到第1位,第50位換到第2位……依此類推,最后一位是原來的第7位。L0、R0則是換位輸出后的兩部分,L0是輸出的左32位,R0是右32位,其置換規(guī)則見下表:
58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7,
輪函數(shù):DES 使用一個(gè) 56 位的密鑰以及附加的 8 位奇偶校驗(yàn)位(每組的第8位作為奇偶校驗(yàn)位),產(chǎn)生最大 64 位的分組大小。這是一個(gè)迭代的分組密碼,使用稱為 Feistel 的技術(shù),其中將加密的文本塊分成兩半。使用子密鑰對(duì)其中一半應(yīng)用循環(huán)功能,然后將輸出與另一半進(jìn)行“異或”運(yùn)算;接著交換這兩半,這一過程會(huì)繼續(xù)下去,但最后一個(gè)循環(huán)不交換。
逆置換:DES 使用 16 輪循環(huán),使用異或、置換、代換、移位操作四種基本運(yùn)算。最后經(jīng)過16次迭代運(yùn)算后,得到L16、R16,將此作為輸入進(jìn)行逆置換,逆置換正好是初始置換的逆運(yùn)算,由此即得到密文輸出,解密過程則是整套加密過程的逆運(yùn)算。
AES
AES的誕生是為了替代原先的DES,它已經(jīng)被多方分析論證,在全世界范圍廣泛使用,是目前最為安全的對(duì)稱加密算法之一。近十年,AES已然成為對(duì)稱密鑰加密中最流行的算法之一。不同于它的前任標(biāo)準(zhǔn)DES,AES使用的是代換-置換網(wǎng)絡(luò),而非Feistel架構(gòu)。
大多數(shù)AES計(jì)算是在一個(gè)特別的有限域內(nèi)完成的,加密過程是在一個(gè)4×4的字節(jié)矩陣上運(yùn)作,這個(gè)矩陣又稱為“狀態(tài)(state)”,其初值就是一個(gè)明文區(qū)塊(矩陣中一個(gè)元素大小就是明文區(qū)塊中的一個(gè)Byte)。加密時(shí),各輪AES加密循環(huán)(除最后一輪外)均包含4個(gè)步驟:
AddRoundKey——矩陣中的每一個(gè)字節(jié)都與該次輪密鑰(round key)做XOR運(yùn)算;每個(gè)子密鑰由密鑰生成方案產(chǎn)生。
SubBytes——通過一個(gè)非線性的替換函數(shù),用查找表的方式把每個(gè)字節(jié)替換成對(duì)應(yīng)的字節(jié)。
ShiftRows——將矩陣中的每個(gè)橫列進(jìn)行循環(huán)式移位。
MixColumns——為了充分混合矩陣中各個(gè)直行的操作。這個(gè)步驟使用線性轉(zhuǎn)換來混合每列的四個(gè)字節(jié)。最后一個(gè)加密循環(huán)中省略MixColumns步驟,以另一個(gè)ddRoundKey取代。
加密模式
無論是AES還是DES他們內(nèi)部都支持不同的加密模式,每一種模式的安全性和效率都大不相同。這里,只簡(jiǎn)單介紹兩種最常見的模式ECB和CBC。
ECB模式加密效率高,但安全性低,模式如下圖:
每次都是Key對(duì)單獨(dú)塊進(jìn)行加密,容易被對(duì)方破解。但由于每個(gè)模塊之間毫無關(guān)聯(lián),所以可以并發(fā)運(yùn)算,極大地提高了加密效率。通常,ECB的加密效率比CBC高5-6倍。
CBC加密效率雖然沒有ECB高,但安全性則高得多。模式如下圖:
每塊加密引入一個(gè)IV,每塊的IV都不同,需要上一塊進(jìn)行迭代,最終完成整個(gè)加密過程。由于每塊的IV和密文塊有關(guān),所以無法采用并發(fā)的模式,必須串行整個(gè)過程。
如果不是出于極高的性能要求,建議還是采用CBC模式進(jìn)行加密,該模式更為安全、可靠。
2. 非對(duì)稱加密算法
非對(duì)稱加密算法和對(duì)稱加密算法的最大區(qū)別在于,加密的密鑰和解密的密鑰不再是一個(gè)。這就像兩個(gè)人互對(duì)暗號(hào)一樣。這種加密方式主要為了應(yīng)對(duì)“多個(gè)加密者,一個(gè)解密者”的模式,對(duì)稱密鑰只能解決解密用戶為一對(duì)一的關(guān)系。
于是在這種多對(duì)一的關(guān)系中就出現(xiàn)了一個(gè)公鑰體系。一個(gè)公鑰對(duì)應(yīng)一個(gè)私鑰。公鑰是公開的,任何數(shù)據(jù)發(fā)送者都用公鑰對(duì)數(shù)據(jù)進(jìn)行加密,但公鑰加密的內(nèi)容只有私鑰才能解開。其中著名的算法包括DSA算法、RSA算法、Elgamal算法、背包算法、Rabin算法、D-H算法、ECC算法。背后的數(shù)學(xué)原理從大數(shù)分解到復(fù)雜的橢圓曲線上的離散對(duì)數(shù)問題,非常復(fù)雜。這里,筆者就不做展開。
雖然背后的數(shù)學(xué)支撐不同,但模式類似,均采用公私鑰密鑰對(duì)的方式,公鑰解密私鑰加密的信息,私鑰解密公鑰加密的信息。非對(duì)稱加密算法的執(zhí)行效率成為這種算法實(shí)際應(yīng)用的最大阻礙。大部分應(yīng)用主要把非對(duì)稱加密算法用在身份驗(yàn)證中,并不會(huì)在通訊中使用。
3. 哈希算法
哈希算法也是非常常見的加密算法之一。他和對(duì)稱算法以及非對(duì)稱算法最大的區(qū)別是,它不是用來做數(shù)據(jù)傳輸,而是對(duì)數(shù)據(jù)是否被篡改加以驗(yàn)證,防止不法分子篡改數(shù)據(jù)。它的特點(diǎn)是無論原文多長(zhǎng)都會(huì)變成固定長(zhǎng)度的字符串,只能加密不能解密(只能單向運(yùn)算)。對(duì)于不同的輸入,理論上會(huì)生成不同的輸出(部分算法已出現(xiàn)大規(guī)模碰撞,碰撞就是指不同明文相同密文的情況)。
常見哈希算法包含MD5、SHA-1和SHA 224/256/512等。其中,MD5和SHA-1已經(jīng)被證明不再安全,所以,建議使用SHA256/512等安全性高的算法。
三、數(shù)據(jù)庫(kù)加密算法
上述加密算法已經(jīng)廣泛應(yīng)用在各個(gè)領(lǐng)域。隨著云和大數(shù)據(jù)的高速發(fā)展,數(shù)據(jù)庫(kù)也逐漸從安全的局域網(wǎng)環(huán)境,向私有云甚至公有云遷移。云環(huán)境下服務(wù)器變得不再可信,數(shù)據(jù)庫(kù)遷移到云上,面臨更加嚴(yán)峻的挑戰(zhàn),數(shù)據(jù)云上安全問題成為不可回避的問題。數(shù)據(jù)庫(kù)中保存著關(guān)鍵數(shù)據(jù),云上主機(jī)存在眾多不安全隱患,所以云上數(shù)據(jù)庫(kù)加密成為解決這些安全隱患的一劑良藥。
1. 對(duì)稱加密算法
數(shù)據(jù)庫(kù)加密不同于文件加密和通訊加密等常見加密。數(shù)據(jù)庫(kù)加密需要特別關(guān)注加密算法是否存在膨脹性,并對(duì)加密算法的性能有苛刻的要求。2009年,數(shù)據(jù)庫(kù)安全廠商安華金和在進(jìn)行數(shù)據(jù)庫(kù)加密產(chǎn)品研發(fā)時(shí),首先排除對(duì)稱算法中的流加密算法,原因是這種算法雖然在運(yùn)行效率和解決數(shù)據(jù)膨脹上有天然優(yōu)勢(shì),但在一定情況下存在不安全性。為了追求加密的效率,目前國(guó)內(nèi)依然有部分安全廠商采用這種方式提供數(shù)據(jù)庫(kù)加密服務(wù),卻忽略了這種加密產(chǎn)品最基本的安全性要求。
更穩(wěn)妥的做法是采用對(duì)稱加密中的分組加密(AES)進(jìn)行相關(guān)加密處理。分組加密安全性高,在安全方面比較有保障,但需要解決由于數(shù)據(jù)塊大小限制帶來的膨脹問題。這需要根據(jù)具體情況或字段設(shè)計(jì)足夠精妙的使用方案,來針對(duì)不同字段或類型解決膨脹問題,最終形成完美的數(shù)據(jù)庫(kù)加密方案。
2. 國(guó)產(chǎn)密碼算法
密碼算法是保障信息安全的核心技術(shù),對(duì)于國(guó)家機(jī)密及各行業(yè)核心數(shù)據(jù)的保護(hù)起到至關(guān)重要的作用,使用3DES、SHA-1、RSA等國(guó)際通用的密碼算法體系及相關(guān)標(biāo)準(zhǔn),存在較大的安全隱患。因此,國(guó)家有關(guān)機(jī)關(guān)和監(jiān)管機(jī)構(gòu)站在國(guó)家安全和長(zhǎng)遠(yuǎn)戰(zhàn)略的高度提出了推動(dòng)國(guó)密算法應(yīng)用實(shí)施、加強(qiáng)行業(yè)安全可控的要求。目前國(guó)內(nèi)的數(shù)據(jù)庫(kù)加密產(chǎn)品在面對(duì)用戶的選型評(píng)估時(shí),相當(dāng)一部分是以支持國(guó)密算法為首要條件,這對(duì)于政府、軍工、保密等相關(guān)行業(yè)用戶來說非常重要,國(guó)家信息安全的保障必須擺脫對(duì)國(guó)外技術(shù)和產(chǎn)品的過度依賴,加密算法作為關(guān)鍵安全技術(shù)更應(yīng)國(guó)產(chǎn)化。
具體而言,國(guó)產(chǎn)密碼算法(國(guó)密算法)是指國(guó)家密碼局認(rèn)定的國(guó)產(chǎn)商用密碼算法,比如,在金融領(lǐng)域目前主要使用公開的SM2、SM3、SM4三類算法,分別是非對(duì)稱算法、哈希算法和對(duì)稱算法。
以SM4算法為例:SM4分組密碼算法是我國(guó)自主設(shè)計(jì)的分組對(duì)稱密碼算法,用于實(shí)現(xiàn)數(shù)據(jù)的加密/解密運(yùn)算,以保證數(shù)據(jù)和信息的機(jī)密性。要保證一個(gè)對(duì)稱密碼算法的安全性的基本條件是其具備足夠的密鑰長(zhǎng)度,SM4算法與AES算法具有相同的密鑰長(zhǎng)度分組長(zhǎng)度128比特,因此在安全性上高于3DES算法。
作者:安華金和 思成