加密的艺术
加密算法最早誕生在什么時(shí)候?計(jì)算機(jī)出現(xiàn)之后嗎?不,早在公元前 7 世紀(jì),古希臘人就已經(jīng)在使用加密算法了。他們使用一根叫 scytale 的棍子來(lái)傳遞加密信息,加密時(shí)先繞棍子卷一張紙條,把信息沿棒水平方向?qū)?#xff0c;寫(xiě)一個(gè)字旋轉(zhuǎn)一下,直到寫(xiě)完。解下來(lái)后,紙條上的文字消息雜亂無(wú)章,這就是密文。將它繞在另一個(gè)同等尺寸的棒子上后,就能看到原始的消息。如果不知道棍子的粗細(xì),就無(wú)法解密里面的內(nèi)容。
加密方式發(fā)展到今天,相比 scytale 的簡(jiǎn)單原理已經(jīng)有了無(wú)法想象的巨大發(fā)展,我們現(xiàn)在基于更復(fù)雜的數(shù)學(xué)過(guò)程,即更為復(fù)雜的算法來(lái)進(jìn)行加密。許多使用現(xiàn)代手段創(chuàng)建的成熟密碼系統(tǒng)基本被認(rèn)為是不可破解的。一個(gè)不可被破解的加密方式到底有多復(fù)雜?下面我們就來(lái)領(lǐng)略一下。
什么是加密?
我們通常所說(shuō)的加密是指使用密鑰將純文本轉(zhuǎn)換為難以理解的序列的方法,通常由兩個(gè)基本部分構(gòu)成:算法和密鑰。
算法是將普通的文本(或者可以理解的信息)與一串?dāng)?shù)字(密鑰)的結(jié)合,產(chǎn)生不可理解的密文的步驟,密鑰是用來(lái)對(duì)數(shù)據(jù)進(jìn)行編碼和解碼的一種算法。加密可以描述為一種方法,通過(guò)該方法,明文和密鑰通過(guò)密碼算法,產(chǎn)生秘密文本。
在期望的情況下,加密文本的內(nèi)容只有擁有對(duì)應(yīng)密鑰的用戶(hù)才能訪(fǎng)問(wèn)。除了文本消息,現(xiàn)代加密還可以應(yīng)用于其他電子傳輸信息,例如語(yǔ)音消息、圖像文件或程序代碼等。
加密方式分類(lèi)
在現(xiàn)代,我們主要用到對(duì)稱(chēng)加密(私人密鑰加密)和非對(duì)稱(chēng)加密(公開(kāi)密鑰加密)兩種加密方式。
對(duì)稱(chēng)加密方法
對(duì)稱(chēng)加密起源于凱撒密碼等古老的加密方法。其主要原理是文件加密和解密使用相同的密鑰。如果兩個(gè)通信方想要交換加密數(shù)據(jù),則發(fā)送方和接收方都需要擁有相同密鑰的副本,同時(shí)還需要找到一種秘密傳輸共享密鑰的方法。為了保護(hù)加密信息不被第三方訪(fǎng)問(wèn),密鑰是保密的,密鑰的長(zhǎng)度也決定了該加密算法的安全性。
對(duì)稱(chēng)加密算法使用起來(lái)簡(jiǎn)單快捷,密鑰較短,且破譯困難。眾所周知的對(duì)稱(chēng)加密方法包括比較典型的數(shù)據(jù)加密標(biāo)準(zhǔn)(DES)及其高級(jí)加密標(biāo)準(zhǔn)(AES)。
數(shù)據(jù)加密標(biāo)準(zhǔn)(DES)
DES 是一種對(duì)稱(chēng)加密方法,由 IBM 在 1970 年代開(kāi)發(fā),并于 1977 年由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)標(biāo)準(zhǔn)化。按照當(dāng)時(shí)的標(biāo)準(zhǔn),DES 是一種安全的計(jì)算機(jī)輔助加密方法,是現(xiàn)代密碼學(xué)的基礎(chǔ)。密鑰長(zhǎng) 64 位,但實(shí)際上只有 56 位參與運(yùn)算(第 8、16、24、32、40、48、56、64 位是校驗(yàn)位,使得每個(gè)密鑰都有奇數(shù)個(gè) 1),在如今基本上已經(jīng)過(guò)時(shí)了。當(dāng)今的技術(shù),使用蠻力攻擊可以在短短幾個(gè)小時(shí)內(nèi)破解出 DES 密鑰。
該算法由排列和替換組成,整個(gè)過(guò)程需要 16 輪,其原理結(jié)構(gòu)圖如下:
首先是初始置換 ,64 位的塊被分成 32 位的塊;創(chuàng)建了左半塊 L0 和右半塊 R0。然后經(jīng)過(guò) 16 輪相同的操作(此處為函數(shù) f )將數(shù)據(jù)與密鑰組合。16 輪過(guò)后,左右兩塊重新組合,經(jīng)過(guò)最后的置換,得到密文。DES 加密密文的解密遵循相同的方案,但順序相反。
DES 的主要缺點(diǎn)是 56 位的密鑰長(zhǎng)度相對(duì)較小,無(wú)法承受當(dāng)今計(jì)算能力可用的蠻力攻擊。DES 的一種變體是 Triple-DES ( 3DES ) ,其中加密方法在三個(gè)連續(xù)輪次中執(zhí)行。但是 3DES 的有效密鑰長(zhǎng)度仍然只有 112 位,仍低于當(dāng)今 128 位的最低標(biāo)準(zhǔn)。因此,DES 已在很大程度上被取代。AES(Advanced Encryption Standard) 算法接替了 DES,它也是一種對(duì)稱(chēng)加密方法。
高級(jí)加密標(biāo)準(zhǔn)(AES)
到了 90 年代,很明顯最常用的加密標(biāo)準(zhǔn) DES 已經(jīng)落伍了,需要一個(gè)新的加密標(biāo)準(zhǔn)來(lái)替代。于是,AES 誕生了,由于其具有更高的安全性、靈活性,它也是美國(guó)聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。
AES 也是將加密后的明文分成塊,所以與 DES 一樣是基于塊加密的。該標(biāo)準(zhǔn)支持 128、192 和 256 位密鑰。但 AES 使用的不是 64 位的塊,而是使用大很多的 128 位塊,這些塊在連續(xù)幾輪中使用代換-置換網(wǎng)絡(luò)(Substitution-Permutation Network,SPN)進(jìn)行加密。加密過(guò)程大致分為四個(gè)步驟:
1、KeyExpansion 密鑰擴(kuò)展: AES 和 DES 一樣,對(duì)每個(gè)加密循環(huán)使用一個(gè)新的輪密鑰。在這個(gè)過(guò)程中,輸出密鑰的長(zhǎng)度也被擴(kuò)展,生成映射所需數(shù)量的 128 位輪密鑰。每個(gè)輪密鑰都基于擴(kuò)展輸出密鑰的一部分。所需的輪密鑰數(shù)等于輪數(shù)(R),包括關(guān)鍵輪,加上初始輪的輪密鑰(密鑰數(shù) = R + 1)。
2、Initial round 初始輪: 在初始輪中,將 128 位的輸入塊轉(zhuǎn)移到二維表(Array)中,并使用按位異或 XOR(AddRoundKey)鏈接到第一輪密鑰。該表由四行四列組成。每個(gè)單元包含要加密的塊的一個(gè)字節(jié)(8 位)。
3、加密輪數(shù): 加密輪數(shù)取決于使用的密鑰長(zhǎng)度:AES128 為 10 輪,AES192 為 12 輪,AES256 為 14 輪。每輪加密使用以下操作:
-
**SubBytes(字節(jié)替代) : ** 一個(gè)非線(xiàn)性替換步驟,其中根據(jù)查找表將每個(gè)字節(jié)替換為另一個(gè)字節(jié)。
-
ShiftRows(行移位): 一個(gè)轉(zhuǎn)置步驟,其中狀態(tài)的最后三行循環(huán)移位一定數(shù)量的步驟。
-
MixColumns(列混淆): 一種線(xiàn)性混合操作,它對(duì)狀態(tài)的列進(jìn)行操作,將每列中的四個(gè)字節(jié)組合在一起。
-
AddRoundKey(輪密鑰加): 在每輪加密結(jié)束時(shí),發(fā)生另一個(gè) AddRoundKey。就像初始輪一樣,基于數(shù)據(jù)塊與當(dāng)前輪次密鑰的異或鏈接。
4. 密鑰輪: 密鑰輪是最后的加密輪。與前幾輪不同的是,它不包括 MixColumns 轉(zhuǎn)換,因此只包括 SubBytes、ShiftRows 和 AddRoundKey 操作。最后一輪的結(jié)果得到密文。
由于其本身的算法,AES 已通過(guò)了高水平的安全性認(rèn)證。對(duì)于至少 128 位的密鑰長(zhǎng)度,蠻力攻擊是很低效的。除此之外,AES 還用作 WPA2、SSH 和 IPSec 的加密標(biāo)準(zhǔn)。該算法還用于加密壓縮文件存檔,例如 7-Zip 或 RAR。
以上兩種對(duì)稱(chēng)加密方法都是依托于對(duì)稱(chēng)加密的算法,而對(duì)稱(chēng)加密算法則分以下兩大類(lèi):
-
流密碼:也叫序列密碼,每次加密都通過(guò)密鑰生成一個(gè)密鑰流,解密也是使用同一個(gè)密鑰流,明文與同樣長(zhǎng)度的密鑰流進(jìn)行異或運(yùn)算得到密文,密文與同樣的密鑰流進(jìn)行異或運(yùn)算得到明文。
-
塊密碼:也叫分組密碼,它把加密和解密序列分成了一個(gè)個(gè)分組,最后把每一塊序列合并到一起,形成明文或者密文。
非對(duì)稱(chēng)加密方法
相對(duì)于對(duì)稱(chēng)加密加密通信的雙方需使用相同的密鑰來(lái)說(shuō),非對(duì)稱(chēng)加密的通信雙方會(huì)為每個(gè)頁(yè)面都生成一個(gè)密鑰對(duì)。通信中的每個(gè)參與者都有兩把鑰匙可供使用:一把公鑰和一把私匙。為了能夠加密信息,每一方都必須事先聲明他們的公鑰,這被稱(chēng)為公鑰算法。這就是非對(duì)稱(chēng)密碼系統(tǒng)的優(yōu)勢(shì):與對(duì)稱(chēng)加密方法相反,密鑰永遠(yuǎn)不會(huì)離開(kāi)其所有者的視線(xiàn)。
下面我們通過(guò)一個(gè)簡(jiǎn)單例子來(lái)了解非對(duì)稱(chēng)加密。。假設(shè)用戶(hù) A 想向用戶(hù) B 發(fā)送一條加密消息,為此 A 需要 B 的公鑰,而 B 的公鑰允許 A 加密只有 B 的私鑰才能解密的消息。這樣除了 B,就在沒(méi)有其他人沒(méi)有人能夠閱讀該消息,包括 A 也無(wú)法解密。
這么做的優(yōu)點(diǎn)是任何人都可以使用用戶(hù) B 的公鑰加密消息,然后只能 B 的密鑰解密。由于僅交換公鑰,因此無(wú)需創(chuàng)建防篡改的安全通道,因?yàn)槟芙饷艿闹挥?B。
非對(duì)稱(chēng)加密最通用的加密算法是 Rivest、Shamir、Adleman (RSA)和 ECC。
Rivest、Shamir、Adleman (RSA)
1977 年,數(shù)學(xué)家 Rivest、Shamir 和 Adleman 提出了一種非對(duì)稱(chēng)加密算法,并以發(fā)明人的名字命名 —— RSA。RSA 是目前普遍認(rèn)為最安全、最優(yōu)秀的公鑰方法之一。
RSA 使用一種基于大素?cái)?shù)相乘的算法。如果將質(zhì)數(shù) 14,629 和 30,491 相乘,可以得到結(jié)果為 446,052,839。這個(gè)數(shù)只有四個(gè)可能的除數(shù):其中兩個(gè)是 1 和它本身,另外兩個(gè)是相乘前的原始素?cái)?shù)。如果將前兩個(gè)除數(shù)排除(因?yàn)槊總€(gè)數(shù)字都可以被 1 和它本身整除),那么將得到 14,629 和 30,491 的初始值。
以上就是 RSA 密鑰生成的基礎(chǔ)。公鑰和私鑰都代表兩對(duì)數(shù)字:
N 即兩個(gè)隨機(jī)選擇的非常大素?cái)?shù) p 和 q 的乘積 N = pxq,以及計(jì)算 N 的歐拉函數(shù) φ(N) = (p-1)(q-1)。
要生成公鑰,則需要 e,e 是一個(gè)根據(jù)一些限制(條件是 1< e < φ(N),且 e 與 φ(N) 互質(zhì))隨機(jī)選擇的數(shù)字。
要生成私鑰,則需要計(jì)算 e 對(duì)于 φ(N) 的模反元素 d。所謂“模反元素”就是指有一個(gè)整數(shù) d,可以使得 ed 被 φ(N) 除的余數(shù)為 1。滿(mǎn)足 (ed) modφ(N) = 1 ,即 ed = kφ(N) +1,k≥1 是一個(gè)任意的整數(shù);所以,若知道 e 和 φ(N) ,則很容易計(jì)算出 d。
然而只根據(jù) N 和 e(注意:不是 p 和 q)要計(jì)算出 d 是不可能的。因此,任何人都可對(duì)明文進(jìn)行加密,但是只有授權(quán)用戶(hù)(知道 d)才可對(duì)密文解密。
RSA 算法的保密強(qiáng)度隨其密鑰的長(zhǎng)度增加而增強(qiáng)。但是,密鑰越長(zhǎng),其加解密所耗用的時(shí)間也越長(zhǎng)。因此,要根據(jù)所保護(hù)信息的敏感程度與攻擊者破解所要花費(fèi)的代價(jià)值不值得以及系統(tǒng)所要求的反應(yīng)時(shí)間來(lái)綜合考慮。
目前互聯(lián)網(wǎng)中最常用的 SSL/TLS 協(xié)議就是基于 RSA 算法。如果想要使用特定公鑰加密的信息只能使用附屬于該公匙的私鑰進(jìn)行解密。經(jīng)客戶(hù)端驗(yàn)證公鑰可以與私鑰進(jìn)行匹配,才會(huì)建立安全連接。
ECC
在上圖中我們還可以看到非對(duì)稱(chēng)加密的另一種算法 ECC,即橢圓加密算法。其數(shù)學(xué)基礎(chǔ)是利用橢圓曲線(xiàn)上的有理點(diǎn)構(gòu)成 Abel 加法群上橢圓離散對(duì)數(shù)的計(jì)算困難性。ECC 的主要優(yōu)勢(shì)是在某些情況下比其他的方法(比如 RSA)使用更小的密鑰,提供相當(dāng)或更高等級(jí)的安全。
回到非對(duì)稱(chēng)加密本身。這種加密算法除去“無(wú)需創(chuàng)建防篡改的安全通道”這一有點(diǎn)外,也有一個(gè)不可忽視的缺點(diǎn):無(wú)法確認(rèn)通信伙伴的身份。也就是說(shuō)在非對(duì)稱(chēng)加密中,B 不能確定加密的消息確實(shí)來(lái)自 A,理論上第三個(gè)用戶(hù) C 可以使用 B 的公鑰來(lái)加密并傳遞消息。此外,A 也不能確定公鑰是否真的屬于 B,公鑰可能是由 C 創(chuàng)建并傳達(dá)給 A 的,這樣可以攔截 A 發(fā)給 B 的消息。
因此使用非對(duì)稱(chēng)加密,需要一種機(jī)制以便用戶(hù)可以測(cè)試其通信伙伴的身份驗(yàn)證。
目前我們使用數(shù)字證書(shū)和簽名來(lái)解決這個(gè)問(wèn)題:
-
數(shù)字證書(shū):為了確保非對(duì)稱(chēng)加密方法的安全,通信伙伴可以通過(guò)官方認(rèn)證機(jī)構(gòu)確認(rèn)其公鑰的真實(shí)性。例如,通過(guò) HTTPS 的 TLS/SSL 加密數(shù)據(jù)傳輸。
-
數(shù)字簽名:雖然數(shù)字證書(shū)可用于驗(yàn)證公鑰,但數(shù)字簽名可用于識(shí)別加密消息的發(fā)送者。私鑰用于生成簽名,然后接收方使用發(fā)送方的公鑰驗(yàn)證該簽名。
以上就是我們目前主要用到的加密方式啦,但是加密方式不僅僅如此,隨著互聯(lián)網(wǎng)的不斷發(fā)展,肯定會(huì)越來(lái)越復(fù)雜,盡管它們涉及了很多數(shù)學(xué)知識(shí),了解起來(lái)非常枯燥,但是正是這些枯燥的數(shù)學(xué)讓我們的信息越來(lái)越安全。
總結(jié)
- 上一篇: 亿级流量系统架构演进之路
- 下一篇: 代码签名证书,让软件真正拥有姓名!