💡 先搞懂問題
最直覺的加密方式,是兩個人共用同一把金鑰:寄件者用它把訊息鎖起來,收件者用同一把打開。這叫對稱加密(Symmetric Encryption),代表演算法是 AES,速度快,適合大量資料。麻煩在於那把金鑰要怎麼先交到對方手上。如果能安全送達金鑰,何不直接安全送達訊息?而且團隊一大,每兩個人之間都要一把專屬金鑰,數量會以平方的速度成長。
另外還有兩個加密本身解決不了的問題。第一,訊息在路上有沒有被人改過?第二,訊息真的是對方寄的嗎?光是「看不懂」,不代表「沒被動過」,也不代表「來源正確」。
一個比喻:配兩把鑰匙的特製保險箱
想像一種特製保險箱,出廠時配兩把不同的鑰匙。規則只有一條:用其中一把鎖上的,只有另一把打得開;同一把鑰匙鎖上之後,自己反而打不開。Bob 買了一個,把其中一把複製很多份,放在門口讓任何人自由拿走,另一把貼身保管。
用法一:想寄祕密給 Bob
Alice 拿門口那把公開的鑰匙把信鎖進保險箱。鎖上之後,連 Alice 自己都打不開,世界上只有 Bob 身上那把能開。路上誰搶到保險箱都沒用。
用法二:想證明東西是 Bob 放的
Bob 用貼身那把鑰匙把信鎖上。任何人都能用公開的鑰匙打開來看,所以這不是祕密;但只要打得開,就證明是那把貼身鑰匙鎖的,也就是 Bob 本人。
回到資安,公開發放的那把對應公鑰(Public Key),貼身保管的那把對應私鑰(Private Key),這種一對兩把的設計叫非對稱加密(Asymmetric Encryption),代表演算法有 RSA、ECC。用法一就是加密保密:用收件者的公鑰加密,只有收件者的私鑰能解。用法二就是數位簽章(Digital Signature)的精神:用寄件者自己的私鑰簽,任何人都能用他的公鑰驗證。至於「有沒有被改過」,則交給雜湊函數(Hash Function)處理,它把任何資料算成一段固定長度的指紋,內容改一個字,指紋就面目全非。
🎮 互動實驗室 1:Alice 寄信給 Bob
先選 Alice 想達成的目標,再替每一個步驟挑一把金鑰,按「寄出」看結果。竊聽者 Eve 守在網路線路上,她拿得到所有公開的東西。也可以打開「讓 Eve 在半路掉包」,看看哪種做法能抓到她。
Alice 寫好一封信:「明天早上 10 點,老地方見」。先在左邊替她挑金鑰。
🎮 互動實驗室 2:雜湊雪崩效應與金鑰數量
2-A 改一個字,指紋就面目全非
兩個輸入框各自即時計算 SHA-256。預設只差一個數字,你也可以自由修改,看 256 個位元中有多少個翻轉。
計算中…
2-B 金鑰數量計算機
拖動滑桿改變人數 n。左圖每一條線代表一把兩人專用的對稱金鑰。
📘 原理補完
對稱與非對稱:各自擅長什麼
| 比較項目 | 對稱加密 | 非對稱加密 |
|---|---|---|
| 金鑰 | 加解密用同一把,雙方都要持有 | 每人一對:公鑰公開、私鑰自己保管 |
| 速度 | 快,適合大量資料 | 慢,適合少量資料(例如交換金鑰、簽章) |
| 代表演算法 | AES、3DES、DES(已不安全)、IDEA | RSA、ECC、ElGamal;Diffie-Hellman 用於金鑰交換 |
| n 人兩兩通訊的金鑰數 | n(n-1)/2 | 2n(n 對) |
| 主要難題 | 金鑰怎麼安全送到對方手上 | 運算成本高;公鑰要有人擔保真的屬於對方 |
n(n-1)/2 的來源是組合數:n 個人裡任挑兩人成一組,共有 n(n-1)/2 組,每組都需要一把只有他們兩人知道的金鑰。非對稱則是每人一對,n 個人就是 n 對、2n 把,新成員加入時只要多產生一對,把公鑰公布出去即可。考試通常直接問這兩個公式。
誰用誰的金鑰:一張表記住方向
| 目的 | 寄件者用 | 收件者用 | 提供的保護 |
|---|---|---|---|
| 保密(加密) | 收件者的公鑰加密 | 收件者自己的私鑰解密 | 機密性 |
| 數位簽章 | 寄件者自己的私鑰簽章 | 寄件者的公鑰驗證 | 完整性、來源鑑別、不可否認性(不含機密性) |
判斷方法是問自己「誰必須是唯一做得到的人」。保密時,唯一能讀的人必須是收件者,所以最後一步要用只有收件者才有的私鑰,前一步自然是收件者的公鑰。簽章時,唯一能簽的人必須是寄件者,所以簽章用寄件者的私鑰,驗證就交給人人都有的寄件者公鑰。兩者都要時,常見做法是先簽章、再用收件者公鑰加密,實驗室 1 的「兩者都要」就是這個順序。
數位簽章實際怎麼做
- 寄件者對文件算出雜湊值(例如 SHA-256)。
- 用自己的私鑰對這個雜湊值做簽章運算,產生簽章,附在文件後面一起送出。
- 收件者自己對收到的文件重算一次雜湊值,再用寄件者的公鑰驗證簽章,確認兩者對得上。
只要文件被改一個字,重算出的雜湊就不同,驗證失敗;而沒有私鑰的人也做不出能通過驗證的簽章。教材常把第 2 步描述成「用私鑰加密摘要」,這是以 RSA 為例的簡化說法;ECDSA 等簽章演算法並不是加密,但「私鑰簽、公鑰驗」的方向完全相同。還要注意公鑰本身得是真的:如果 Eve 把自己的公鑰冒充成 Alice 的發給 Bob,簽章驗證就失去意義,所以需要憑證機構(CA)簽發數位憑證,擔保「這把公鑰屬於 Alice」。
雜湊:不是加密,是指紋
雜湊函數把任意長度的輸入算成固定長度的輸出(SHA-256 固定 256 位元,也就是 64 個十六進位字元),有三個考試常問的性質:單向不可逆,無法從雜湊值推回原文;雪崩效應,輸入改一點,輸出約有一半位元翻轉;抗碰撞,很難找到兩份不同資料算出同一個值。雜湊沒有金鑰,也沒有「解密」這回事,所以它只能驗證完整性,不能保密。MD5 與 SHA-1 已經被找到碰撞,不應再用於完整性驗證或簽章,應改用 SHA-2 或 SHA-3。
單獨比對雜湊值有一個盲點:如果攻擊者同時換掉檔案和網頁上公布的雜湊值,比對還是會通過。這時要靠數位簽章確認來源,或使用加入金鑰的 HMAC。儲存密碼則是另一種用法:每個帳號加上不同的隨機鹽值(Salt),再用 bcrypt、PBKDF2、Argon2 這類刻意算得很慢的函數,防止攻擊者用預先算好的彩虹表反查。
混合加密:非對稱負責交換,對稱負責搬資料
這樣做同時避開了兩邊的缺點:對稱金鑰不必事先見面交付,非對稱的慢速運算也只用在一小段資料上。HTTPS 背後的 TLS 也是同一個精神,握手階段用憑證確認伺服器身分、以非對稱方式建立本次連線的對稱金鑰,之後的網頁內容都用對稱加密傳送。早期 TLS 可以用 RSA 直接加密傳送金鑰材料;TLS 1.3 則改用 Diffie-Hellman 類的金鑰協商,雙方在公開通道上各自算出同一把金鑰,但「非對稱建立、對稱搬運」的分工沒有變。
容易混淆的地方
- 加密 vs 編碼:Base64 只是換一種表示方式,任何人都能直接還原,沒有金鑰,不提供保密。
- 雜湊 vs 加密:加密可以用金鑰還原;雜湊不可逆、沒有金鑰。要保密用加密,要確認有沒有被改用雜湊。
- 非對稱加密 vs 數位簽章:都用同一對金鑰,但方向相反。選項出現「用公鑰簽章」「用私鑰驗證」「用自己的公鑰加密給別人」都是錯的。
- 簽章不保密:數位簽章證明來源與完整性,內容本身沒有被藏起來。
- 金鑰本身要管理:演算法是公開的,真正的祕密是金鑰。金鑰要有產生、分發、儲存、輪替、撤銷到銷毀的完整生命週期,重要金鑰放在防竄改的硬體安全模組(HSM)或金鑰管理服務(KMS)。
✅ 自我檢測
每題選一個答案,會立即顯示對錯與解析。已作答 0/6,答對 0
🎯 重點整理
- 要保密:用收件者的公鑰加密,收件者用自己的私鑰解密。
- 要簽章:用寄件者的私鑰簽,任何人用寄件者的公鑰驗證;提供完整性、來源鑑別、不可否認性,不提供機密性。
- 對稱加密同一把金鑰、快,但難以分送;n 人兩兩通訊需要 n(n-1)/2 把。非對稱每人一對,共 2n 把,但運算慢。
- 混合加密(數位信封、TLS):用非對稱方式交換或協商對稱金鑰,再用對稱加密傳大量資料。
- 雜湊:任意長度變固定長度、單向不可逆、改一點輸出大變,用來驗證完整性;沒有金鑰,不是加密。
- MD5、SHA-1 已有碰撞,改用 SHA-2/SHA-3;存密碼要加鹽並用 bcrypt、PBKDF2、Argon2 這類慢速函數。
- 公鑰要有人擔保真的屬於對方,這就是憑證機構(CA)與數位憑證的工作。