加密與雜湊
從咖啡廳 Wi-Fi 刷卡談起,理解對稱/非對稱加密、雜湊函數、數位簽章與 HTTPS 如何協同守護你的祕密
為什麼你能放心在咖啡廳刷卡買咖啡?
想像你在一間咖啡廳,連上免費的公開 Wi-Fi,準備用網路銀行轉帳給朋友。這個無線網路是「共享」的——同一間店裡,任何一台筆電原則上都能側錄空氣中飛來飛去的封包。可是當你按下「確認轉帳」,輸入了帳號、密碼、金額,這些極度敏感的資訊卻能安全抵達銀行伺服器,旁邊那位戴著耳機、螢幕對著你的陌生人即使全程側錄,也只會看到一串毫無意義的亂碼。
這件「在不安全的通道上安全傳遞祕密」的魔法,背後就是密碼學(cryptography)。它不是把資料藏起來不讓人看見(那叫隱寫術),而是讓資料即使被看見,也讀不懂、改不了、冒充不了。本文會帶你理解現代資安的四根支柱:對稱加密、非對稱加密、雜湊(hash)函數與數位簽章(digital signature),並看它們如何在你每天用的 HTTPS 裡協同運作。
加密的基本詞彙:明文、密文、金鑰
我們先建立共同語言。
- 明文(plaintext):原始可讀的訊息,例如「轉帳 1000 元」。
- 密文(ciphertext):加密後的亂碼。
- 金鑰(key):加解密時用的祕密參數,類似一把鑰匙。
- 加密(encryption) 是「明文 + 金鑰 → 密文」,解密(decryption) 是反向操作。
現代密碼學有一條黃金原則叫 Kerckhoffs 原則:系統的安全性只能依賴金鑰的祕密,演算法本身可以完全公開。換句話說,攻擊者就算拿到整套加密程式碼,只要沒有金鑰,依然破解不了。這也是為什麼專業的加密演算法(如 AES)都是公開、經過全世界密碼學家檢驗多年的——「靠隱藏演算法來保密」反而是危險的迷思。

