深入淺出談加密 加密技術(shù)已經(jīng)滲透進(jìn)了整個(gè)信息時(shí)代,任何人都不可避免地要接觸到——即使你根本不知道“加密”是什么。銀行卡、登錄計(jì)算機(jī)的口令、電子郵件的賬號(hào)密碼……無一例外地跟加密技術(shù)緊緊聯(lián)系在一起。 任何一個(gè)安全專家提起如今信息技術(shù)的安全保護(hù)措施,都不可避免要涉及一個(gè)詞:加密(encrypt)。的確,縱觀當(dāng)今信息世界,加密離我們并不遙遠(yuǎn),從小小的個(gè)人密碼,到重要機(jī)密文件,無一不是經(jīng)過加密后的產(chǎn)物。 許多人一提起“加密”,都會(huì)有一種畏懼心理,以為加密技術(shù)絕對(duì)是“新手勿近”的尖端科技。其實(shí)不然,加密實(shí)際上一直陪伴在你一生的成長(zhǎng)之中,回憶一下小時(shí)候很多人都玩過的智力游戲:007收到遇害同事的字條,上面寫著4FEFKKILJK81IP,根據(jù)事先約定,已知C=3、Q=H,問該同事要傳遞什么信息給007?如果把這道題目放到信息技術(shù)領(lǐng)域來看待,就是一條經(jīng)過簡(jiǎn)單替換字符算法加密的字符串,它把原始字符改為使用相對(duì)應(yīng)的數(shù)字排序來替代,從而產(chǎn)生了一組“沒有意義”的字符組合,但是因?yàn)槲覀冎繡=3等若干條件,所以稍加排序即可得到這樣的句子:Do not trust Hary,這個(gè)過程也被稱為“解密”(decrypt)。 有些讀者也許會(huì)不屑一顧,就這么簡(jiǎn)單的游戲也算加密?別忘了,我們是在已經(jīng)知道“C=3”的前提下完成“解密”的,換句話說,也就是已經(jīng)知道了“算法”,否則光憑以上一組不知所云的字符串,誰能解開其中的秘密?
加密和解密 “就不讓你直接看到信息”——將與之相似的思路加以擴(kuò)充,便成了“加密”的來由;而拓展“我偏要看到你不想讓我看的信息”的思想,則發(fā)展出了“解密”技術(shù)。加密和解密從誕生之日起,就是一對(duì)不可分割的難兄難弟。 加密作為保障數(shù)據(jù)安全的一種方式,很早就出現(xiàn)在人類的信息傳遞中,從遠(yuǎn)古時(shí)代開始,人們就已經(jīng)在采用一種如今稱為“編碼”(Code)的方法用于保護(hù)文字信息。最早影響全世界的加密技術(shù)誕生于戰(zhàn)爭(zhēng)年代,由德國(guó)人發(fā)明,用于傳遞情報(bào)信息;而最早影響全世界的解密技術(shù),也誕生于戰(zhàn)爭(zhēng)年代,由英美人開發(fā)出來用于破譯德國(guó)人的情報(bào)信息。正是戰(zhàn)爭(zhēng)讓加解密技術(shù)不斷改進(jìn)發(fā)展,直到現(xiàn)在,加密技術(shù)仍然在為信息時(shí)代的數(shù)據(jù)安全服務(wù)。 說了這么多,也該為加密技術(shù)做一個(gè)較為準(zhǔn)確而科學(xué)的概念了,所謂“加密”,就是對(duì)原內(nèi)容為明文的文件或數(shù)據(jù)按某種算法進(jìn)行處理,使其成為不可讀的代碼,經(jīng)過這樣處理的數(shù)據(jù)通常稱為“密文”,密文只能在經(jīng)過相對(duì)應(yīng)的反向算法處理后才能恢復(fù)原來的內(nèi)容,通過這樣的途徑來達(dá)到保護(hù)數(shù)據(jù)不被非法竊取、閱讀的目的,而將該編碼信息轉(zhuǎn)化為其原來數(shù)據(jù)的過程,就是“解密”。 無論哪一個(gè)國(guó)家,都會(huì)有專家專注于加密技術(shù)的研究,因此也就出現(xiàn)了形形色色的加密算法,這些加密算法按照生物界“弱肉強(qiáng)食”的定律發(fā)展并完善著。其中,強(qiáng)度高(不容易被破解)的算法得以保留和繼續(xù)發(fā)展,強(qiáng)度低的算法最終被時(shí)間淘汰。除了一些公開的加密算法之外,也存在著一部分未公開的私人加密算法。通常我們提及加密技術(shù)時(shí)所說的“MD5加密”、“SHA-1加密”、“RSA加密”等,其實(shí)就是在說它們所采用的算法。
算法:關(guān)鍵的抉擇 “我想要葡萄,還想要橙子,可是我只能選擇其中一樣,我該選哪個(gè)?”如果要為自己的數(shù)據(jù)加密,我們就不得不面對(duì)這樣一個(gè)選擇,因?yàn)槭澜缟系乃惴ú恢挂粋€(gè),究竟什么算法才是最適合的呢?于是,我們逐漸陷入一個(gè)選擇的泥潭中。其實(shí),在選擇使用哪種算法作為你的加密基礎(chǔ)前,如果能對(duì)各種常見算法的原理有個(gè)大概的了解,相信你就不會(huì)感到那么迷茫了。
基于“消息摘要”的算法 “消息摘要”(Message Digest)是一種能產(chǎn)生特殊輸出格式的算法,這種加密算法的特點(diǎn)是:無論用戶輸入什么長(zhǎng)度的原始數(shù)據(jù),經(jīng)過計(jì)算后輸出的密文都是固定長(zhǎng)度的,這種算法的原理是根據(jù)一定的運(yùn)算規(guī)則對(duì)原數(shù)據(jù)進(jìn)行某種形式的提取,這種提取就是“摘要”,被“摘要”的數(shù)據(jù)內(nèi)容與原數(shù)據(jù)有密切聯(lián)系,只要原數(shù)據(jù)稍有改變,輸出的“摘要”便完全不同,因此,基于這種原理的算法便能對(duì)數(shù)據(jù)完整性提供較為健全的保障。但是,由于輸出的密文是提取原數(shù)據(jù)經(jīng)過處理的定長(zhǎng)值,所以它已經(jīng)不能還原為原數(shù)據(jù),即消息摘要算法是“不可逆”的,理論上無法通過反向運(yùn)算取得原數(shù)據(jù)內(nèi)容,因此它通常只能被用來做數(shù)據(jù)完整性驗(yàn)證,而不能作為原數(shù)據(jù)內(nèi)容的加密方案使用,否則誰也無法還原。盡管如此,“消息摘要”算法還是為密碼學(xué)提供了健全的防御體系,因?yàn)檫B專家也無法根據(jù)攔截到的密文還原出原來的內(nèi)容。 如今常用的“消息摘要”算法經(jīng)歷了多年驗(yàn)證發(fā)展而保留下來的算法已經(jīng)不多,這其中包括MD2、MD4、MD5、SHA、SHA-1/256/383/512等,其中最廣泛應(yīng)用的是基于MD4發(fā)展而來的MD5算法。 MD5算法 MD5算法的全稱是“消息摘要算法5”(Message-Digest Algorithm version.5),它是當(dāng)前公認(rèn)的強(qiáng)度最高的加密算法。出現(xiàn)在MD5之前的是MD2和MD4,雖然這三者的算法結(jié)構(gòu)多少有點(diǎn)相似,但是由于MD2誕生于8位計(jì)算的時(shí)代,因此它的設(shè)計(jì)與后來出現(xiàn)的MD4、MD5完全不同,因此不能進(jìn)行簡(jiǎn)單的替代。然而,無論是MD2、MD4還是MD5,它們都是在獲得一個(gè)隨機(jī)長(zhǎng)度信息的基礎(chǔ)上產(chǎn)生一個(gè)128位信息摘要的算法。 MD2算法是Rivest在1989年開發(fā)的,它很慢(因?yàn)槭菫?位機(jī)器設(shè)計(jì)的),但相當(dāng)安全。在這個(gè)算法中,首先要對(duì)信息進(jìn)行數(shù)據(jù)補(bǔ)位,使信息的字節(jié)長(zhǎng)度是16的倍數(shù)。然后,以一個(gè)16位的檢驗(yàn)和追加到信息末尾,并且根據(jù)這個(gè)新產(chǎn)生的信息計(jì)算出散列值(Hash),最終運(yùn)算結(jié)果即為類似于“d41d8cd98f00b204e9800998ecf8427e”的摘要,而且這個(gè)值是惟一的。 為了加強(qiáng)算法的安全性,Rivest在1990年又開發(fā)出MD4算法。MD4算法同樣需要填補(bǔ)信息以確保信息的字節(jié)長(zhǎng)度加上448后能被512整除(信息字節(jié)長(zhǎng)度除以512的余數(shù)為448)。然后,一個(gè)以64位二進(jìn)制表示的信息的最初長(zhǎng)度被添加進(jìn)來。
然而,MD4存在一個(gè)嚴(yán)重漏洞,那就是“沖突”(Collisions)。“沖突”是所有基于“摘要”的算法都要面對(duì)的最大問題,由于它們是根據(jù)“不完整”的數(shù)據(jù)內(nèi)容產(chǎn)生的密文,如果運(yùn)算過程存在瑕疵,就會(huì)在處理某些不同數(shù)據(jù)時(shí)產(chǎn)生相同的摘要,這帶來的后果可是致命的。因?yàn)?#8220;摘要”算法的原則是原數(shù)據(jù)不可還原,因此驗(yàn)證的過程并不同于簡(jiǎn)單加密運(yùn)算里的“數(shù)據(jù)還原匹配”,驗(yàn)證端同樣要根據(jù)原數(shù)據(jù)運(yùn)算得到的摘要作為憑據(jù)與客戶端發(fā)來的摘要進(jìn)行匹配檢驗(yàn),如果兩段字符串完全相同,即視為驗(yàn)證通過。這是在“摘要算法”理論上“不可逆且惟一”的基礎(chǔ)上采用的安全檢驗(yàn)方法,驗(yàn)證方可以不需要索取原數(shù)據(jù),而只要擁有一個(gè)有效的摘要即可完成對(duì)客戶端的身份確認(rèn),大大減少了原數(shù)據(jù)被入侵者截獲的幾率。 但是這樣的驗(yàn)證方式就產(chǎn)生了一個(gè)“看似不可能”的缺陷:假如入侵者能偽造出一段數(shù)據(jù),使之能在通過“摘要”計(jì)算后產(chǎn)生的摘要與真正的原數(shù)據(jù)產(chǎn)生的摘要一樣,那么入侵者便能冒充原數(shù)據(jù)持有者通過身份驗(yàn)證。這在理論上是不可能的,然而現(xiàn)實(shí)總是不會(huì)讓人那么愉快,由于算法不可避免地出現(xiàn)了漏洞,使得這個(gè)設(shè)想成為了事實(shí),這就是“沖突”的來源:某兩個(gè)或多個(gè)數(shù)據(jù)產(chǎn)生的摘要出現(xiàn)了完全雷同的現(xiàn)象,使得用戶能在輸入了即使不是原數(shù)據(jù)的密碼后能順利通過驗(yàn)證,因?yàn)樯矸輽z驗(yàn)程序發(fā)現(xiàn)原本儲(chǔ)存的用戶信息的簽名數(shù)據(jù)與接收到的數(shù)據(jù)的運(yùn)算結(jié)果完全一致,于是認(rèn)為請(qǐng)求方為合法用戶,就給予通過了。這種運(yùn)算結(jié)果相同的現(xiàn)象,就是“沖突”。
“沖突”會(huì)造成非常危險(xiǎn)的后果,因此MD4被無情地拋棄了,取而代之的是在MD4基礎(chǔ)上加強(qiáng)了算法的MD5,它在MD4的基礎(chǔ)上增加了“安全帶”(Safety Belts)的概念,雖然MD5比MD4稍微慢一些,但卻大大減小了沖突的發(fā)生率,雖然很早以前就有專家發(fā)現(xiàn)MD5算法在專門用于尋找“沖突”的機(jī)器上平均每24天就會(huì)產(chǎn)生一個(gè)“沖突”,但是對(duì)于一般應(yīng)用來說,這種幾率非常低微,因此MD5至今仍然是最強(qiáng)健的加密算法之一。 有讀者也許會(huì)問,既然MD5是不可逆的,那么網(wǎng)絡(luò)上存在的那些“MD5密碼破解工具”又是什么回事?其實(shí),那并不是破解,至今MD5還沒能被完全破解過,雖然曾經(jīng)有過一篇報(bào)道稱中國(guó)的一個(gè)教授破解了MD5加密算法,但是后來這個(gè)結(jié)論又被推翻了。網(wǎng)絡(luò)上流傳的那些工具純粹是依賴于“運(yùn)氣+機(jī)器性能+耐心”的產(chǎn)品而已,它們的原理是“窮舉”,即程序在一定的數(shù)據(jù)范圍內(nèi)產(chǎn)生一系列數(shù)據(jù)組合進(jìn)行MD5運(yùn)算,再把運(yùn)算結(jié)果與獲取的摘要進(jìn)行比較,如果兩者相同,就被定義為“破解”了。這只是一種窮舉法而已,實(shí)際意義不大,要知道在不產(chǎn)生沖突的前提下生成一個(gè)與原數(shù)據(jù)完全相同的字符串要有多少運(yùn)氣的成分,更何況它還完全依賴于你的機(jī)器性能,如果對(duì)方密碼簡(jiǎn)單如123456這樣的形式,我們還可能僥幸在1分鐘~1天內(nèi)運(yùn)算出來,但是如果對(duì)方密碼是0e1WeTru9t@MD5這樣的組合呢?MD5的高強(qiáng)度使得它如此難以破解,因此成為大眾首選,許多入侵者在辛苦取得目標(biāo)網(wǎng)站數(shù)據(jù)庫后,一看password字段都是0ca175b9c0f726a831d895e269332461的形式,第一反應(yīng)都會(huì)是“暈倒!又白干了!” 對(duì)稱/非對(duì)稱密鑰加密算法 由于“摘要”算法加密的數(shù)據(jù)僅僅能作為一種身份驗(yàn)證的憑據(jù)使用,如果我們要對(duì)整個(gè)文檔數(shù)據(jù)進(jìn)行加密,就不能采用這種“不可逆”的算法了。“密鑰”算法(Key Encoding)的概念因此而被提出,與開頭提到的智力題類似,此類算法通過一個(gè)被稱為“密鑰”的憑據(jù)進(jìn)行數(shù)據(jù)加密處理,接收方通過加密時(shí)使用的“密鑰”字符串進(jìn)行解密,即雙方持有的“密碼”相同(對(duì)稱)。如果接收方不能提供正確的“密鑰”,解密出來的就不是原來的數(shù)據(jù)了。 以上是“對(duì)稱密鑰”的概念,那么“非對(duì)稱密鑰”又該怎么理解呢?有人用郵箱作為比喻,任何人都可以從郵箱的信封入口塞進(jìn)信件,但是取信的權(quán)力卻僅僅在于持有郵箱鑰匙的人的手上。這個(gè)眾人皆知的信封入口就是“公鑰”(Public Key),而你持有的郵箱鑰匙就是“私鑰”(Private Key)。這種算法規(guī)定,對(duì)方給你發(fā)送數(shù)據(jù)前,可以用“公鑰”加密后再發(fā)給你,但是這個(gè)“公鑰”也無法解開它自己加密的數(shù)據(jù),即加密過程是單向的,這樣即使數(shù)據(jù)被途中攔截,入侵者也無法對(duì)其進(jìn)行破解,能還原數(shù)據(jù)內(nèi)容的只有“私鑰”的持有者,這就是“非對(duì)稱密鑰”加密算法,也稱為“公共密鑰算法”。 你也許會(huì)想,這兩種形式加密出來的數(shù)據(jù)如果稍加耐心進(jìn)行分析,一定能找到變化規(guī)律從而直接破解。這個(gè)想法沒錯(cuò),但是專家早就思考過這個(gè)可能性了,因此這種算法雖然是采用某個(gè)字符串作為憑據(jù)進(jìn)行加密操作的,可是它可能把憑據(jù)拆分為多個(gè)不同的“子段”并進(jìn)行多次運(yùn)算,最終的結(jié)果就是讓你難以發(fā)現(xiàn)變化的規(guī)律,破解也就難上加難。 基于“對(duì)稱密鑰”的加密算法主要有DES、TripleDES、RC2、RC4、RC5和Blowfish等;基于“非對(duì)稱密鑰”的加密算法主要有RSA、Diffie-Hellman等。 對(duì)稱密鑰:DES、TripleDES算法 美國(guó)國(guó)家標(biāo)準(zhǔn)局在1973年開始研究除國(guó)防部以外其他部門的計(jì)算機(jī)系統(tǒng)的數(shù)據(jù)加密標(biāo)準(zhǔn),最終選用了IBM公司設(shè)計(jì)的方案作為非機(jī)密數(shù)據(jù)的正式數(shù)據(jù)加密標(biāo)準(zhǔn)(DES即Data Encryption Standard)。DES算法從誕生開始,就被各個(gè)領(lǐng)域廣泛采用,包括ATM柜員機(jī)、POS系統(tǒng)、收費(fèi)站等,DES以它高強(qiáng)度的保密性能為大眾服務(wù),那么,它是如何工作的呢? DES算法把64位的明文輸入塊變?yōu)?4位的密文輸出塊,它所使用的密鑰也是64位。首先,DES把輸入的64位數(shù)據(jù)塊按位重新組合,并把輸出分為L(zhǎng)0、R0兩部分,每部分各長(zhǎng)32位,并進(jìn)行前后置換,最終由L0輸出左32位,R0輸出右32位,根據(jù)這個(gè)法則經(jīng)過16次迭代運(yùn)算后,得到L16、R16,將此作為輸入,進(jìn)行與初始置換相反的逆置換,即得到密文輸出。 DES算法具有極高的安全性,到目前為止,除了用窮舉搜索法對(duì)DES算法進(jìn)行攻擊外,還沒有發(fā)現(xiàn)更有效的辦法,而56位長(zhǎng)密鑰的窮舉空間為256,這意味著如果一臺(tái)計(jì)算機(jī)的速度是每秒種檢測(cè)100萬個(gè)密鑰,那么它搜索完全部密鑰就需要將近2285年的時(shí)間,因此DES算法是一種很可靠的加密方法。 對(duì)稱密鑰:RC算法 RC系列算法是大名鼎鼎的RSA三人組設(shè)計(jì)的密鑰長(zhǎng)度可變的流加密算法,其中最流行的是RC4算法,RC系列算法可以使用2048位的密鑰,該算法的速度可以達(dá)到DES加密的10倍左右。 RC4算法的原理是“攪亂”, 它包括初始化算法和偽隨機(jī)子密碼生成算法兩大部分,在初始化的過程中,密鑰的主要功能是將一個(gè)256字節(jié)的初始數(shù)簇進(jìn)行隨機(jī)攪亂,不同的數(shù)簇在經(jīng)過偽隨機(jī)子密碼生成算法的處理后可以得到不同的子密鑰序列,將得到的子密鑰序列和明文進(jìn)行異或運(yùn)算(XOR)后,得到密文。 由于RC4算法加密采用的是異或方式,所以,一旦子密鑰序列出現(xiàn)了重復(fù),密文就有可能被破解,但是目前還沒有發(fā)現(xiàn)密鑰長(zhǎng)度達(dá)到128位的RC4有重復(fù)的可能性,所以,RC4也是目前最安全的加密算法之一。 非對(duì)稱密鑰:RSA算法 RSA算法是目前最流行的公鑰密碼算法,它使用長(zhǎng)度可以變化的密鑰。RSA是第一個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。 RSA算法的原理如下: 1.隨機(jī)選擇兩個(gè)大質(zhì)數(shù)p和q,p不等于q,計(jì)算N=pq; 2.選擇一個(gè)大于1小于N的自然數(shù)e,e必須與(p-1)×(q-1)互素。 3.用公式計(jì)算出d:d×e = 1 (mod (p-1)×(q-1)) 。 4.銷毀p和q。 最終得到的N和e就是“公鑰”,d就是“私鑰”,發(fā)送方使用N去加密數(shù)據(jù),接收方只有使用d才能解開數(shù)據(jù)內(nèi)容。 RSA的安全性依賴于大數(shù)分解,小于1024位的N已經(jīng)被證明是不安全的,而且由于RSA算法進(jìn)行的都是大數(shù)計(jì)算,使得RSA最快的情況也比DES慢上好幾倍,這也是RSA最大的缺陷,因此它通常只能用于加密少量數(shù)據(jù)或者加密密鑰。需要注意的是,RSA算法的安全性只是一種計(jì)算安全性,絕不是無條件的安全性,這是由它的理論基礎(chǔ)決定的。因此,在實(shí)現(xiàn)RSA算法的過程中,每一步都應(yīng)盡量從安全性方面考慮。
小密碼,大學(xué)問 隨著信息化走進(jìn)千家萬戶,人們?cè)絹碓疥P(guān)注自己的數(shù)據(jù)安全,而數(shù)據(jù)安全除了在攻防體系上必須有所保障以外,關(guān)鍵的一點(diǎn)就是要對(duì)其進(jìn)行強(qiáng)度夠高的加密,進(jìn)一步減小數(shù)據(jù)被盜竊后的損失。這一觀點(diǎn)早已在網(wǎng)絡(luò)論壇的發(fā)展中得到了證實(shí),早期的論壇數(shù)據(jù)庫都是未經(jīng)過加密處理就直接保存的,在這個(gè)前提下,只要入侵者拿到了數(shù)據(jù)庫,就等于拿到了整個(gè)論壇,因?yàn)槊艽a字段是明文形式的。有些重要的網(wǎng)站甚至使用一些后臺(tái)沒有提供數(shù)據(jù)加密方案的程序做站點(diǎn),這是非常不明智的。 確定了加密方案后,有些人就自己寫算法進(jìn)行數(shù)據(jù)加密,殊不知這也算產(chǎn)生了安全隱患,通常個(gè)人無法寫出高強(qiáng)度的加密算法,入侵者如果稍加分析便能破譯內(nèi)容,你的辛苦也就付之東流。相反,如果采用在國(guó)際得到安全認(rèn)證的流行加密方案,數(shù)據(jù)安全反而提高了,何樂而不為?
|