CRC-32 檢查碼
檢查碼用來確認資料是否完整送達,而不必把整份資料和原件逐一比對。傳送方算出一個簡短的數字,接收方再算一次;兩者相符的話,資料在途中多半沒有損壞。ZIP 檔、PNG 圖片和乙太網路都用它。
CRC-32 把訊息當成一個巨大的二進位數字,除以一個固定的多項式;32 位元的餘數就是結果。實務上會搭配事先算好的表格逐位元組計算,所以速度非常快。
弱點
它防的是意外錯誤,而不是有人故意竄改訊息。任何人都能調整四個位元組,讓偽造的訊息和真的有相同的 CRC,最後一步就示範了這一點。要偵測刻意的竄改,需要密碼學雜湊,或者更好的做法,數位簽章。
規格文件
MD5 已被攻破的雜湊
MD5 曾經多年是通用的雜湊演算法。它把任何訊息轉成 128 位元,同一段訊息永遠得到相同結果,而且看不出與原文的關聯。過去用來儲存密碼、檢查下載檔案和簽署憑證。
它把訊息填充成 512 位元的區塊,再對四個 32 位元暫存器做 64 步加法、旋轉與邏輯運算,把每個區塊混合進去。
弱點
自 2004 年起,用一般電腦就能在幾秒內造出碰撞,也就是兩段不同的訊息卻有相同的 MD5。2012 年,惡意程式 Flame 利用 MD5 碰撞偽造了微軟的憑證。它的速度也快到一張顯示卡每秒可以試數十億個密碼。如今它只適合當作防範意外錯誤的檢查碼,就像 CRC 一樣。
規格文件
SHA-256 安全雜湊
SHA-256 撐起了網際網路的一大部分,從 HTTPS 憑證、軟體簽章到 Git 和比特幣都用到它。它產生 256 位元,而且和 MD5 不同,至今沒有人找到碰撞,也沒有人找到從結果回推訊息的方法。
它的運作方式和 MD5 類似,但有八個暫存器、64 輪,以及一個區塊擴展程序,其中每個新字都取決於前面四個字。訊息只要改一個位元,結果平均就會改變一半的位元。
弱點
它是安全的雜湊,但速度很快,所以單靠它不足以儲存密碼:攻擊者每秒可以試數十億個候選密碼。這正是 Argon2id 這類刻意放慢的演算法存在的原因。量子電腦只會讓它的位元強度減半(Grover 演算法),仍然留有很大的餘裕。
規格文件
SHA3-256 安全雜湊
SHA-3 是 NIST 在 2015 年透過公開競賽選出的標準。原因不是 SHA-256 被攻破,而是希望有一個構造完全不同的替代方案,以防哪天 SHA-2 家族出現弱點。
它不使用串接的區塊,而是用一塊「海綿」:一個 1600 位元的狀態,分段吸收訊息,最後再擠出結果。每一輪執行五個步驟 θ、ρ、π、χ、ι,其中只有 χ 是非線性的。同一塊海綿也用來建構 SHAKE128 與 SHAKE256,ML-KEM 和 ML-DSA 內部都用到它們。
弱點
目前沒有已知的實際弱點。和 SHA-256 一樣,它太快了,不適合用來儲存密碼。
規格文件
Argon2id 儲存密碼
儲存密碼需要的不是快速的雜湊,而是刻意放慢的雜湊。Argon2id 在 2015 年贏得 Password Hashing Competition,也是 OWASP 目前推薦的演算法。除了時間,它還要求記憶體:每次嘗試都要填滿好幾 MB,其中每個區塊都依賴先前的區塊。
鹽值是一個隨機值,和結果一起儲存。有了它,兩個人用相同的密碼也會得到不同的結果,攻擊者必須逐一攻擊每個帳號。伺服器儲存的是最後顯示的那一整行,包含演算法、成本、鹽值和結果,但永遠不存密碼本身。
改變記憶體大小,看看時間如何增加。對你來說,那只是登入時的一瞬間;對試十億個密碼的人來說,卻是龐大的成本。
弱點
短的或常見的密碼還是猜得到,只是比較慢。這裡用的記憶體很少,好讓示範在任何裝置上都能執行;伺服器上至少會用 19 MiB,這是 OWASP 的建議。
規格文件
凱撒 古典密碼
凱撒大帝加密軍事訊息的方法,是把每個字母在字母表中往後移固定的位數。移 3 位時,A 變成 D,「hola」變成「krod」。解密時再往回移。
弱點
可能的金鑰只有 25 個,全部試一遍就夠了,就像最後一步那樣;只有一個會得到讀得懂的文字。此外,同一個字母永遠加密成同一個字母,語言中最常出現的字母就會洩漏金鑰。
Vigenère 古典密碼
維吉尼亞密碼用一個單字當金鑰,金鑰的每個字母決定訊息中對應字母要移幾位。訊息中同一個字母,會因位置不同而加密成不同的字母,因此大約三個世紀以來被稱為「無法破解的密碼」。
弱點
金鑰會重複。19 世紀時,查爾斯・巴貝奇和弗里德里希・卡西斯基發現,可以從密文中重複出現的片段推算出金鑰長度。知道長度後,就能把密文分成幾欄,每一欄都是簡單的凱撒密碼,用頻率分析就能破解。最後一步顯示的就是這些欄。
AES-256-GCM 對稱式加密
AES 從 2001 年起就是對稱式加密的標準:同一把金鑰負責加密和解密。HTTPS、使用 WPA2 和 WPA3 的 Wi-Fi、加密硬碟,以及幾乎所有通訊軟體都用它。它處理 16 位元組的區塊,排成 4×4 的格子,經過 14 輪的替換、位移、混合與加上金鑰。
GCM 是它的使用模式:AES 加密一個計數器,結果與訊息做 XOR,最後再算出一個能偵測任何竄改的標籤。nonce 是一個絕不能在同一把金鑰下重複使用的數字;這裡每次都會產生新的 nonce,所以即使訊息不變,結果也會改變。
弱點
使用隨機的 256 位元金鑰時,沒有實際可行的攻擊,就連量子電腦也不行。危險在於用錯:同一把金鑰重複使用 nonce,就能還原訊息並偽造標籤。更根本的問題是:兩個素未謀面的人要怎麼共用金鑰?這正是公開金鑰密碼學要解決的。
規格文件
ChaCha20-Poly1305 對稱式加密
ChaCha20-Poly1305 用另一種構造完成和 AES-GCM 相同的工作。它由 Daniel J. Bernstein 設計,只用加法、旋轉和 XOR(稱為 ARX),所以即使在沒有 AES 專用指令的手機上也很快。TLS 1.3、WireGuard 和 SSH 都使用它。
ChaCha20 把一個 16 個字的格子(常數、金鑰、計數器與 nonce)混合 20 輪,產生一串位元組,再與訊息結合。Poly1305 則在模 2¹³⁰ − 5 下計算一個多項式來得到標籤。
弱點
目前沒有已知的實際攻擊,量子電腦也包括在內。和 AES-GCM 一樣,同一把金鑰絕不能重複使用 nonce。
規格文件
RSA-OAEP 公開金鑰加密
RSA(1977 年)是第一個實用的公開金鑰加密法。任何人都可以用公鑰加密,但只有持有私鑰的人能解密。它的安全性建立在一個事實上:把兩個巨大的質數相乘很容易,要再把它們分解回來卻很難。
加密是把轉成數字的訊息做 e 次方再模 n;解密是把結果做 d 次方。OAEP 是事先加上的隨機填充,讓同一段訊息永遠不會得到相同結果。2048 位元的金鑰只放得下 190 個位元組;實務上,RSA 加密的是一把 AES 金鑰,再由 AES 加密資料。
弱點
夠大的量子電腦可以用 Shor 演算法分解 n,取得私鑰。因此 NIST 提議在 2035 年停止允許使用 RSA。此外,有人可能現在就把加密訊息存起來,等那樣的電腦出現時再解密。
規格文件
X25519 金鑰交換
X25519 解決的是不傳送金鑰卻能共用金鑰的問題。Alice 和 Bob 各自選一個秘密數字,公開「橢圓曲線上一個點乘以這個數字」的結果;接著,各自把對方的結果乘上自己的秘密。兩人會得到同一個點,而只看到公開數值的人卻算不出來。
它是今天最常用的金鑰交換,用於 TLS 1.3、Signal、WhatsApp 和 SSH。這裡的共享秘密會轉成一把 AES-256-GCM 金鑰,用來加密你的訊息。
弱點
和 RSA 一樣,大型量子電腦上的 Shor 演算法可以攻破它。因此瀏覽器已經把它和 ML-KEM 結合使用(X25519MLKEM768),也就是下一個類別所展示的內容。
規格文件
ML-KEM-768 後量子金鑰交換
ML-KEM(FIPS 203,2024 年)是金鑰交換的後量子替代方案。它的安全性來自一個稱為「帶錯誤學習」的格問題。公鑰是一個隨機矩陣 A 乘以由小數字組成的秘密,再加上一點雜訊。沒有雜訊的話,這只是一組容易解的方程式;加上雜訊後,沒有人知道有效率的解法,量子電腦也不例外。
Alice 隨機選 32 個位元組,用 Bob 的公鑰把它們藏進多項式,再把結果傳給 Bob。Bob 用他的秘密去掉幾乎所有雜訊;每個係數都會落在 0 或 1665 附近,四捨五入就能取回位元。接著兩人推導出相同的 32 位元組秘密,這裡用它以 AES-256-GCM 加密你的訊息。
弱點
和 RSA 與橢圓曲線相比,它還很年輕,所以目前和 X25519 一起使用:其中一個被攻破,另一個仍能提供保護。它的金鑰和密文也大得多,分別是 1184 與 1088 位元組,而 X25519 只要 32 位元組。
規格文件
ML-DSA-65 後量子簽章
ML-DSA(FIPS 204,2024 年)是後量子的數位簽章。簽章能證明一段訊息來自持有私鑰的人,而且沒有人改過它;任何擁有公鑰的人都能驗證。
簽署時會選一個隨機向量 y,依照從訊息雜湊得到的挑戰 c,用秘密對它做位移。如果結果 z 太大、可能洩漏秘密的資訊,就丟棄重來;平均大約需要五次嘗試。驗證時用公鑰重做計算,確認得到相同的挑戰。最後你會看到,只要改動訊息中的一個字元,簽章就不再有效。
弱點
簽章長達 3309 位元組,而 Ed25519 只要 64 位元組,這對憑證和需要大量簽章的協定是一大負擔。和 ML-KEM 一樣,它還很新,所以轉換正在謹慎、分階段地進行。
規格文件