對稱加密:同一把鑰匙鎖門也開門
對稱加密(symmetric encryption) 是最直覺的形式:加密與解密用「同一把」金鑰。就像家裡大門的鑰匙,鎖門開門都是它。
代表演算法是 AES(Advanced Encryption Standard),目前 AES-256(256 位元金鑰)被視為極為安全。對稱加密的最大優點是快——它本質上是位元的代換與位移運算,硬體甚至有專用指令集(AES-NI)加速,可以每秒處理數 GB 資料,所以你看 Netflix 串流、下載大檔,背後加密用的幾乎都是對稱式。
但它有一個致命的雞生蛋問題:金鑰怎麼安全地交給對方? 你想跟銀行用同一把 AES 金鑰通訊,可是你和銀行素未謀面,要怎麼在「還沒有安全通道」的情況下,先把這把鑰匙傳過去而不被竊聽?如果你直接把鑰匙透過網路明文傳出去,那竊聽者一樣會拿到,整套加密就形同虛設。這就是著名的金鑰分發(key distribution)問題。
非對稱加密:公開的鎖、私藏的鑰
解法是 1970 年代的革命性發明——非對稱加密(asymmetric encryption),又稱公開金鑰密碼學(public-key cryptography)。
它的核心是一對「數學上配對」的金鑰:
- 公鑰(public key):可以大方公開,貼在網路上給任何人。
- 私鑰(private key):自己嚴密保管,絕不外洩。
關鍵性質是:用公鑰加密的東西,只有對應的私鑰能解密;反之亦然。 兩把鑰匙在數學上相關,但從公鑰無法在合理時間內反推出私鑰。
一個很好的比喻是「附鎖的信箱」:我把一個開著的掛鎖(公鑰)寄給全世界,任何人想傳祕密給我,就把訊息放進箱子、用我的掛鎖鎖上。鎖一旦扣上,只有握有鑰匙(私鑰)的我能打開——連那個鎖上箱子的人自己也打不開了。
代表演算法是 RSA 與基於橢圓曲線的 ECC(Elliptic Curve Cryptography)。RSA 的安全性建立在「大整數分解很難」:把兩個大質數相乘很容易,但要把乘積反過來分解回原本的質因數,目前沒有已知的高效演算法。
非對稱加密漂亮地解決了金鑰分發問題,但它有個缺點:慢,比對稱加密慢上百倍甚至千倍,不適合加密大量資料。
動手看一個例子:混合加密
實務上沒人用 RSA 直接加密整部影片。真正的做法是混合加密(hybrid encryption)——用非對稱加密來安全傳遞一把對稱金鑰,之後改用快速的對稱加密傳資料。下面用文字流程示範:
情境:Alice 想安全傳一份大檔案給 Bob
1. Bob 公開他的公鑰 PUB_Bob(私鑰 PRI_Bob 自己保管)
2. Alice 隨機產生一把對稱金鑰 K(AES-256)
3. Alice 用 K 對大檔案做 AES 加密 → 密文 C(快)
4. Alice 用 Bob 的公鑰 PUB_Bob 加密 K → 加密後的金鑰 EK(慢,但 K 很短)
5. Alice 把 (C, EK) 一起送出
Bob 收到後:
6. 用自己的私鑰 PRI_Bob 解開 EK → 還原對稱金鑰 K
7. 用 K 對 C 做 AES 解密 → 還原大檔案
竊聽者就算攔下 (C, EK),沒有 Bob 的私鑰就解不出 K,也就解不出 C。這正是 HTTPS 的核心思路。
雜湊函數:資料的「數位指紋」
接下來談一個和加密完全不同的工具——雜湊函數(hash function)。
雜湊函數把任意長度的輸入,壓縮成一段固定長度的輸出(稱為雜湊值、摘要 digest 或指紋)。例如 SHA-256 不論你餵進一個字、一本書還是一部電影,輸出永遠是 256 位元(64 個十六進位字元)。它有三個關鍵性質:
- 確定性:同樣輸入永遠得到同樣輸出。
- 單向性(one-way):給定雜湊值,無法反推回原始輸入。
- 雪崩效應(avalanche effect):輸入只要改 1 個位元,輸出會面目全非。
SHA-256("apple") = 3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b
SHA-256("Apple") = f223faa96f22916294922b171a2696d868fd1f9129302eb41a45b2a2ea2ebbfd
只是把 a 改成 A,整串指紋就完全不同——這讓任何竄改都無所遁形。
雜湊和加密的根本差別:加密是可逆的(有金鑰就能還原明文),目的是保密;雜湊是不可逆的(刻意設計成無法還原),目的是驗證完整性與比對。雜湊沒有金鑰,也不該被用來「藏資料」。
常見用途包括:驗證下載檔案沒被竄改(比對官方公布的 SHA-256)、密碼儲存(資料庫不存明文密碼,只存加鹽 salt 後的雜湊)、以及區塊鏈與 Git 的版本識別。
提醒:MD5 與 SHA-1 已被證明不安全(可被製造碰撞),現代應使用 SHA-256 或 SHA-3。密碼儲存則應用 bcrypt、Argon2 等「刻意放慢」的演算法。
數位簽章:證明「真的是你說的」
加密解決了「保密」,但還有兩個問題沒解決:訊息來源是不是真的?訊息有沒有被篡改? 這就是數位簽章的工作。
數位簽章巧妙地反過來用非對稱金鑰:
簽章(發送方 Alice):
1. 對訊息 M 算雜湊 → h = SHA-256(M)
2. 用 Alice 的「私鑰」加密 h → 簽章 S
3. 送出 (M, S)
驗證(接收方 Bob):
4. 自己對收到的 M 算雜湊 → h' = SHA-256(M)
5. 用 Alice 的「公鑰」解開 S → h
6. 若 h == h',代表:
- 確實是 Alice 簽的(只有她的私鑰能產生這個 S)→ 不可否認性
- 訊息沒被竄改(任何改動都會讓 h' != h)→ 完整性
注意這裡用私鑰簽、公鑰驗,和加密的方向相反。因為全世界都有 Alice 的公鑰,任何人都能驗證;但只有 Alice 有私鑰,只有她能簽。這同時提供了完整性、身分認證與不可否認性。
HTTPS:所有零件如何在你按下 Enter 時組裝起來
現在回到開頭咖啡廳的場景。當你連上 https:// 網站,瀏覽器和伺服器會進行一次 TLS 交握(handshake),把上述所有工具串起來:
- 驗證身分:伺服器出示數位憑證(certificate),裡面有它的公鑰,並由可信的憑證機構(CA)用 CA 的私鑰數位簽章背書。瀏覽器內建了 CA 的公鑰,能驗證這張憑證是真的——確保你連到的真的是銀行,而不是釣魚網站。
- 交換對稱金鑰:雙方透過非對稱密碼學(或下一節的金鑰交換)協商出一把只有彼此知道的對稱金鑰。
- 高速通訊:之後所有資料都用這把對稱金鑰做 AES 加密傳輸,兼顧安全與速度。完整性則由帶雜湊的 MAC 機制保障。
所以那位側錄的陌生人,看到的全是 AES 密文;他無法假冒銀行(過不了憑證簽章驗證);也無法竄改封包(雜湊驗證會抓出來)。這就是你能安心刷卡的原因。
重點回顧
- 對稱加密用同一把金鑰加解密,速度快但有金鑰分發難題;代表是 AES。
- 非對稱加密用公鑰/私鑰一對,公鑰加密私鑰解,解決了金鑰分發,但速度慢;代表是 RSA、ECC。實務用混合加密取兩者之長。
- 雜湊函數是單向、固定長度的「數位指紋」,用於驗證完整性與比對,與加密本質不同(不可逆、無金鑰)。
- 數位簽章用私鑰簽、公鑰驗,提供完整性、身分認證與不可否認性。
- HTTPS 把憑證簽章(驗身分)、非對稱(換金鑰)、對稱(傳資料)、雜湊(驗完整)四者組合起來。
深入探討(研究所視角)
Diffie-Hellman 金鑰交換的直覺
前面說非對稱加密能傳遞對稱金鑰,但更精巧的是 Diffie-Hellman(DH) 金鑰交換——它讓雙方在完全公開的通道上,各自只送出公開資訊,卻能算出一把相同的、第三者算不出來的共享祕密。神奇之處在於:這把祕密從來沒有在網路上傳輸過。
最常用的「油漆混色」比喻能抓住直覺:
公開:一桶共同的黃色油漆(任何人都看得到)
Alice 私藏:紅色 Bob 私藏:藍色
1. Alice 把 黃+紅 混成橘色,公開送給 Bob
2. Bob 把 黃+藍 混成綠色,公開送給 Alice
3. Alice 收到綠色,加進自己的紅 → 黃+藍+紅
4. Bob 收到橘色,加進自己的藍 → 黃+紅+藍
→ 雙方得到「相同的混色」!
竊聽者看到:黃、橘、綠。但要從混好的顏色「反推回」原本各加了多少,極其困難。
數學上,這個「混色容易、分離極難」的單向性,建立在離散對數問題(discrete logarithm problem) 上。選定大質數 $p$ 與生成元 $g$(公開):
$$ A = g^a \bmod p, \qquad B = g^b \bmod p $$
其中 $a$ 是 Alice 的私密指數、$b$ 是 Bob 的。雙方交換 $A$、$B$ 後,各自計算:
$$ \text{Alice: } B^a \bmod p = g^{ba} \bmod p, \qquad \text{Bob: } A^b \bmod p = g^{ab} \bmod p $$
由於 $g^{ab} = g^{ba}$,雙方得到相同的共享金鑰。而竊聽者即使握有 $g$、$p$、$A$、$B$,想反推 $a$ 或 $b$,等於要解離散對數——目前沒有已知的多項式時間演算法。
DH 還帶來一個極重要的安全性質:前向保密(forward secrecy)。每次連線用臨時(ephemeral)的 $a$、$b$,連線結束就丟棄。這意味著即使未來某天伺服器的長期私鑰外洩,攻擊者也無法解密過去側錄下來的歷史流量,因為當時的共享金鑰早已不復存在。這是現代 TLS 1.3 強制採用 ECDHE(橢圓曲線版 DH)的關鍵原因。
雜湊的抗碰撞性
雜湊函數的安全性遠不只「單向」,更核心的是三層抗性,由強到弱:
- 原像抗性(preimage resistance):給定雜湊值 $h$,難以找到任何 $m$ 使 $H(m) = h$。(這就是單向性。)
- 第二原像抗性(second-preimage resistance):給定特定 $m_1$,難以找到不同的 $m_2$ 使 $H(m_1) = H(m_2)$。
- 抗碰撞性(collision resistance):難以找到任意一對不同的 $m_1 \neq m_2$ 使 $H(m_1) = H(m_2)$。
第三項最強,也最難達成。為什麼數位簽章一定要先雜湊再簽?正因為若雜湊函數沒有抗碰撞性,攻擊者就能找到兩份內容不同卻雜湊相同的文件——一份善意(讓你簽)、一份惡意。你簽了善意那份,攻擊者卻能把簽章「移植」到惡意那份上,因為兩者雜湊值相同,驗證一樣會通過。歷史上 MD5 與 SHA-1 正是因為被找到實際碰撞而退場(2017 年 Google 的 SHAttered 攻擊製造出兩個雜湊相同的不同 PDF)。
抗碰撞性的理論上限由生日攻擊(birthday attack) 決定。直覺上你可能以為要找到 $n$ 位元輸出的碰撞需要嘗試約 $2^n$ 次,但其實只需約 $2^{n/2}$ 次——這源自「生日悖論」:一個房間只要 23 人,就有過半機率有兩人同生日。因此 SHA-256 雖有 256 位元,抗碰撞的實際安全強度只有約 $2^{128}$:
$$ \text{找碰撞的期望嘗試次數} \approx 2^{n/2} = 2^{128} $$
這仍是天文數字(超過宇宙原子總數量級),所以 SHA-256 目前安全。這也解釋了一個設計取捨:抗碰撞需要的輸出長度是抗原像的兩倍。若你只需要抗原像(如密碼雜湊),$n$ 位元就夠;若需要抗碰撞(如簽章、區塊鏈),輸出長度必須加倍以抵抗生日攻擊。
與其他主題的連結
密碼學是計算理論的「實用反面」:它把「某些問題很難算」(離散對數、大整數分解、找碰撞)從缺點變成優勢——我們刻意建立在這些計算困難假設上。而這也埋下隱憂:Shor 演算法證明,足夠強大的量子電腦能在多項式時間內分解大整數與解離散對數,屆時 RSA 與 ECC 都會崩潰。這正是當前後量子密碼學(post-quantum cryptography) 興起的原因,NIST 已在標準化基於格(lattice)等量子難題的新演算法。值得注意的是,對稱加密與雜湊受量子衝擊較小(Grover 演算法只把安全強度減半,把金鑰加倍即可應對),所以未來世界的非對稱部分會被換掉,對稱與雜湊則大致存續。理解這條「計算困難性 ↔ 安全性」的對偶關係,是看懂整個密碼學版圖的鑰匙。