加密的藝術

雲叔_又拍雲發表於2021-10-01

加密演算法最早誕生在什麼時候?計算機出現之後嗎?不,早在公元前 7 世紀,古希臘人就已經在使用加密演算法了。他們使用一根叫 scytale 的棍子來傳遞加密資訊,加密時先繞棍子卷一張紙條,把資訊沿棒水平方向寫,寫一個字旋轉一下,直到寫完。解下來後,紙條上的文字訊息雜亂無章,這就是密文。將它繞在另一個同等尺寸的棒子上後,就能看到原始的訊息。如果不知道棍子的粗細,就無法解密裡面的內容。

加密方式發展到今天,相比 scytale 的簡單原理已經有了無法想象的巨大發展,我們現在基於更復雜的數學過程,即更為複雜的演算法來進行加密。許多使用現代手段建立的成熟密碼系統基本被認為是不可破解的。一個不可被破解的加密方式到底有多複雜?下面我們就來領略一下。

什麼是加密?

我們通常所說的加密是指使用金鑰將純文字轉換為難以理解的序列的方法,通常由兩個基本部分構成:演算法和金鑰。

演算法是將普通的文字(或者可以理解的資訊)與一串數字(金鑰)的結合,產生不可理解的密文的步驟,金鑰是用來對資料進行編碼和解碼的一種演算法。加密可以描述為一種方法,通過該方法,明文和金鑰通過密碼演算法,產生祕密文字。

在期望的情況下,加密文字的內容只有擁有對應金鑰的使用者才能訪問。除了文字訊息,現代加密還可以應用於其他電子傳輸資訊,例如語音訊息、影像檔案或程式程式碼等。

加密方式分類

在現代,我們主要用到對稱加密(私人金鑰加密)和非對稱加密(公開金鑰加密)兩種加密方式。

對稱加密方法

對稱加密起源於凱撒密碼等古老的加密方法。其主要原理是檔案加密和解密使用相同的金鑰。如果兩個通訊方想要交換加密資料,則傳送方和接收方都需要擁有相同金鑰的副本,同時還需要找到一種祕密傳輸共享金鑰的方法。為了保護加密資訊不被第三方訪問,金鑰是保密的,金鑰的長度也決定了該加密演算法的安全性。

對稱加密演算法使用起來簡單快捷,金鑰較短,且破譯困難。眾所周知的對稱加密方法包括比較典型的資料加密標準(DES)及其高階加密標準(AES)。

資料加密標準(DES)

DES 是一種對稱加密方法,由 IBM 在 1970 年代開發,並於 1977 年由美國國家標準與技術研究院(NIST)標準化。按照當時的標準,DES 是一種安全的計算機輔助加密方法,是現代密碼學的基礎。金鑰長 64 位,但實際上只有 56 位參與運算(第 8、16、24、32、40、48、56、64 位是校驗位,使得每個金鑰都有奇數個 1),在如今基本上已經過時了。當今的技術,使用蠻力攻擊可以在短短几個小時內破解出 DES 金鑰。

該演算法由排列和替換組成,整個過程需要 16 輪,其原理結構圖如下:

首先是初始置換 ,64 位的塊被分成 32 位的塊;建立了左半塊 L0 和右半塊 R0。然後經過 16 輪相同的操作(此處為函式 f )將資料與金鑰組合。16 輪過後,左右兩塊重新組合,經過最後的置換,得到密文。DES 加密密文的解密遵循相同的方案,但順序相反。

DES 的主要缺點是 56 位的金鑰長度相對較小,無法承受當今計算能力可用的蠻力攻擊。DES 的一種變體是 Triple-DES ( 3DES ) ,其中加密方法在三個連續輪次中執行。但是 3DES 的有效金鑰長度仍然只有 112 位,仍低於當今 128 位的最低標準。因此,DES 已在很大程度上被取代。AES(Advanced Encryption Standard) 演算法接替了 DES,它也是一種對稱加密方法。

高階加密標準(AES)

到了 90 年代,很明顯最常用的加密標準 DES 已經落伍了,需要一個新的加密標準來替代。於是,AES 誕生了,由於其具有更高的安全性、靈活性,它也是美國聯邦政府採用的一種區塊加密標準。

