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