# 【密碼學 X - Public-Key Cryptography】 ## 01. 公開金鑰密碼學基礎 ### 01-01. 對稱式 vs. 非對稱式金鑰系統 這兩種體系並非互相排斥,而是**互補的**。實務上常將兩者結合,利用其中一個的優點來補償另一個的缺點。(例如用非對稱加密來交換對稱加密的「會議金鑰」)。 **基礎差異:** - **對稱式 (Symmetric)**:基於分享的秘密 (Shared Secret)。對數據的處理方式主要是符號的重新**排列與取代 (Permutation & Substitution)**。 1. **運作**:加密與解密使用 **同一把** 金鑰。 2. **缺點**:金鑰管理困難。若要與 N 人通訊,需要管理 N 把不同的金鑰,且金鑰分配過程需高度保密。 - **非對稱式 (Asymmetric)**:基於**個人的秘密 (Personal Secret)**。對數據的處理方式是將明文與密文視為整數,進行數字的操作處理 (如指數、模數運算)。 1. **運作**:使用一對金鑰。**公開金鑰 (Public Key)** 用於加密,**私密金鑰 (Private Key)** 用於解密。 2. **優點**:解決了金鑰管理問題(只需公開一把鑰匙),且具備數位簽章功能。 3. **缺點**:計算速度較慢,運算成本高。 ![截圖 2025-12-06 凌晨3.05.16](https://hackmd.io/_uploads/BkIgaolGWl.png) ![截圖 2025-12-06 凌晨3.05.27](https://hackmd.io/_uploads/S1QWaieG-x.png) **金鑰架構:** * 非對稱式使用兩把不同的金鑰:**公開金鑰 (Public Key)** 與 **私密金鑰 (Private Key)**。 * **加密 (Encryption):** $C = f(K_{\text{公開}}, P)$ * **解密 (Decryption):** $P = f^{-1}(K_{\text{私密}}, C)$ * 其中 $P$ 為明文 (Plaintext),$C$ 為密文 (Ciphertext)。 :::success **重點筆記**:白話小例子 - **對稱式**:像是家裡的門鎖,你和家人都拿同一把鑰匙,誰弄丟了鑰匙,全家都要換鎖。 - **非對稱式**:像是一個投入式信箱(公開金鑰),任何人(Bob)都可以往裡面丟信(加密),但只有擁有信箱鑰匙(私密金鑰)的郵差(Alice)才能打開把信拿出來(解密)。 ::: ### 01-02. 為何需要公開金鑰系統? **解決金鑰管理問題:** - 在對稱式系統中,若要與 $N$ 個人進行秘密通訊,必須分別持有 $N$ 把不同的秘密金鑰,管理困難。 - 公開金鑰系統中,每人只需要維護 **1 把私密金鑰** 和 **1 把公開金鑰** 即可。 **系統優缺點:** * **優點:** 無金鑰管理問題、高安全性、具備**數位簽章**功能。 * **缺點:** 加解密速度較慢(因此常與對稱式混合使用)。 **著名的公開金鑰系統**:Diffie-Hellman (1976)、RSA (1977)、Rabin (1979)、ElGamal 與 ECC (1985) :::success **重點筆記**:混合系統的應用 就像網購時(HTTPS),瀏覽器會先用「非對稱加密(慢、安全)」來跟伺服器交換一把臨時鑰匙,之後傳送大量的信用卡資料時,就改用這把臨時鑰匙進行「對稱式加密(快)」。這就是互補的體現。 ::: ### 01-03. 單向暗門函數 (Trapdoor One-Way Function) 非對稱金鑰密碼學的核心數學概念。 ![截圖 2025-12-06 凌晨3.06.13](https://hackmd.io/_uploads/BJlE6oxf-g.png) **單向函數 (One-Way Function):** * 給定 $x$,計算 $y = f(x)$ 很簡單。 * 給定 $y$,要反推 $x = f^{-1}(y)$ 非常困難(在多項式時間內無解)。 **單向暗門函數**:如果擁有一個特殊的「**暗門資訊(Trapdoor)**」(祕密),即使給定 $y$,也能輕易計算出 $x$。) **常見數學難題:** - **質因數分解 (Factorization):** 1. 給定 $p, q$ 求 $n=p \times q$ 很簡單 2. 給定很大的 $n$ 要反推 $p, q$ 很難(除非知道其中一個因數)。 3. 應用:Rabin 系統。 - **離散對數問題 (Discrete Logarithm):** 1. 函數 $y = x^k \mod n$ 。給定 $x, k, n$ 算 $y$ 很容易(快速指數運算) 2. 給定 $y, k, n$ 要反推 $x$ 很難。(ElGamal 的基礎) 3. 暗門機制: 若知道 $k$ 的模反元素 $k^{-1}$ (即 $k \times k^{-1} \equiv 1 \mod \phi(n)$),則可透過 $x = y^{k^{-1}} \mod n$ 輕鬆解出 $x$。 4. 應用:RSA 系統。 <br> ## 02. Diffie-Hellman 金鑰交換 ### 02-01. 運作原理 這是第一個公開金鑰協議 (1976),主要目的是讓雙方在不安全的通道上,安全地協商出一把「共用的密鑰」。 ![截圖 2025-12-06 凌晨3.15.19](https://hackmd.io/_uploads/ByD8yhgfWg.png) **公開參數**雙方同意使用一個大質數 $p$ 和一個生成元 $g$。 **交換過程**: - **Alice (產生私鑰 $x_a$)**: 計算公鑰 $y_a = g^{x_a} \mod p$ 並傳送給 Bob。 - **Bob (產生私鑰 $x_b$)**: 計算公鑰 $y_b = g^{x_b} \mod p$ 並傳送給 Alice。 **計算共享金鑰 $K$**: - Alice 計算:$K = (y_b)^{x_a} \mod p = (g^{x_b})^{x_a} \mod p$ - Bob 計算:$K = (y_a)^{x_b} \mod p = (g^{x_a})^{x_b} \mod p$ - 雙方現在擁有一樣的秘密 $K$,可用於後續對稱式加密通訊。 :::success **重點筆記**:數字小例子假設 $p=23, g=5$。 - Alice 選私鑰 $x_a=6$,送出公鑰 $5^6 \mod 23 = 8$。 - Bob 選私鑰 $x_b=15$,送出公鑰 $5^{15} \mod 23 = 19$。 - Alice 計算 $K = 19^6 \mod 23 = 2$。 - Bob 計算 $K = 8^{15} \mod 23 = 2$。 - 結果: 兩人都算出了金鑰 2。 ::: ### 02-02. 中間人攻擊 (Man-in-the-Middle Attack) 由於 Diffie-Hellman 協議本身缺乏身分認證 (Authentication) 機制,攻擊者 (Eve) 可以攔截並篡改訊息。 ![截圖 2025-12-06 凌晨3.15.36](https://hackmd.io/_uploads/SJrDyngGWe.png) **攻擊場景:** - Alice 送出 $g^{x_a}$,Eve 攔截下來,改送自己生成的偽造公鑰 $g^c$ 給 Bob。 - Bob 送出 $g^{x_b}$,Eve 攔截下來,改送 $g^c$ 給 Alice。 **結果**: - Alice 以為在跟 Bob 通訊,其實跟 Eve 建立了金鑰 $K_1 = (g^c)^{x_a} \mod p$。 - Bob 以為在跟 Alice 通訊,其實跟 Eve 建立了金鑰 $K_2 = (g^c)^{x_b} \mod p$。 - Eve 夾在中間,可以解密 Alice 的訊息(用 $K_1$),再用 $K_2$ 加密傳給 Bob,雙方完全不知情。 ### 02-03. 可能的解決方案 (Possible Solutions) **為了防禦中間人攻擊,必須引入認證機制,確認公鑰真的來自對方。** - 建立認證的安全通道: 利用雙方預先擁有的「前置共享密鑰」(Pre-shared Secret) 來加密交換的訊息。 - 雜湊認證 (Hash Authentication): 1. 在 Diffie-Hellman 交換之後,緊接著傳送「共享數值 + 名稱 + 前置共享密鑰」的雜湊值,供對方驗證。 2. 或者傳送「前置共享密鑰 + 所傳送參數」的雜湊值。 <br> ## 03. RSA 密碼系統 ![截圖 2025-12-06 凌晨3.26.43](https://hackmd.io/_uploads/rJ0efhlzWg.png) ### 03-01. 背景與概念 - **發展歷史**:由 MIT 三位教授 Rivest、Shamir、Adleman 於 1977 年發展。 - **功能**:可同時達成資料加密 (機密性) 與數位簽章 (認證、不可否認性)。 - **運作模式**: 1. RSA Encryption (加密):使用接收者的公開金鑰 (Public Key) 加密明文。 2. RSA Decryption (解密):接收者使用自己的私密金鑰 (Private Key) 解密密文。 ### 03-02. 演算法詳解 RSA 是最經典的非對稱加密算法 (1977),安全性建立在「大整數質因數分解」的困難度上。 **金鑰產生演算法 (Key Generation):** 1. **選數:** 選擇兩個大質數 $p$ 和 $q$ (兩者不相等)。建議長度: $p, q$ 至少 512 bits,模數 $n$ 至少 1024 bits。 2. **模數:** 計算 $n = p \times q$ (作為公開與私密金鑰的模數)。 3. **歐拉函數:** 計算 $\phi(n) = (p-1)(q-1)$。(代表小於 $n$ 且與 $n$ 互質的正整數個數) 4. **選公鑰:** 選擇一個整數 $e$,滿足 $1 < e < \phi(n)$ 且 $e$ 與 $\phi(n)$ 互質。滿足 $\gcd(e, \phi(n)) = 1$。(**公開金鑰:** $(e, n)$) 5. **算私鑰:** 計算 $d$,使得 $e \times d \equiv 1 \mod \phi(n)$ (即 $d$ 是 $e$ 的模反元素)。(**私密金鑰:** $d$) ```python= RSA_Key_Generation { Select two large primes p and q such that p != q. n <- p x q ф(n) <- (p - 1) × (q - 1) Select e such that 1 < e < ф(n) and e is coprime to (n) d <- e^(-1) mod ф(n) # d 是 e 在模 ф(n) 底下的乘法反元素 Public_key <- (e,n) # 公開宣布 Private_key < d # 保持秘密 return Public_key and Private_key ``` **加密與解密假設明文為** - $P$ (需將資料切分為區塊,每次加密範圍需小於 $n$),密文為 $C$。 ```python= RSA_Encryption (P, e, n) # P 是在 Zn 下的明文且 P < n { C <- Fast_Exponentiation (P, e, n) # 計算 (P^e mod n) return C } RSA_Decryption (P, e, n) # C 是在 Zn 下的密文 { P <- Fast_Exponentiation (C, d, n) # 計算 (C^d mod n) return P } ``` - **加密**:$C = P^e \mod n$ ![截圖 2025-12-06 凌晨3.35.31](https://hackmd.io/_uploads/ByWGN2lfWl.png) - **解密**:$P = C^d \mod n$ ![截圖 2025-12-06 凌晨3.36.14](https://hackmd.io/_uploads/r1tVE2lf-g.png) :::success **重點筆記**:數字小例子: 1. 選 $p=3, q=11$, $n = p \times q = 33$。 3. $\phi(n) = (3-1)(11-1) = (2)(10) = 20$。 4. 選 $e=3$ (與 20 互質)。**公鑰: (3, 33)**。 5. 求 $d$,使得 $3 \times d \equiv 1 \mod 20$。因為 $3 \times 7 = 21 = 1 \mod 20$,所以 $d=7$。**私鑰: 7**。 6. **加密:** 設明文 $P=19$。$C = 19^3 \mod 33 = 6859 \mod 33 = 28$。 7. **解密:** $P = 28^7 \mod 33 = ... = 19$。 ::: ### 03-03. 安全性分析 (因數分解問題) - **核心難題**:RSA 的安全性完全取決於大整數質因數分解的困難度。 - **攻防關鍵**: 1. 公開資訊為 $(e, n)$。 2. 私密資訊為 $d$,而 $d$ 是從 $\phi(n) = (p-1)(q-1)$ 算出來的。 3. 如果攻擊者能將 $n$ 分解成 $p, q$,就能算出 $\phi(n)$,進而利用歐幾里得演算法算出私鑰 $d$。 - **RSA 數 (RSA Numbers) 挑戰**: 1. 自 1991 年起 RSA 實驗室提出的分解挑戰。 2. RSA-200 (663 bits): 2005 年被分解 (用了 80 顆 2.2GHz CPU 跑了 3 個月) 3. RSA-768: 2009 年被分解。 4. RSA-1024 / 2048: 目前被認為是安全的標準 (建議 $n$ 至少 2048 bits)。 ### 03-04. 公開金鑰系統的四項特性 一個完善的公開金鑰密碼系統 (Public-Key Cryptosystem) 應具備以下特性: 1. **可還原性 (Reversibility)**: $D(d, E(e, P)) = P$。用私鑰解密經過公鑰加密的訊息,必須能還原明文。 2. **易計算性**: 產生金鑰對 $(e, d)$ 很容易;加密與解密運算在已知金鑰下很容易 (多項式時間)。 3. **單向暗門**:若公開 $(e, n)$,別人很難從 $(e, n)$ 去求得 $d$,即只有自己知道如何解以 $d$ 加的密 4. **可驗證性**:$D(e, E(d, P)) = P$ **單向暗門 (Trapdoor One-Way)**: - 僅知公鑰 $(e, n)$,在計算上無法推導出私鑰 $d$。滿足 1~3 項稱為 Trapdoor One-Way Function。 - 若能用私鑰加密、公鑰解密,則該系統可支援數位簽章。同時滿足 1~4 項稱為 Trapdoor One-Way Permutation。 :::info **注意事項**: - 加密用公鑰,解密用私鑰 $\rightarrow$ 保密 (Encryption) - 加密用私鑰,解密用公鑰 $\rightarrow$ 簽章 (Authentication/Signature) ::: <br> ## 04. Rabin 密碼系統 ### 04-01. 基本概念 Rabin 系統可以被視為 RSA 密碼系統的一個特例,其中指數 $e$ ($e=2$) 和 $d$ 被固定。 ![截圖 2025-12-06 凌晨3.48.25](https://hackmd.io/_uploads/HJ8Mv2xf-e.png) **數學原理**: - 加密: $C \equiv P^2 \mod n$ (平方運算)。 - 解密: $P \equiv C^{1/2} \mod n$ (求平方根)。 **演算法流程:** - **金鑰產生 (Key Generation)**: 1. 接收者 Bob 選擇兩個大質數 $p, q$ (建議形式為 $4k+3$ 以簡化計算)。 2. 計算 $n = p \times q$。 3. 公開金鑰: $n$。 4. 私密金鑰: $(p, q)$。 ```python= Rabin_Key_Generation { Choose two large primes p and q in the form 4k + 3 and p != q. n <- p x q Public_key <- n # 公開宣佈 Private_key <- (p, q) # 保持秘密 return Public_key and Private_key } ``` - **加密 (Encryption)**: 1. Alice 取得 $n$,確保明文 $0 \le P < n$。 2. 計算密文 $C = P^2 \mod n$。 ```python= Rabin_Encryption (n, P) # m 是公開金鑰; P 是在 Zn* 下的明文 { c <- p^2 mod n # C 是密文 return C } ``` - **解密 (Decryption)**: 1. Bob 收到 $C$ 後,使用私鑰 $p, q$ 計算 $C$ 在模 $n$ 下的四個平方根 $(P_1, P_2, P_3, P_4)$。 2. 這通常透過計算 $C$ 在模 $p$ 和模 $q$ 的根,再利用 中國餘數定理 (CRT) 組合而成。 ```python= Rabin_Decryption (P, q, C) # C 是密文; p 及 q 是私密金鑰 { a1 <- +(C^((p+1)/4) mod p a2 <- -(C^((p+1)/4) mod p b1 <- +(C^((q+1)/4) mod q b2 <- -(C^((q+1)/4) mod q # 呼叫四次中國餘數定理演算法 P1 <- Chinese_Remainder (a1, b1, P, q) P2 <- Chinese_Remainder (a1, b2, P, q) P3 <- Chinese_Remainder (a2, b1, P, q) P4 <- Chinese_Remainder (a2, b2, P, q) return P1, P2, P3, and P4 } ``` ### 04-02. 二次剩餘與非確定性 (Indeterministic) Rabin 系統最大的特點(也是問題)在於其非確定性:解密同一個密文會得到 4 個同樣可能的明文。 - **問題**: Bob 算出 **4 個可能的明文根** $(P_1, P_2, P_3, P_4)$,不知道哪一個才是 Alice 原本傳送的訊息。 - **解決方案 (識別格式)**: 1. 在明文中加入特定的預設格式或冗餘資訊 (Redundancy)。 2. 例如:將明文的後幾位元複製並接在後面 (如範例 10.9:$P = 1001...$ 變為 $1001...1001...$)。 3. 解密後,Bob 檢查哪一個根符合這個格式,該根即為正確明文。 :::success **重點筆記**:題目目標:已知 $n = 161$ ($p=23, q=7$),密文 $C = 93$。求解 $x^2 \equiv 93 \pmod{161}$。 **Step 1: 分解為兩個子問題** 將 $x^2 \equiv 93 \pmod{161}$ 拆解為: - $x^2 \equiv 93 \pmod{23}$ - $x^2 \equiv 93 \pmod 7$ **Step 2: 求解子問題 (找出模 p 與模 q 的根)** - **針對 $p=23$**: 1. 先化簡密文:$93 \pmod{23}$$93 \div 23 = 4 \dots 1$,所以 $93 \equiv 1 \pmod{23}$。方程式變為:$x^2 \equiv 1 \pmod{23}$。 2. 因為 $p=23$ 是 $4k+3$ 形式 ($4 \times 5 + 3$),代入公式 $x = \pm C^{(p+1)/4}$:指數計算:$(23+1)/4 = 6$。$x \equiv \pm 1^6 \equiv \pm 1 \pmod{23}$。 3. 得到兩個根 ($a_1, a_2$): $1$ 和 $22$ (即 $-1$)。 - **針對 $q=7$**: 1. 先化簡密文:$93 \pmod 7$$93 \div 7 = 13 \dots 2$,所以 $93 \equiv 2 \pmod 7$。方程式變為:$x^2 \equiv 2 \pmod 7$。 2. 因為 $q=7$ 是 $4k+3$ 形式 ($4 \times 1 + 3$),代入公式:指數計算:$(7+1)/4 = 2$。$x \equiv \pm 2^2 \equiv \pm 4 \pmod 7$。 3. 得到兩個根 ($b_1, b_2$): $4$ 和 $3$ (即 $-4$)。 **Step 3: 利用 CRT 組合解我們現在有四種組合 $(x_p, x_q)$ 需要合併**:$(1, 4)$$(1, 3)$$(22, 4)$$(22, 3)$CRT - 參數準備: 1. $M = 161$ 2. $M_1 (對應 p=23)$:$M_1 = 161/23 = 7$。求 $7$ 在模 $23$ 下的反元素:$7 \times y \equiv 1 \pmod{23}$。觀察 $7 \times 10 = 70 = 3 \times 23 + 1$,故反元素 $M_1^{-1} = 10$。 3. $M_2 (對應 q=7)$:$M_2 = 161/7 = 23 \equiv 2 \pmod 7$。求 $2$ 在模 $7$ 下的反元素:$2 \times y \equiv 1 \pmod 7$。$2 \times 4 = 8 \equiv 1$,故反元素 $M_2^{-1} = 4$。 CRT 通解公式: $$x = (a_1 \times M_1 \times M_1^{-1} + b_1 \times M_2 \times M_2^{-1}) \pmod M$$ $$x = (x_p \cdot 7 \cdot 10 + x_q \cdot 23 \cdot 4) \pmod{161}$$ $$x = (70 x_p + 92 x_q) \pmod{161}$$ - 計算四個解: 1. 組合 $(1, 4)$:$x = (70 \times 1 + 92 \times 4) = 70 + 368 = 438$$438 \pmod{161} = 438 - 2(322) = \mathbf{116}$ 2. 組合 $(1, 3)$:$x = (70 \times 1 + 92 \times 3) = 70 + 276 = 346$$346 \pmod{161} = 346 - 2(322) = \mathbf{24}$ (此為原始明文) 3. 組合 $(22, 4)$ (技巧:用 $-1$ 代替 $22$ 計算較快):$x = (70 \times (-1) + 92 \times 4) = -70 + 368 = 298$$298 \pmod{161} = 298 - 161 = \mathbf{137}$ 4. 組合 $(22, 3)$ (技巧:用 $-1$ 代替 $22$):$x = (70 \times (-1) + 92 \times 3) = -70 + 276 = 206$$206 \pmod{161} = 206 - 161 = \mathbf{45}$ **最終結果**:解集合為 $\{116, 24, 137, 45\}$。這四個數平方後 mod 161 都會等於 93,Bob 必須從中判斷出 24 是正確的明文。 Bob 收到 93,並計算下面四個值: - $a_1 = +(93^{(23+1)/4}) \pmod {23} = 1 \pmod {23}$ - $a_2 = −(93^{(23+1)/4}) \pmod {23} = 22 \pmod {23}$ - $b_1 = +(93^{(7+1)/4}) \pmod 7 = 4 \pmod 7$ - $b_2 = −(93^{(7+1)/4}) \pmod 7 = 3 \pmod 7$ ::: :::success **重點筆記** - 系統參數設定 1. 選取質數:$p = 277$,$q = 331$。 2. 計算模數:$n = p \times q = 91687$。 - 加密過程 (加入識別格式) 1. 原始訊息:$P_{raw} = 1001111001$ (二進制)。 2. 加入冗餘:為了能在解密時辨識,將後方部分位元複製並接在後面。格式策略:$P = P_{raw} \parallel \text{末 6 碼}$新明文:$P = 1001111001\mathbf{111001}_2$ 3. 轉十進制:$P = 40569_{10}$。 4. 計算密文:$$C = P^2 \mod n = 40569^2 \mod 91687 = 62111$$ - 解密與驗證Bob 收到 $62111$ 後,算出模 $n$ 的四個平方根(候選明文),並轉回二進制檢查格式: 1. $P_1 = 10001000000010110_2$ $\rightarrow$ (格式不符) 2. $P_2 = 101011000010001_2$ $\rightarrow$ (格式不符) 3. $P_3 = 1001111001\mathbf{111001}_2$ $\rightarrow$ (符合! 後 6 碼與前文對應) 4. $P_4 = 1100011110101110_2$ $\rightarrow$ (格式不符) - 結論:因為 $P_3$ 呈現了預先約定的重複樣式(後 6 碼重複),故 Bob 可以確定 $P_3$ 即為 Alice 發送的正確明文。 ::: ### 04-03. 安全性分析 **安全性基礎**: Rabin 系統的破解難度在數學上等同於大整數因數分解 (Factorization)。這是它理論上的一大優勢(證明若能破解 Rabin 就能分解 $n$)。 **弱點**:選擇密文攻擊 (Chosen Ciphertext Attack) - 這是 Rabin 系統最致命的弱點。 - **攻擊過程**: 1. 攻擊者隨機選一個數 $x$,計算 $C = x^2 \mod n$。 2. 攻擊者將 $C$ 傳給 Bob (假裝是密文),要求 Bob 解密。 3. Bob 解密後隨機回傳其中一個明文 $P$。 - **破解原理**: 1. 若 Bob 回傳的 $P$ 剛好不等於 $\pm x \mod n$ (發生機率為 $1/2$)。 2. 攻擊者就掌握了 $n$ 的兩個不同的平方根 ($x$ 和 $P$)。 3. 攻擊者只需計算 $\gcd(x - P, n)$,就能直接求出 $n$ 的因數 $p$ 或 $q$,從而完全破解系統。 <br> ## 05. ElGamal 密碼系統 ### 05-01. 背景與原理 - **起源**:由 Taher ElGamal 提出,以其姓氏命名。 - **數學基礎**:安全性建立在 **離散對數問題 (Discrete Logarithm Problem)** 的困難度上。 - **特性**:是除了 RSA 與 Rabin 之外,另一種著名的公開金鑰系統。其加密與解密的位元運算複雜度皆為多項式時間 (Polynomial Time)。 ![截圖 2025-12-06 凌晨4.03.05](https://hackmd.io/_uploads/HyuY92ezZe.png) ### 05-02. 金鑰產生與加密解密 **Step 1: 金鑰產生 (Key Generation)** - 選擇一個大質數 $p$。 - 選擇群 $Z_p^*$ 的一個 原根 (Primitive Root) $e_1$。 - 選擇私密金鑰 $d$,滿足 $1 \le d \le p-2$。 - 計算 $e_2 = e_1^d \mod p$。 1. 公開金鑰: $(e_1, e_2, p)$ 2. 私密金鑰: $d$ ```python= ElGamal_Key_Generation { Select a large prime p Select d to be a member of the group G = < Zp*, x > such that 1 <= d <= p-2 Select e, to be a primitive root in the group G = < Zp*, x > e^2 <- e1^d mod p Public_key < (e1, e2, p) # 公開宣布 Private_key < d # 保持秘密 return Public _key and Private _key } ``` **Step 2: 加密 (Encryption)** Alice 欲傳送明文 $P$ 給 Bob (需先取得 Bob 的公鑰) - 選擇一個 隨機整數 $r$ (注意:每次加密都必須使用全新的 $r$)。 - 計算 $C_1 = e_1^r \mod p$ (保護隨機數)。 - 計算 $C_2 = (P \times e_2^r) \mod p$ (隱藏明文)。 - 傳送密文對 $(C_1, C_2)$。 ```python= ElGamal_Encryption (e1, e2, p, P) # P 是一個明文 { Select a random integer r in the group G = < Zp*, x> C1 <- e1^r mod p C2 < (P x e2^r) mod p # C1 及 C2 是密文 return C1 and Cz } ``` **Step 3: 解密 (Decryption)** Bob 收到 $(C_1, C_2)$ 後,使用私鑰 $d$ 還原明文: - 方法一 (標準解法): $P = [C_2 \times (C_1^d)^{-1}] \mod p$。(需計算乘法反元素) - 方法二 (費瑪小定理): 避免計算反元素,改用指數運算 $P = [C_2 \times C_1^{p-1-d}] \mod p$。 :::success **重點筆記**:設定: Bob 選 $p=11$,原根 $e_1=2$。 - 選私鑰 $d=3$。 - 算公鑰: $e_2 = 2^3 \mod 11 = 8$。公鑰為 $(2, 8, 11)$。 - 加密: Alice 欲傳送明文 $P=7$,選擇隨機數 $r=4$。 1. $C_1 = 2^4 \mod 11 = 16 \mod 11 = 5$。 2. $C_2 = (7 \times 8^4) \mod 11$。因為 $8^4 = 4096 \equiv 4 \mod 11$,所以 $C_2 = 7 \times 4 \mod 11 = 28 \mod 11\equiv 6$。 3. 傳送密文 $(5, 6)$。 - 解密 (使用方法二): Bob 收到 $(5, 6)$。 1. 計算指數 $p-1-d = 11-1-3 = 7$。 2. 計算 $P = [6 \times 5^7] \mod 11$。 3. $5^7 = 78125 \equiv 3 \mod 11$。 4. $P = 6 \times 3 = 18 \equiv 7$。成功還原明文! ::: ### 05-03. 安全性注意事項 - **金鑰長度要求**:為了確保安全,質數 $p$ 建議至少要有 300 位數字 (約 1024 bits) 以上。實際應用中常見 512 bits 或更高。 - **隨機數 $r$ 的重要性**: 1. 不可重複使用:對每一次加密,都必須採用一個全新的隨機數值 $r$。 2. 若重複使用 $r$,將導致安全性大幅降低,攻擊者可能透過分析密文找出規律。 - **效率與空間**:密文長度是明文的兩倍 ($C_1$ 與 $C_2$),資料傳輸量較大。