AES 也是將加密後的明文分成塊,所以與 DES 一樣是基於塊加密的。該標準支援 128、192 和 256 位金鑰。但 AES 使用的不是 64 位的塊,而是使用大很多的 128 位塊,這些塊在連續幾輪中使用代換-置換網路(Substitution-Permutation Network,SPN)進行加密。加密過程大致分為四個步驟:

1、KeyExpansion 金鑰擴充套件: AES 和 DES 一樣,對每個加密迴圈使用一個新的輪金鑰。在這個過程中,輸出金鑰的長度也被擴充套件,生成對映所需數量的 128 位輪金鑰。每個輪金鑰都基於擴充套件輸出金鑰的一部分。所需的輪金鑰數等於輪數(R),包括關鍵輪,加上初始輪的輪金鑰(金鑰數 = R + 1)。

2、Initial round 初始輪: 在初始輪中,將 128 位的輸入塊轉移到二維表(Array)中,並使用按位異或 XOR(AddRoundKey)連結到第一輪金鑰。該表由四行四列組成。每個單元包含要加密的塊的一個位元組(8 位)。

在 AddRoundKey 中,將每個狀態中的位元組與該回合金鑰做異或

3、加密輪數: 加密輪數取決於使用的金鑰長度:AES128 為 10 輪,AES192 為 12 輪,AES256 為 14 輪。每輪加密使用以下操作:

  • SubBytes(位元組替代) : 一個非線性替換步驟,其中根據查詢表將每個位元組替換為另一個位元組。
  • ShiftRows(行移位): 一個轉置步驟,其中狀態的最後三行迴圈移位一定數量的步驟。
  • MixColumns(列混淆): 一種線性混合操作,它對狀態的列進行操作,將每列中的四個位元組組合在一起。
  • AddRoundKey(輪金鑰加): 在每輪加密結束時,發生另一個 AddRoundKey。就像初始輪一樣,基於資料塊與當前輪次金鑰的異或連結。

4. 金鑰輪: 金鑰輪是最後的加密輪。與前幾輪不同的是,它不包括 MixColumns 轉換,因此只包括 SubBytes、ShiftRows 和 AddRoundKey 操作。最後一輪的結果得到密文。

由於其本身的演算法,AES 已通過了高水平的安全性認證。對於至少 128 位的金鑰長度,蠻力攻擊是很低效的。除此之外,AES 還用作 WPA2、SSH 和 IPSec 的加密標準。該演算法還用於加密壓縮檔案存檔,例如 7-Zip 或 RAR。

以上兩種對稱加密方法都是依託於對稱加密的演算法,而對稱加密演算法則分以下兩大類:

  • 流密碼:也叫序列密碼,每次加密都通過金鑰生成一個金鑰流,解密也是使用同一個金鑰流,明文與同樣長度的金鑰流進行異或運算得到密文,密文與同樣的金鑰流進行異或運算得到明文。
  • 塊密碼:也叫分組密碼,它把加密和解密序列分成了一個個分組,最後把每一塊序列合併到一起,形成明文或者密文。

非對稱加密方法

相對於對稱加密加密通訊的雙方需使用相同的金鑰來說,非對稱加密的通訊雙方會為每個頁面都生成一個金鑰對。通訊中的每個參與者都有兩把鑰匙可供使用:一把公鑰和一把私匙。為了能夠加密資訊,每一方都必須事先宣告他們的公鑰,這被稱為公鑰演算法。這就是非對稱密碼系統的優勢:與對稱加密方法相反,金鑰永遠不會離開其所有者的視線。

下面我們通過一個簡單例子來了解非對稱加密。。假設使用者 A 想向使用者 B 傳送一條加密訊息,為此 A 需要 B 的公鑰,而 B 的公鑰允許 A 加密只有 B 的私鑰才能解密的訊息。這樣除了 B,就在沒有其他人沒有人能夠閱讀該訊息,包括 A 也無法解密。

這麼做的優點是任何人都可以使用使用者 B 的公鑰加密訊息,然後只能 B 的金鑰解密。由於僅交換公鑰,因此無需建立防篡改的安全通道,因為能解密的只有 B。

非對稱加密最通用的加密演算法是 Rivest、Shamir、Adleman (RSA)和 ECC。

