---
# System prepended metadata

title: 【密碼學 III - Classical Cipher】

---

# 【密碼學 III - Classical Cipher】



## 01. 對稱式加密 (Symmetric Encryption)

### 01-01. 核心概念

對稱式加密是一種加密方法，其核心特點是**加密 (Encryption) 和解密 (Decryption) 過程使用完全相同的金鑰 (Key)**。

![截圖 2025-10-16 凌晨12.05.57](https://hackmd.io/_uploads/By-O8rTagx.png)

### 01-02. 基本模型

對稱式加密的標準模型包含以下幾個要素：

- **明文 (Plaintext)**: 未加密的原始訊息。
- **加密演算法 (Encryption Algorithm)**: 將明文轉換為密文的規則。
- **共享祕密金鑰 (Shared Secret Key)**: 加密與解密共用的鑰匙，是安全性的核心。
- **密文 (Ciphertext)**: 經過加密後的訊息。
- **解密演算法 (Decryption Algorithm)**: 將密文還原為明文的規則。

**流程說明** (以 Alice 和 Bob 通訊為例)：
1.  **金鑰交換**: Alice 和 Bob 必須先透過一個**安全的管道**交換共享祕密金鑰。
2.  **加密**: Alice 使用共享金鑰和加密演算法，將明文轉換成密文。
3.  **傳輸**: 密文可以透過**不安全的管道**（如公開的網路）傳送給 Bob。
4.  **解密**: Bob 收到密文後，使用相同的共享金鑰和解密演算法，將密文還原成原始的明文。

![截圖 2025-10-16 凌晨12.07.12](https://hackmd.io/_uploads/BJshIrppeg.png)

<br>

## 02. 古典加密技術分類

古典密碼學的技術主要分為兩大類：
![截圖 2025-10-16 凌晨12.09.06](https://hackmd.io/_uploads/HJA7PHapgx.png)

### 02-01. 替換技術 (Substitution Techniques)

**定義**: 將明文中的字母或字母組，用其他的字母、數字或符號來**取代**。
- **範例**: 將 `A` 替換為 `D`，`B` 替換為 `E`... 以此類推。明文 `HELLO` 會變成 `KHOOR`。
- **主要類型**:
    1. **單字母加密法 (Monoalphabetic Cipher)**: 一次替換一個字母。
    2. **多字母加密法 (Polyalphabetic Cipher)**: 同一個字母在不同位置可被替換成不同密文。
    3. **多字母組加密法 (Polygraphic Cipher)**: 一次替換一組字母。

### 02-02. 換位技術 (Transposition Techniques)
**定義**: 不改變明文中的字母，僅將它們的位置**重新排列**。
- **範例**: 將 `HELLO` 的字母順序反轉，變成 `OLLEH`。
    1. **無金鑰換位加密法 (Transposition Ciphers without Key)**
    2. **有金鑰換位加密法 (Transposition Ciphers with Key)**

<br>

## 03. 替換技術詳解

### 03-01. 單字母加密法：凱撒加密法

最簡單的單字母加密法，也稱為**加法加密法 (Additive Cipher)** 或**位移加密法 (Shift Cipher)**。
- **特徵**: 明文中相同的字母，會被加密成相同的密文字母。例如，`hello` 中的兩個 `l` 都被加密成 `O`。
![截圖 2025-10-16 凌晨12.18.11](https://hackmd.io/_uploads/rykIKHTpee.png)
- **反例 (非單字母加密法)**: 若同一個字母 `l` 被轉換成不同密文（如 `N` 和 `Z`），則不是單字母加密法。
![截圖 2025-10-16 凌晨12.18.35](https://hackmd.io/_uploads/B1rwKrapgx.png)
-   **原理**: 將每個字母在字母表中向後位移固定的格數 (Key)。相傳凱撒大帝曾使用位移 3 格的金鑰與將軍們通信。
-  **數學公式** (a=0, b=1, ... z=25):
    1. 加密: $C = (P + k) \pmod{26}$
    2. 解密: $P = (C - k) \pmod{26}$
    3.  其中 $P$ 是明文對應的數字，$C$ 是密文對應的數字，$k$ 是金鑰。
![截圖 2025-10-16 凌晨12.21.47](https://hackmd.io/_uploads/ryK7cHp6gg.png)

**範例 (加密)**: 使用金鑰 $k=15$ 加密 "hello"。
1.  h(07) + 15 = 22 $\rightarrow$ W
2.  e(04) + 15 = 19 $\rightarrow$ T
3.  l(11) + 15 = 26 $\pmod{26}$ = 00 $\rightarrow$ A
4.  l(11) + 15 = 26 $\pmod{26}$ = 00 $\rightarrow$ A
5.  o(14) + 15 = 29 $\pmod{26}$ = 03 $\rightarrow$ D
6.  結果: **WTAAD**

![截圖 2025-10-16 凌晨12.22.13](https://hackmd.io/_uploads/BkWB9Sapge.png)

**範例 (解密)**: 使用金鑰 $k=15$ 解密訊息「WTAAD」。
1.  W(22) - 15 = 07 $\rightarrow$ h
2.  T(19) - 15 = 04 $\rightarrow$ e
3.  A(00) - 15 = -15 $\pmod{26}$ = 11 $\rightarrow$ l
4.  A(00) - 15 = -15 $\pmod{26}$ = 11 $\rightarrow$ l
5.  D(03) - 15 = -12 $\pmod{26}$ = 14 $\rightarrow$ o
6.  結果: **hello**


### 03-02. 單字母加密法：密碼分析
凱撒加密法很容易被破解，因為：
1.  **演算法公開**。
2.  **金鑰空間小**: 只有 25 種可能的金鑰 (不包含 $k=0$)。
3.  **明文語言可識別** (具有統計特性)。

**暴力破解法 (Brute-Force Attack)**
嘗試所有 25 個可能的金鑰，直到找到有意義的明文。
- **範例**: 密文 `VHFXUH DOO PHVVDJHV`，當試到 $k=3$ 時，解密得到 `secure all messages`。

\begin{equation}
C = E(P) = (P+k) mod (26) = (P+3) mod (26)
\end{equation}

\begin{equation}
P = D(P) = (C-k) mod (26) = (C-3) mod (26)
\end{equation}
![截圖 2025-10-16 凌晨1.33.25](https://hackmd.io/_uploads/rkGloUpaee.png)

**統計分析法 (Statistical Cryptanalysis)**:
- **原理**: 任何語言的字母都有其出現頻率（例如，英文中 `E` 最常見）。在足夠長的密文中，出現頻率最高的密文字母很可能對應到明文的 `E`。
- **步驟**:
    1.  統計密文中每個字母的出現頻率。
    2.  將頻率最高的密文字母對應到英文中頻率最高的字母 (如 'e')。
    3.  計算出位移金鑰 k。
    4.  用此金鑰解密全文進行驗證。
![截圖 2025-10-16 凌晨1.34.15](https://hackmd.io/_uploads/SJN7j8aTgx.png)

:::success
**重點筆記**：範例
- Eve 攔截了以下密文，並用統計攻擊找到明文
![截圖 2025-10-16 凌晨1.35.25](https://hackmd.io/_uploads/rJKPs86pll.png)

- 解法：統計後發現，最常出現的字母是 `I` (14次)。假設 `I` 對應到明文的 `e`。
    1. I = 8, e = 4
    2. $k = C - P = 8 - 4 = 4$
    3. Eve 猜測金鑰 $k=4$，並嘗試解密。
![截圖 2025-10-16 凌晨1.35.49](https://hackmd.io/_uploads/rJlYsLTpex.png)


:::
### 03-03. 單字母加密法：乘法與仿射加密法

**乘法加密法 (Multiplicative Cipher)**:
* **原理**: 使用乘法進行加密。
* **數學公式**:
    1. 加密: $C = (P \cdot k) \pmod{26}$
    2. 解密: $P = (C \cdot k^{-1}) \pmod{26}$
- **金鑰限制**: 金鑰 $k$ 必須與 26 互質 (即 $gcd(k, 26) = 1$)，這樣才有乘法反元素 $k^{-1}$ 存在。
- **金鑰空間**: 只有 12 個可能的 $k$：{1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25}。
![截圖 2025-10-16 凌晨1.36.15](https://hackmd.io/_uploads/HyLhoLa6ll.png)
![截圖 2025-10-16 凌晨1.45.44](https://hackmd.io/_uploads/BJvApLTpxl.png)

- **範例 (加密)**: 使用金鑰 $k=5$ 加密 "HI"。
    1.  H(7) $\rightarrow (7 \cdot 5) \pmod{26} = 35 \pmod{26} = 9 \rightarrow$ J
    2.  I(8) $\rightarrow (8 \cdot 5) \pmod{26} = 40 \pmod{26} = 14 \rightarrow$ O
    3.  密文: **JO**
- **範例 (解密)**: 解密 "JO"，金鑰 $k=5$。
    1.  首先找到 5 的反元素：$5 \cdot k^{-1} \equiv 1 \pmod{26}$。$k^{-1} = 21$ (因為 $5 \cdot 21 = 105 = 4 \cdot 26 + 1$)。
    2.  J(9) $\rightarrow (9 \cdot 21) \pmod{26} = 189 \pmod{26} = 7 \rightarrow$ H
    3.  O(14) $\rightarrow (14 \cdot 21) \pmod{26} = 294 \pmod{26} = 8 \rightarrow$ I
    4.  明文: **HI**

**仿射加密法 (Affine Cipher)**:
* **原理**: 結合了**乘法加密**和**加法加密**，安全性更高。
- **金鑰**: 使用一對金鑰 $(k_1, k_2)$，其中 $k_1$ 是乘法金鑰 (必須與 26 互質)，$k_2$ 是加法金鑰。
* **金鑰空間**: $12 \times 26 = 312$ 種可能。
* **數學公式**:
    1. 加密: $C = (P \cdot k_1 + k_2) \pmod{26}$
    2. 解密: $P = ((C - k_2) \cdot k_1^{-1}) \pmod{26}$
* **關係**: 加法加密是仿射加密在 $k_1 = 1$ 時的特例；乘法加密則是 $k_2 = 0$ 時的特例。

![截圖 2025-10-16 凌晨1.47.55](https://hackmd.io/_uploads/rJDL0Iaaxe.png)

:::success
**重點筆記**：
**範例一**：Encrypt the message “hello” using an affine cipher with the key pair (7, 2).
![截圖 2025-10-16 凌晨2.18.23](https://hackmd.io/_uploads/r1s_SDaTeg.png)

**範例二**：Decrypt the ciphertext “ZEBBW” using an affine cipher with key pair (7, 2) modulo 26.
![截圖 2025-10-16 凌晨2.19.19](https://hackmd.io/_uploads/ByWnHwp6le.png)
:::

### 03-04. 單字母加密法：一般取代加密
- **動機**: 由於加法、乘法等加密法的金鑰空間太小，一個更安全的方法是建立一個**完全自訂**的對應表，將每個明文字母隨機映射到一個唯一的密文字母。
- **金鑰**: 金鑰就是這個完整的對應表（密文的字母排列組合）。
    1. Plaintext: `this message is easy to encrypt but hard to find the key`
    2. Ciphertext: `ICFVQRVVNEFVRNVSIYRGAHSLIOJCNHTIYBFGTICRXRS`
    3. 使用這個金鑰，`this message` 會被加密成 `ICFVQRVVNEFV`。
- **金鑰空間**: 由於密文可以是 26 個字母的任意排列 (Permutation)，總金鑰數量高達 **26!** (約等於 $4 \times 10^{26}$)，暴力破解不可行。
- **弱點**: 儘管金鑰空間巨大，但這種加密法**很容易被頻率分析攻破**。因為它只是簡單地替換字母，並沒有改變語言本身的統計特性（如字母、雙字母組、三字母組的頻率）。
- **對策**: 採用**同音詞 (homophones)**，即為一個常用明文字母提供多個不同的密文字母來替換，藉此混淆頻率分佈。

![截圖 2025-10-16 凌晨2.42.13](https://hackmd.io/_uploads/HkHfsPTTle.png)

### 03-05. 多字母加密法：維吉尼亞加密法

為了克服單字母加密法易被頻率分析破解的弱點，多字母加密法被提出。它的核心思想是**讓同一個明文字母可以被加密成不同的密文字母**。

* **原理**: 本質上是使用一系列不同的凱撒加密法。它使用一個**關鍵字 (keyword)** 來決定每次位移的量。它的核心是使用一組由 26 個凱撒加密法（位移量 0 到 25）組成的替換規則。
* **金鑰**: 使用一個重複的關鍵字 $(k_1, k_2, ..., k_m)$，將其重複延展，以產生與訊息等長的**金鑰流 (Key stream)**。
* **強度**: 其優勢在於同一個明文字母可以被加密成多個不同的密文字母，有效地掩蓋了字母的頻率資訊。
* **觀點**:
    1. 維吉尼亞加密法可以被視為 m 個加法加密（凱撒加密法）的組合 。
    2. 當關鍵字長度 m = 1 時，維吉尼亞加密法就退化為凱撒加密法 
- **數學公式**:
    1. 加密: $C_i = (P_i + k_i) \pmod{26}$ 
    2. 解密: $P_i = (C_i - k_i) \pmod{26}$ 
![截圖 2025-10-16 凌晨3.03.12](https://hackmd.io/_uploads/BkjllOT6ge.png)
* **範例**: 使用一個 6 個字母的關鍵字 "PASCAL" 來加密訊息 "she is listening" 。
    1. 初始金鑰流是 (15, 0, 18, 2, 0, 11) 。
    2. 將關鍵字重複延展，使其長度與明文相同，形成金鑰流 (Key stream) 。
![截圖 2025-10-16 凌晨3.09.26](https://hackmd.io/_uploads/Hkzu-u6Tgl.png)

- **流程**:
    1.  選擇一個關鍵字，例如 `PASCAL` 。
    2.  將關鍵字重複延展，使其長度與明文相同，形成金鑰流 (Key stream) 。
    3.  將明文的每個字母，根據其對應位置的金鑰流字母，進行凱撒加密。
![截圖 2025-10-16 凌晨3.10.26](https://hackmd.io/_uploads/B13jWdTTeg.png)

![截圖 2025-10-16 凌晨3.10.43](https://hackmd.io/_uploads/BykTbuaTgl.png)



:::success
**重點筆記**：例子
使用關鍵字 `KEY` (10, 4, 24) 加密明文 `GEMINI` (6, 4, 12, 8, 13, 8)。
1.  金鑰流: `KEYKEY` $\rightarrow$ (10, 4, 24, 10, 4, 24)
2.  G(6) + K(10) = 16 $\rightarrow$ Q
3.  E(4) + E(4) = 8 $\rightarrow$ I
4.  M(12) + Y(24) = 36 $\pmod{26}$ = 10 $\rightarrow$ K
5.  I(8) + K(10) = 18 $\rightarrow$ S
6.  N(13) + E(4) = 17 $\rightarrow$ R
7.  I(8) + Y(24) = 32 $\pmod{26}$ = 6 $\rightarrow$ G
8.  密文為 **QIKSRG**。
:::
![截圖 2025-10-16 晚上7.41.28](https://hackmd.io/_uploads/B1_g5I0Tll.png)

**密碼分析 (Kasiski 測試)**:
-  假設我們截取到以下的密文：
![截圖 2025-10-16 晚上7.56.28](https://hackmd.io/_uploads/SyD_TURaee.png)
- 尋找密文中重複出現的字串，並計算它們之間的距離。
![截圖 2025-10-16 晚上7.57.15](https://hackmd.io/_uploads/Sy8oaIRpxg.png)
- 這些距離 (100, 48, 60, 8) 的最大公因數 (GCD) 很可能是金鑰的長度。 $GCD(100, 48, 60, 8) = 4$。
- 若猜測 $m=4$，可將密文分成四份，對每一份分別進行單字母的頻率分析。
![截圖 2025-10-16 晚上7.58.44](https://hackmd.io/_uploads/HJJbCI06xe.png)
- 以下的部分明文是合理的：
![截圖 2025-10-16 晚上7.59.20](https://hackmd.io/_uploads/B17QC8RTex.png)




### 03-06. 多字母加密法：自動金鑰加密法 (Autokey Cipher)
- **原理**: 這是維吉尼亞加密法的一種改良，旨在減少金鑰重複性。它的金鑰流由一個**初始金鑰**和**明文本身**組成。
- **流程**: 金鑰流的第一個元素是初始金鑰，後續的元素直接使用明文的字母。
- **數學公式**：
![截圖 2025-10-16 晚上8.02.14](https://hackmd.io/_uploads/SyfARLCaxe.png)
- **範例**: 使用初始金鑰 $k_1=12$ 加密 "attackistoday" 
    1. 明文: a(00) t(19) t(19) a(00) c(02) k(10) ...
    2. 金鑰流: 12 a(00) t(19) t(19) a(00) c(02) ...
    3. 密文 C = P + K:
        - (0 + 12) $\pmod{26}$ = 12 $\rightarrow$ M
        - (19 + 0) $\pmod{26}$ = 19 $\rightarrow$ T
        - (19 + 19) $\pmod{26}$ = 38 $\pmod{26}$ = 12 $\rightarrow$ M
        - (0 + 19) $\pmod{26}$ = 19 $\rightarrow$ T
        - (2 + 0) $\pmod{26}$ = 2 $\rightarrow$ C
        - (10 + 2) $\pmod{26}$ = 12 $\rightarrow$ M
    - 結果: **MTMTCM...**
![截圖 2025-10-16 晚上8.03.05](https://hackmd.io/_uploads/S1rbkD0Tgl.png)


### 03-07. 多字母加密法：一次性密碼本 (OTP)
![截圖 2025-10-16 晚上8.09.33](https://hackmd.io/_uploads/BkitgvC6xx.png)

OTP (One-Time Pad) 是由 Joseph Mauborgne 於 1917 年提出的改進。它是唯一被證明為**絕對無法破解**的加密方法，能達到**完美保密 (Perfect Secrecy)**。
- **核心原則**:
    1. **隨機金鑰**:使用一個與訊息等長的**真正隨機**的金鑰。
    2. **一次性**: 金鑰僅用於加密和解密單一訊息，之後便被銷毀 。
    3. **長度匹配**: 每條新訊息都需要一個與其等長的新金鑰 。
- **為何無法破解**:
    1. Shannon 的研究表明，如果明文中的每個符號都用一個從金鑰空間中隨機選擇的金鑰來加密，就可以實現完美保密 。
    2. 對於任何一段密文，它都可能對應到**任何一段**等長的明文，破解者無法有任何偏好。
- **運作**: 通常使用 XOR (互斥或) 運算：
    1. 加密: $Ciphertext = Plaintext \oplus Key$
    2. 解密: $Plaintext = Ciphertext \oplus Key$
- **範例 (二進位)**:
    1.  明文: `10110`
    2.  金鑰: `01101` (隨機產生)
    3.  加密 (XOR): `11011`
    4.  解密 (XOR): `11011` (密文) $\oplus$ `01101` (金鑰) = `10110` (明文)
- **實務上的困難**:
    1.  **金鑰生成問題**: 大量生成真正的隨機金鑰是具挑戰性的。
    2.  **金鑰分發問題**: 安全地分發與訊息等長的金鑰極其困難。
- **應用**: 由於上述困難，OTP 的實用性有限，主要用於需要極高安全性的低頻寬通道（如冷戰時期的「紅色電話」）。

### 03-08. 機械式加密：轉子機 (Rotor Machine)

在現代密碼學出現之前，轉子機為安全通訊提供了一個比 OTP 更可行的解決方案 。

- **定義**: 轉子機是一種早期的機械式加解密設備 。
- **原理**: 它使用一個複雜的多字母替換密碼來處理文本訊息。每按一個鍵，內部的轉子 (Rotor) 就會旋轉，改變替換的規則，使得同一個明文字母（如 'A'）在訊息的不同位置會被加密成不同的密文字母。
- **歷史**: 在第二次世界大戰期間被廣泛使用，其中最著名的例子是德國的**恩尼格瑪密碼機 (Enigma machine)** 。
![截圖 2025-10-16 晚上8.35.03](https://hackmd.io/_uploads/BkmFUD0alx.png)


### 03-09. 多字母組加密法：Playfair 加密法

此類加密法一次對一個**字母區塊**進行加密，這能更好地隱藏字母頻率。

* **介紹**:
    1. Playfair 加密法是第一種也是最著名的多字母加密法。
    2. 它由英國科學家 Charles Wheatstone 於 1854 年發明。
    3. 曾在第一次世界大戰中被英軍以及第二次世界大戰中被美軍及其他盟軍用作標準的戰地加密系統。
* **原理**:
    1. 將明文中的**雙字母組 (bigrams)** 作為單一單位處理，並將其轉換為密文的雙字母組。
    2. 相較於單字母加密法，這是一個很大的進步，因為雙字母組共有 $26 \times 26 = 676$ 種組合。
    3. 加密的基礎是使用一個由**關鍵字 (keyword)** 建構的 **5x5 字母矩陣**。
* **金鑰矩陣建構**:
    1.  將關鍵字的字母（去除重複）由左至右、由上至下填入矩陣。
    2.  接著，將字母表中剩餘的字母按順序填滿矩陣。
* **加密規則**:
    1.  **同行**: 取右邊的字母（若在最右則循環至最左）。
    2.  **同列**: 取下方的字母（若在最下則循環至最上）。
    3.  **不同行不同列**: 取構成矩形的另外兩個對角字母。
- **明文處理規則**:
    1.  將明文兩兩分組。
    2.  若一組中兩個字母相同 (如 `HELLO` $\rightarrow$ `HE` `LL` `O`)，在中間插入一個填充字母 (如 `X`) $\rightarrow$ `HE` `LX` `LO`。
    3.  若明文長度為奇數，在末尾加上一個填充字母。
:::success
**重點筆記**：範例: 使用 "MONARCHY" 關鍵字矩陣加密 "HI"。
1.  明文組: `HI`
2.  H 和 I 在矩陣中不同行不同列 (H 在第2行第2列, I/J 在第3行第4列)。
3.  它們構成的矩形另外兩個角是 Y (第2行第4列) 和 F (第3行第2列)。
4.  **H** (第2行) $\rightarrow$ 取同行的角 $\rightarrow$ **B**
5.  **I** (第3行) $\rightarrow$ 取同行的角 $\rightarrow$ **F**
<center>

| M | O | N | A | R |
|---|---|---|---|---|
| C | H | Y | B | D |
| E | F | G | I/J| K |
| L | P | Q | S | T |
| U | V | W | X | Z |

</center>
:::

:::success
**重點筆記**：例子：使用下方鑰匙表加密明文 "hello"。
1.  明文: `hello` $\rightarrow$ `he` `lx` `lo` (重複字母 `l` 中間插入 `x`)
2.  `he` $\rightarrow$ `EC` (不同行不同列: H在第2行, E在第2行。應為 `ME` (同列) 或 `EC` (同行)？依據您筆記的 `EC`，規則應為同行)
3.  `lx` $\rightarrow$ `QZ` (不同行不同列: L在第1行, X在第4行 $\rightarrow$ 角為 Q, Z)
4.  `lo` $\rightarrow$ `BX` (不同行不同列: L在第1行, O在第4行 $\rightarrow$ 角為 B, X)
5.  密文: `ECQZBX`
<center>

| L | G | D | B | A |
|---|---|---|---|---|
| Q | M | H | E | C |
| U | R | N | I/J| F |
| X | V | S | O | K |
| Z | Y | W | T | P |

</center>
:::


### 03-10. 多字母組加密法：Hill 加密法

- **介紹**: 由數學家 Lester Hill 於 1929 年發明，使用**線性代數**（矩陣運算）來加密多個字母組。
- **原理**: 使用一個 $m \times m$ 的可逆矩陣作為金鑰。
    1. 加密: $C = P \cdot K \pmod{26}$
    2. 解密: $P = C \cdot K^{-1} \pmod{26}$
- **優點**: 完全隱藏單字母頻率；矩陣越大 ($m$ 越大)，隱藏的資訊越多 (能隱藏 $m-1$ 個字母組的頻率)。對**唯密文攻擊**有很強的抵抗力。
- **弱點**: 容易被**已知明文攻擊 (Known-Plaintext Attack)** 破解。攻擊者只需 $m$ 組 (每組 $m$ 個字母) 的明文-密文對，即可建立 $m$ 條線性方程組，解出金鑰矩陣 $K$。

:::success
**重點筆記**：範例一
- 明文「code is ready」，使用 $3 \times 3$ 矩陣加密。
- 將明文分組: `cod` `eis` `rea` `dyz` ( `z` 為填充字母)。
- 轉換為 $4 \times 3$ 的明文矩陣 $P$。
- $C = P \cdot K \pmod{26}$ 得到密文矩陣 $C$。
- 密文為「OHKNIHGKLISS」。
![截圖 2025-10-16 晚上9.05.07](https://hackmd.io/_uploads/BkCKpD0pgg.png)
:::

:::success
**重點筆記**：範例二
- 假設 Eve 知道 $m=3$，並攔截了三組明文/密文對 (共 9 個字母)。
![截圖 2025-10-16 晚上9.05.35](https://hackmd.io/_uploads/Sk5jpvCTel.png)
- 她可以建立明文矩陣 $P$ 和密文矩陣 $C$。
- 由於 $C = P \cdot K$，她可以計算 $K = P^{-1} \cdot C \pmod{26}$。
- ( $P^{-1}$ 是 $P$ 在 $\pmod{26}$ 下的反矩陣)
![截圖 2025-10-16 晚上9.05.52](https://hackmd.io/_uploads/rys2pvRTeg.png)
- 得到金鑰 $K$ 後，她就能破解任何使用此金鑰加密的密文。
:::

<br>

## 04. 換位技術詳解

換位技術的核心是**重新排列 (rearrange)** 訊息中的字元順序，字元本身不變 。

### 04-01. 無金鑰換位法

排列規則是固定的，不需要額外金鑰。

**反轉換位 (Reverse Cipher)**: 直接將明文反轉。
- 明文: "meet me Monday morning"
- 密文: "GNINROM YADNOM EM TEEM"

**柵欄加密法 (Rail Fence Cipher)**:
- **原理**: 將明文以 Z 字形寫在指定數量的 "柵欄" (橫列) 上，然後逐行讀取。
- **範例 (2-rail)**: 加密 "meet me at the park"。
    ```
    m . e . m . a . t . e . p . r .
    . e . t . e . t . h . a . k
    ```
- 讀取第一行，再讀取第二行，得到密文: "MEMATEAKETETHPR"
- **範例 (3-rail)**: 加密 "WE ARE DISCOVERED FLEE AT ONCE"
    ```
    W . . . E . . . C . . . R . . . L . . . T . . . E
    . E . R . D . S . O . E . E . F . E . A . O . C .
    . . A . . . I . . . V . . . D . . . E . . . N . .
    ```
- 密文 (逐行讀取): `WECRLTE ERDSOEEFEAOC AIVDEN`

**無金鑰行換位 (Columnar Transposition)**:
- **原理**: 將明文逐行寫入固定欄數的表格中，再逐欄讀出。
- **範例 (以 4 欄為一單位)**: 加密 "meet me at the park" ( `park` 後補一個假字元如 `x`)。
    ```
    m e e t
    m e a t
    t h e p
    a r k x
    ```
- 逐欄讀取得到密文: "MMTAEEHREAEKTTP"。
![截圖 2025-10-16 凌晨3.34.25](https://hackmd.io/_uploads/rJ6BPOTpee.png)

### 04-02. 有金鑰換位法：行換位加密法

**原理**: 使用**排列金鑰 (permutation key)** 來重新排列字元。金鑰定義了欄位的讀取順序。
**方法**: 將明文分組（區塊），再利用一個金鑰分別更換每個區塊的字元。
![截圖 2025-10-16 凌晨3.40.44](https://hackmd.io/_uploads/BkOauOpaxg.png)

**金鑰**: 通常是一個數字序列（如 `3-1-4-5-2`）或一個單字（其字母順序決定欄位順序，如 `ZEBRA` $\rightarrow$ `5-2-1-3-4`）。
**流程**:
- **加密**: 將明文逐行寫入表格，然後根據金鑰指定的順序逐欄讀出。
- **解密**: 根據解密金鑰（加密金鑰的反向操作），將密文逐欄填入表格，再逐行讀出。

**範例**: 加密 "enemy attacks tonight"，金鑰為 `31452`。
```
  1 2 3 4 5  (金鑰)       3 1 4 5 2  (密鑰)
-------------           -------------
  e n e m y              E E M Y N
  a t t a c              T A A C T
  k s t o n              T K O N S
  i g h t z              H I T Z G
```
**加密 (讀出)**: 按照金鑰順序 1-2-3-4-5 讀出對應的欄。
- 讀第 1 欄 (金鑰 1): `ETTH`
- 讀第 2 欄 (金鑰 2): `EAKI`
- 讀第 3 欄 (金鑰 3): `NAIT`
- 讀第 4 欄 (金鑰 4): `YCNZ`
- 讀第 5 欄 (金鑰 5): `NTSG`

組合密文為: `NTSGYCHZEAKIMATOECN` (注意：您筆記中的範例 `ETTHEAK...` 是另一種讀取方式，這裡是標準的按金鑰順序讀取。)
![截圖 2025-10-16 凌晨3.41.21](https://hackmd.io/_uploads/Sk3JFOppll.png)
**解密 (金鑰倒轉)**:
- 加密金鑰 (順序 $\rightarrow$ 位置): 1 $\rightarrow$ 2, 2 $\rightarrow$ 5, 3 $\rightarrow$ 1, 4 $\rightarrow$ 3, 5 $\rightarrow$ 4
- 解密金鑰 (位置 $\rightarrow$ 順序): 1 $\rightarrow$ 3, 2 $\rightarrow$ 5, 3 $\rightarrow$ 1, 4 $\rightarrow$ 4, 5 $\rightarrow$ 2 $\rightarrow$ 金鑰為 `35142`![截圖 2025-10-16 凌晨3.41.31](https://hackmd.io/_uploads/ByUeYupple.png)

**解密 (寫入)**:
1. 密文 `NTSGYCHZEAKIMATOECN`，每 4 個字元一組 (因原文 20 字元 / 5 欄 = 4 列)。
2. `NTSG` `YCHZ` `EAKI` `MATO` `ECN` (最後一組不足)
3. 根據解密金鑰 `35142` 填入表格：
    ```
      3 5 1 4 2 (解密金鑰)
    -------------
    e n e m y
    a t t a c
    k s t o n
    i g h t z
    ```
4. **解密 (讀出)**: 逐行讀出即可得明文 `enemyattackstonightz`。
![截圖 2025-10-16 凌晨3.42.17](https://hackmd.io/_uploads/SyLQYdT6gx.png)

**換位加密法之金鑰倒轉**
![截圖 2025-10-16 凌晨3.42.01](https://hackmd.io/_uploads/BJmfKOTagl.png)
**利用矩陣陳列換位加密法的加密／解密**
![截圖 2025-10-16 凌晨3.42.08](https://hackmd.io/_uploads/H1iMYu6pgx.png)

### 04-03. 雙重換位加密法

* **原理**: 為了增加安全性，將行換位加密法**執行兩次**。第一次加密產生的密文作為第二次加密的明文。可以使用相同或不同的金鑰。
* **範例**:
    1.  明文: `ATTACK AT DAWN`
    2.  第一次加密 (金鑰 `312`):
        ```
        3 1 2
        A T T
        A C K
        A T D
        A W N
        ```
    3.  讀出 (1, 2, 3): `TCTW` `AKDN` `AAAA` $\rightarrow$ 密文1: `TCTWAKDNAAAA`
    4.  第二次加密 (金鑰 `213`):
        ```
        2 1 3
        T C T
        W A A
        K D N
        A A A
        ```
    5.  讀出 (1, 2, 3): `CADA` `TWKA` `TANA` $\rightarrow$ 最終密文: `CADATWKATANA`
<br>

## 05. 現代加密觀念分類
雖然這種分類法被應用於現代加密法中，但這種分類法其實也可以應用於傳統加密法
### 05-01. 區塊加密法 (Block Ciphers)

- **定義**: 將明文分割成固定大小的**區塊 (Block)**，每次使用**單一金鑰**對一整個區塊進行加密。
- **特性**: 每個區塊加密法都是一個多字母組加密法，因為密文區塊中的每個字元都取決於明文區塊中的所有字元。
- **古典範例**: Playfair 加密法 (區塊大小為 2)，Hill 加密法 (區塊大小為 $m$)。
![截圖 2025-10-16 晚上9.27.44](https://hackmd.io/_uploads/Hk2RGu06xe.png)

### 05-02. 串流加密法 (Stream Ciphers)

* **定義**: 對明文**逐一字元 (或位元)** 進行加密。每個字元都使用來自**金鑰流 (Key Stream)** 的相應元素進行加密。
* **分類**:
    1. **單字母串流加密法**: 如果金鑰流與位置無關（如凱撒加密），則為單字母加密。
    2. **多字母串流加密法**: 如果金鑰流與位置有關（如維吉尼亞加密），則為多字母加密。
* **古典範例**:
    1. **Additive Cipher / Caesar Cipher**: 金鑰流是重複的單一金鑰 $(k, k, k, ...)$ 。
    2. **Vigenère Cipher**: 金鑰流是重複的關鍵字 $(k_1, k_2, ..., k_m, k_, ...)$ 
![截圖 2025-10-16 晚上9.28.54](https://hackmd.io/_uploads/B1SXQORagl.png)

### 05-03. 組合應用

* 一個加密法可以同時具有區塊和串流的特性。
* 例如，明文區塊可以被獨立加密（區塊特性），但整個訊息卻是透過一個金鑰流以逐塊的方式進行加密的（串流特性）。
* 換言之，以獨立區塊來看，此加密法為區塊加密法；但就整個訊息而言，若將一個區塊視為一個單位，則此加密法就是串流加密法
* 在這種組合模型中，每個區塊甚至可以使用不同的金鑰。