Rivest、Shamir、Adleman (RSA)

1977 年,數學家 Rivest、Shamir 和 Adleman 提出了一種非對稱加密演算法,並以發明人的名字命名 —— RSA。RSA 是目前普遍認為最安全、最優秀的公鑰方法之一。

RSA 使用一種基於大素數相乘的演算法。如果將質數 14,629 和 30,491 相乘,可以得到結果為 446,052,839。這個數只有四個可能的除數:其中兩個是 1 和它本身,另外兩個是相乘前的原始素數。如果將前兩個除數排除(因為每個數字都可以被 1 和它本身整除),那麼將得到 14,629 和 30,491 的初始值。

以上就是 RSA 金鑰生成的基礎。公鑰和私鑰都代表兩對數字:

N 即兩個隨機選擇的非常大素數 p 和 q 的乘積 N = pxq,以及計算 N 的尤拉函式 φ(N) = (p-1)(q-1)。

要生成公鑰,則需要 e,e 是一個根據一些限制(條件是 1< e < φ(N),且 e 與 φ(N) 互質)隨機選擇的數字。

要生成私鑰,則需要計算 e 對於 φ(N) 的模反元素 d。所謂“模反元素”就是指有一個整數 d,可以使得 ed 被 φ(N) 除的餘數為 1。滿足 (ed) modφ(N) = 1 ,即 ed = kφ(N) +1,k≥1 是一個任意的整數;所以,若知道 e 和 φ(N) ,則很容易計算出 d。

然而只根據 N 和 e(注意:不是 p 和 q)要計算出 d 是不可能的。因此,任何人都可對明文進行加密,但是隻有授權使用者(知道 d)才可對密文解密。

RSA 演算法的保密強度隨其金鑰的長度增加而增強。但是,金鑰越長,其加解密所耗用的時間也越長。因此,要根據所保護資訊的敏感程度與攻擊者破解所要花費的代價值不值得以及系統所要求的反應時間來綜合考慮。

目前網際網路中最常用的 SSL/TLS 協議就是基於 RSA 演算法。如果想要使用特定公鑰加密的資訊只能使用附屬於該公匙的私鑰進行解密。經客戶端驗證公鑰可以與私鑰進行匹配,才會建立安全連線。

一些主流 SSL 證書加密演算法均為 RSA 演算法

ECC

在上圖中我們還可以看到非對稱加密的另一種演算法 ECC,即橢圓加密演算法。其數學基礎是利用橢圓曲線上的有理點構成 Abel 加法群上橢圓離散對數的計算困難性。ECC 的主要優勢是在某些情況下比其他的方法(比如 RSA)使用更小的金鑰,提供相當或更高等級的安全。

回到非對稱加密本身。這種加密演算法除去“無需建立防篡改的安全通道”這一有點外,也有一個不可忽視的缺點:無法確認通訊夥伴的身份。也就是說在非對稱加密中,B 不能確定加密的訊息確實來自 A,理論上第三個使用者 C 可以使用 B 的公鑰來加密並傳遞訊息。此外,A 也不能確定公鑰是否真的屬於 B,公鑰可能是由 C 建立並傳達給 A 的,這樣可以攔截 A 發給 B 的訊息。

因此使用非對稱加密,需要一種機制以便使用者可以測試其通訊夥伴的身份驗證。

目前我們使用數字證書和簽名來解決這個問題:

  • 數字證書:為了確保非對稱加密方法的安全,通訊夥伴可以通過官方認證機構確認其公鑰的真實性。例如,通過 HTTPS 的 TLS/SSL 加密資料傳輸。
  • 數字簽名:雖然數字證書可用於驗證公鑰,但數字簽名可用於識別加密訊息的傳送者。私鑰用於生成簽名,然後接收方使用傳送方的公鑰驗證該簽名。

以上就是我們目前主要用到的加密方式啦,但是加密方式不僅僅如此,隨著網際網路的不斷髮展,肯定會越來越複雜,儘管它們涉及了很多數學知識,瞭解起來非常枯燥,但是正是這些枯燥的數學讓我們的資訊越來越安全。

推薦閱讀

電信詐騙?一招讓騙子血本無歸!

靈魂畫手:漫畫圖解 SSH

相關文章