---
# System prepended metadata

title: 【密碼學 VIII - Modern Stream Ciphers】

---

# 【密碼學 VIII - Modern Stream Ciphers】

## 01. 現代串流加密法基礎

### 01-01. 定義與核心概念
現代串流加密法將資料視為連續的位元流，其運作單位不再僅限於單一位元，而是可以一次處理 **$r$ 位元 ($r$ bits)**。
* **系統模型**：
    1. 明文串流 $P = p_n \dots p_2 p_1$、密文串流 $C = c_n \dots c_2 c_1$ 與金鑰串流 $K = k_n \dots k_2 k_1$，其中的 $p_i, c_i, k_i$ 皆為 $r$-bit 的字組 (Words)。
    2. 加密時，使用金鑰串流對應的 $r$-bit 區塊來加密明文區塊。
* **本質**：這種方式可被視為一種運作在極小區塊上的**機率性區塊加密法 (Probabilistic Block Cipher)**。將明文串流（Plaintext Stream）的每一個位元，與金鑰串流（Keystream）的對應位元進行運算（通常是 XOR）以產生密文。
* **特性**：
    1. 可以視為一種運作在極小區塊上的機率性區塊加密法。
    2. **優點**：速度快、程式碼量小，非常適合即時視訊、瀏覽器連線等需要連續傳輸的場景。
    3. **禁忌**：金鑰串流絕對**不可重複使用**（Key Reuse）。
![截圖 2025-12-10 凌晨1.55.20](https://hackmd.io/_uploads/BkH9MkLz-g.png)

### 01-02. 同步與非同步架構
根據金鑰串流的產生方式，可分為兩類：

**同步串流加密（Synchronous Stream Ciphers）**：
* 金鑰串流的產生**獨立**於明文或密文。
* 傳送方與接收方必須保持精確同步，若傳輸中遺失一個位元，後續解密將全部錯誤。

**非同步串流加密（Asynchronous / Self-synchronizing）**：
* 金鑰串流的產生**依賴**於先前的密文區塊。
* 具有自我同步能力，若發生傳輸錯誤，僅會影響後續幾個區塊，之後會恢復正常。

### 01-03. 關鍵特性與安全禁忌
* **主要優勢**：
    1. **速度快 (High Speed)** 與 **程式碼量小 (Small Code Size)**。
    2. 非常適合需連續傳輸的資料流，例如：**即時視訊 (Real-time video)** 與瀏覽器連線。
* **絕對禁忌：金鑰串流不可重複使用 (Must Not Be Reused)**
    1. 若兩段不同的密文使用了相同的金鑰串流，將兩段密文進行 XOR 運算，其結果等於兩段明文直接進行 XOR ($C_1 \oplus C_2 = P_1 \oplus P_2$)。
    2. 這會導致攻擊者在不知道金鑰的情況下，直接分析出明文之間的關係。


:::success
**重點筆記**：信用卡號攻擊
- 假設你使用相同的金鑰串流加密了兩筆交易資料。
- 攻擊者攔截到密文後將它們 XOR，得到了兩段明文的 XOR 值。若其中一段明文是已知的（例如常見的信用卡號前綴格式），攻擊者就能輕易利用這個結果去比對或還原另一張信用卡的號碼。
:::
<br>


## 02. 單次密碼本 (One-Time Pad, OTP)

### 02-01. 完美保密性
OTP 是串流加密的理論基礎，具有「資訊理論安全性」（Information-Theoretic Security），即理論上無法被破解。
![截圖 2025-12-01 凌晨1.25.33](https://hackmd.io/_uploads/BkvfCl5--x.png)

* **條件**：
    1. **真隨機性 (True Randomness)**：加密金鑰必須是真正的隨機產生，不能是偽隨機 。
    2. **長度要求 (Length)**：加密金鑰的長度必須**至少與訊息一樣長**。
    3. **單次使用與銷毀 (One-Time Use & Destruction)**：金鑰必須只使用一次，且需防止未經授權的存取。使用後應立即銷毀以防止被重複使用。

### 02-02. 運作原理與實務限制
* **加密公式**：$C_i = P_i \oplus K_i$
* **解密公式**：$P_i = C_i \oplus K_i$
* **實務限制**：在現實中，要產生並安全傳輸與訊息等長的真隨機金鑰非常困難，因此現代加密多使用「偽隨機」來模擬 OTP。

### 02-03. 密文型態分析 (Example 8.1)
為了理解 OTP 的性質，我們探討在四種不同明文情境下，產生的密文特性：

- **情境 A：明文全為 0 ($n$ zeros)**
    1. **結果**：密文串流將與金鑰串流完全相同 ($0 \oplus k_i = k_i$)。
    2. **隨機性**：因為金鑰是隨機的，所以密文也是隨機的，完全不會保留明文的「全 0」樣式 。

- **情境 B：明文全為 1 ($n$ ones)**
    1. **結果**：密文串流將是金鑰串流的補數 (Complement, 即 $1 \oplus k_i = \overline{k_i}$) 。
    2. **隨機性**：若金鑰是隨機的，其補數也是隨機的，因此密文依然保持隨機。

- **情境 C：明文為 0 與 1 交錯 ($0101\dots$)** 
    1. **結果**：每一個密文位元要麼等於金鑰位元，要麼等於其補數 。
    2. **隨機性**：在金鑰隨機的前提下，組合出來的結果仍然是隨機的 。

- **情境 D：明文為隨機位元串** 
    1. **結果**：密文必然是隨機的 。
    2. **原理**：因為兩個隨機位元的 XOR 運算結果，本身就是隨機的 。

無論明文長什麼樣子（全 0、全 1、規律或隨機），只要金鑰是真隨機且不重複使用，OTP 產生的密文就會呈現完美的隨機分佈，攻擊者無法從中分析出任何規律。

:::success
**重點筆記：XOR 的特性**
1. 設明文 $P = 1011$，金鑰 $K = 1100$。
2. **加密**：$1011 \oplus 1100 = 0111$ (密文 $C$)
3. **特性**：若你重複使用金鑰 $K$ 加密另一個明文 $P_2$，攻擊者將兩段密文 XOR，就會消掉金鑰，直接暴露兩段明文的關係（$C_1 \oplus C_2 = P_1 \oplus P_2$），這是極大的安全漏洞。
:::

<br>

## 03. 隨機數生成器 (Random Number Generators)
### 03-01. 基本定義與架構
**偽隨機數生成器 (PRNG) 的目標是產生一個看似隨機的數列，該數列必須具備以下特性：**
* **長週期 (Long Period)**：數列重複之前的間隔要夠長。
* **均勻分佈 (Uniform Distributed)**：0 與 1 出現的機率應相等。
* **不可預測 (Unpredictable)**：攻擊者無法推測下一個數值。

**系統運作流程**：
- **輸入來源**：必須是獨立且不可預測的（例如系統雜訊、滑鼠移動軌跡等）。
- **種子生成 (Seed Generation)**：透過種子生成演算法將輸入轉換為初始種子 ($x_0$)。
- **PRNG 演算法**：利用 $x_0$ 透過演算法產生隨機數列 ($x_1, x_2, \dots$)。
![截圖 2025-12-10 凌晨2.14.23](https://hackmd.io/_uploads/BJ6WDJLzbx.png)

**記憶性元件 (Memory Device)**：PRNG 通常包含記憶裝置，這意味著生成的數列會受到「先前數值」的影響。常見的實作方法包括：
* 線性回授移位暫存器 (Linear Feedback Shift Register, LFSR)
* 線性同餘產生器 (Linear Congruence Generator, LCG)
* 非線性亂數產生器 (Nonlinear Random Number Generator)
* 截切亂數產生器 (Truncated Random Number Generator)
* 數學建構亂數產生器 (Mathematically Constructed Random Number Generator)


### 03-02. 隨機性的三個層次
根據安全強度與特性的不同，隨機性可嚴謹地分為三個層級：

- **統計學偽隨機性 (Statistical Pseudo-randomness)**
    1. **定義**：位元序列滿足統計上的隨機分佈，即 1 的數量約等於 0 的數量。
    2. **限制**：僅「看起來」隨機，但可能容易被預測。
    3. **代表例子**：線性同餘產生器 (LCG)。

- **密碼學安全偽隨機性 (Cryptographically Secure Pseudo-randomness, CSPRNG)**
    1. **定義**：除了滿足統計隨機性，還必須**不可預測**。
    2. **嚴格要求**：給定隨機序列的前 $k$ 個位元，沒有任何多項式時間演算法能以顯著大於 $1/2$ 的機率準確預測出第 $k+1$ 個位元。
    3. **代表例子**：Blum Blum Shub (BBS) 產生器。

- **真隨機性 (True Randomness)**
    1. **定義**：除了滿足上述所有條件（統計性 + 密碼學安全性），還必須具備**不可重現性 (Non-reproducibility)**。
    2. **特性**：無法從相同的輸入數據重複產生相同的位元序列。
    3. **限制**：由於電腦演算法本質上是確定性的 (Deterministic)，因此真隨機無法僅靠演算法產生，必須依賴物理現象。
    4. **代表例子**：放射性物質的衰變速度、設計良好的實體擲骰子結果。

:::success
**重點筆記**：三種隨機性的差異
- 想像你在玩猜數字遊戲：
    1. **統計偽隨機 (LCG)**：就像一個依照特定公式洗牌的機器。雖然牌看起來很亂（紅黑各半），但如果你知道洗牌公式和第一張牌，你就能算出下一張牌是什麼。
    2. **密碼學安全 (CSPRNG)**：就像一個超級複雜的密碼鎖。即使你看了前面 100 個開出來的號碼，你也完全猜不到第 101 個號碼會是什麼，除非你能破解背後的超難數學題。
    3. **真隨機 (True Randomness)**：就像觀測原子衰變或擲骰子。上帝也不知道下一次什麼時候衰變或骰出幾點，這才是真正的「隨機」，且無法重來一次得到相同結果。
:::

<br>

## 04. 線性回授移位暫存器 (LFSR)
![截圖 2025-12-01 凌晨1.39.46](https://hackmd.io/_uploads/ryhPZb9Z-l.png)

### 04-01. 結構與運作
**LFSR 是由一串暫存器（Register）和一個回授函數（Feedback Function）組成。**
* **運作**：每個時脈週期，位元向左（或右）移位，最末端的位元輸出作為金鑰流的一部分，同時根據「抽頭（Taps）」位置的位元進行 XOR 運算，將結果回填至輸入端。
* **數學表示**：使用**回授多項式**（Feedback Polynomial）來描述 XOR 的連接位置。
* **多項式定義**：對於一個 $m$ 位元的 LFSR，我們將位元 $b_0$ 到 $b_m$ 對應到變數 $x^m, x^{m-1}, \dots, x^0$。
    1. **LSB ($b_0$)**：對應最高次項 $x^m$。
    2. **回授位元 ($b_m$)**：對應常數項 $1$ ($x^0$)，且必定存在於每個回授多項式中。
    3. **係數 $c_i$**：若 $c_i = 1$，代表該位元參與 XOR 運算；若 $c_i = 0$，則斷開連接。

:::success
**種點筆記**：建構 5-bit LFSR
- **題目**：建構一個 5 個記憶單元的 LFSR，回授函數為 $b_5 = b_4 \oplus b_2 \oplus b_0$。
- **分析**：
    1. 參與運算的位元是 $b_4, b_2, b_0$，因此對應的 $c_4, c_2, c_0$ 為 1。
    2. $b_3, b_1$ 未參與，係數為 0。常數項設置為 1 (代表$x^0 = 1$)
    3. **對應多項式**：$f(x) = x^5 + x^3 + x + 1$ (注意 $b_0$ 對應 $x^5$, $b_4$ 對應 $x$)。
- **電路圖**：如下圖所示，只有 $b_4, b_2, b_0$ 拉出線路進入 XOR。
![截圖 2025-12-01 凌晨1.48.27](https://hackmd.io/_uploads/BJUuX-5WZl.png)
:::



### 04-02. 週期與安全性
* **最大週期**：對於 $m$ 位元的 LFSR，最大週期為 $2^m - 1$（排除全 0 狀態）。
* **本原多項式 (Primitive Polynomial)**：若回授多項式是本原多項式（既不可約也是Primitive），則該 LFSR 可產生最大週期的序列。

:::success
**重點筆記**：4-bit LFSR 運作
- **設定**：4 個記憶單元，回授函數 $b_4 = b_1 \oplus b_0$。初始種子 (Seed) 為 $(0001)_2$。
- **多項式**：$f(x) = x^4 + x^3 + 1$ (對應 $b_0, b_1$ 參與回授)。
- **運作結果**：
    1. 產出的金鑰串流 ($k_i$) 為：`100010011010111...`
    2. 觀察發現，每 **15 個位元** 就會重複一次。
- **結論**：此 LFSR 產生的序列週期為 15。因為 $x^4 + x^3 + 1$ 是一個**本原多項式 (Primitive Polynomial)** 且不可約，因此它能達到該長度 LFSR 的**最大週期** ($2^m - 1 = 2^4 - 1 = 15$)。
![截圖 2025-12-01 凌晨1.50.11](https://hackmd.io/_uploads/BJWkV-5bZe.png)
![截圖 2025-12-01 凌晨1.51.16](https://hackmd.io/_uploads/SkJ7E-q-Zg.png)

:::

### 04-03. 增加週期的策略
為了提高安全性，我們希望週期越長越好，讓攻擊者難以預測。
- **增加長度**：理論上，$m$ 位元的 LFSR 最大週期可達 $2^m - 1$。長度越長，週期指數增長。
- **多重 LFSR 組合**：將多個不同週期的 LFSR 輸出進行 XOR 結合。
    1. **新週期計算**：若兩個 LFSR 週期分別為 $T_1$ 和 $T_2$，結合後的週期為 $\text{lcm}(T_1, T_2)$ (最小公倍數)。
    2. *公式*：$\text{lcm}(2^{m_1}-1, 2^{m_2}-1)$。
![截圖 2025-12-01 凌晨1.53.38](https://hackmd.io/_uploads/S16oEZq--g.png)

### 04-04. 線性複雜度 (Linear Complexity)
**線性複雜度** 是評估串流加密安全性的重要指標。
- **定義**：要產生特定序列 $s$，所需的**最短** LFSR 長度。
- **意義**：
    1. 若一個序列的線性複雜度 $L$ 很小，攻擊者只需攔截 $2L$ 長度的密文，就能解出整個 LFSR 的結構（利用矩陣運算求解係數 $c_i$）。
    2. 這屬於**已知明文攻擊 (Known-plaintext attack)**。
- **防禦**：現代串流加密通常會加入**非線性組合 (Nonlinear Combinations)**，以大幅提高線性複雜度，使攻擊者難以用單一 LFSR 來模擬。
![截圖 2025-12-01 凌晨1.53.55](https://hackmd.io/_uploads/BJ63EW5Wbg.png)

### 04-05. Berlekamp-Massey 演算法
這是一個用來攻擊 LFSR 的強大演算法。
- **功能**：給定一段長度為 $n$ 的位元序列，能在多項式時間內算出該序列的**線性複雜度 $L$** 以及對應的**回授多項式 $f(x)$**。
- **運作邏輯**：這是一個遞迴演算法，逐一檢查序列中的位元。若目前的 LFSR 無法產生下一個位元（出現差異 $d=1$），就修正多項式 $f(x)$ 並增加長度 $L$，直到能完美產生該序列為止。

```python=
INPUT: a binary sequence 𝑠𝑛 = 𝑠0, 𝑠1, 𝑠2, … , 𝑠𝑛−1 of length 𝑛.
OUTPUT: the linear complexity 𝐿 𝑠𝑛 of 𝑠𝑛, 0 ≤ 𝐿 𝑠𝑛 ≤ 𝑛.
1. Initialization: 𝑓 𝑥 ← 1, 𝐿 ← 0, 𝑚 ← −1, 𝐵 𝑥 ← 1, 𝑖 ← 0
2. While (𝑖 < 𝑛) do the following:
    2.1 Computing the next discrepancy 𝑑 ← 𝑠𝑖 + σ𝑗=1 𝐿 𝑐 𝑗𝑠𝑖−𝑗 mod 2
    2.2 If 𝑑 = 1, then do the following:
        𝑇 𝑥 ← 𝑓 𝑥 , 𝑓 𝑥 ← 𝑓 𝑥 + 𝐵 𝑥 ∙ 𝑥𝑖−𝑚.
        If 𝐿 ≤ 𝑖/2, then 𝐿 ← 𝑖 + 1 − 𝐿, 𝑚 ← 𝑖, 𝐵 𝑥 ← 𝑇 𝑥 .
    2.3 𝑖 ← 𝑖 + 1
3. Return (𝐿)
```

:::success
**重點筆記**：演算法執行結果
- 給定序列 $s = (1, 0, 1, 0, 0, 1, 1)$，長度 $n=7$。
- 執行 Berlekamp-Massey 演算法後，得出：
    1. 線性複雜度 $L = 3$
    2. 回授多項式 $f(x) = 1 + x + x^3$
- 這代表只要用一個 3-bit 的 LFSR 就能完全預測這個序列的後續發展。
![截圖 2025-12-01 凌晨1.55.48](https://hackmd.io/_uploads/SJgEHZqWZg.png)
:::

<br>

## 05. 其他生成演算法

### 05-01. 線性同餘產生器 (Linear Congruence Generator, LCG)
這是一種最基本且常見的偽隨機數生成方法，基於遞迴關係。
* **演算法公式**：
    $$x_{i+1} = (a \cdot x_i + b) \pmod m$$
    1. $x_0$：初始種子 (Seed)。
    2. $a, b, m$：構成密鑰的參數（$m$ 為模數，$a$ 為乘數，$b$ 為增量）。
* **全週期特性 (Full-Period)**：根據數論，若 $a, b, m$ 選擇得當，產生器可以產生一個包含 $m$ 個相異整數的「全週期」序列（最大週期 = $m$）。

:::success
**重點筆記**：參數選擇對週期的影響
- **案例 A (好的參數)**：
    1. 設 $m=8, a=5, b=3, x_0=3$。
    2. 序列：2, 5, 4, 7, 6, 1, 0, 3, 2...
    3. **結果**：週期為 8 (等於 $m$)，這是全週期序列。
- **案例 B (壞的參數)**：
    1. 設 $m=12, a=3, b=4, x_0=5$。
    2. 序列：7, 1, 7, 1...
    3. **結果**：週期僅為 2 (遠小於 $m$)，隨機性極差。
:::

* **LCG 的變形**：
    1.  **k 階 LCG (k-th Order LCG)**：當前的數值不僅取決於前一個 ($x_i$)，還取決於前 $k$ 個數值 ($x_i, \dots, x_{i-k+1}$)。
    2.  **簡化版 LCG (Simplified LCG)**：不使用增量 $b$。公式為 $x_{i+1} = a \cdot x_i \pmod m$。其週期取決於 $a$ 對模 $m$ 的階（Order）。

### 05-02. 非線性亂數產生器 (Nonlinear Random Number Generator)
為了克服線性產生器（如 LCG, LFSR）容易被預測的缺點，這類產生器引入了非線性結構。
* **架構**：使用多個 LFSR 作為輸入源，將它們的輸出送入一個 **非線性函數 (Nonlinear Function)** 進行混合運算。
* **目的**：破壞線性的數學關係，增加攻擊者逆推內部狀態的難度。
![截圖 2025-12-01 凌晨2.03.47](https://hackmd.io/_uploads/rJCZDWcZ-l.png)

### 05-03. 截切亂數產生器 (Truncated Random Number Generator)
* **原理**：不輸出產生器生成的完整序列，而是**部分擷取**。例如，產生了一長串數列，但只挑選其中的特定片段按順序輸出。
* **優點**：即使攻擊者破解了背後的線性關係，由於缺乏完整的連續數據，也很難重建整個序列。

:::success
**重點筆記**：截切操作
- 假設公式為 $x_{i+1} = 5x_i + 3 \pmod{16}$，種子 $x_0=1$。
- **原始完整序列**：`8, 11, 10, 5, 12, 15, 14, 9, 0, 3, 2, 13, 4, 7, 6, 1, 8...`
- **截切後輸出** (例如每隔幾個取一段)：`11, 10, 5, 15, 14, 9, 3, 2, 13, 7, 6, 1...` (原本連貫的數學關係被「跳過」的動作打斷了)。
:::

### 05-04. 數學建構亂數產生器
這類方法利用數論中的難題來確保隨機性與安全性。

**質數倒數法 (Prime Method)**
- 選擇一個大質數 $p$，計算 $1/p$。
- 取小數點後的第一個非零數字開始作為序列。
- 因為 $p$ 是質數，其最大週期可達 $p-1$。

**Blum Blum Shub (BBS)**：這是最著名的 **密碼學安全偽隨機數生成器 (CSPRNG)**，安全性基於二次剩餘 (Quadratic Residue) 問題。
* **設定步驟**：
    1.  選兩個大質數 $p, q$，滿足 $p \equiv q \equiv 3 \pmod 4$。
    2.  計算 Blum 整數 $n = p \times q$。
    3.  選一個與 $n$ 互質的數 $r$，計算種子 $x_0 = r^2 \pmod n$。
* **生成公式**：
    $$x_{i+1} = x_i^2 \pmod n$$
* **輸出**：通常取 $x_i$ 的最低有效位 (LSB) 作為隨機位元。
* **特性**：只要 $n$ 的因數分解很難，這個序列就無法被預測。
* **地位**：被證明具有極高的密碼學強度（CSPRNG），但運算速度較慢，適合產生金鑰而非大量資料加密。

<br>

## 06. 安全性評估：卡方檢定 (Chi-Square Test)

### 06-01. 基本概念與公式
卡方檢定是一種統計方法，用來評估隨機數生成器（RNG）產生的序列是否符合預期的機率分佈（即是否具備統計隨機性）。
* **原理**：比較「觀察到的次數」與「理論上應有的次數」之差異。
* **公式**：
    $$\chi^2 = \sum_{1 \le i \le k} \frac{(Y_i - nP_i)^2}{nP_i}$$
    1. $Y_i$：第 $i$ 種結果的**觀察次數** (Observed frequency)。
    2. $nP_i$：第 $i$ 種結果的**期望次數** (Expected frequency)，其中 $n$ 為總次數，$P_i$ 為該結果的理論機率。
* **先決條件**：為了確保準確性，樣本數 $n$ 必須夠大，使得每一項的期望次數 $nP_i$ 至少為 **5**。

### 06-02. 實例演示：擲骰子實驗
我們使用「同時擲兩顆骰子」的總和來進行檢定。

![截圖 2025-12-10 凌晨2.43.18](https://hackmd.io/_uploads/BJZApJUzZg.png)

* **情境**：
    1. 可能結果 ($k$)：2 到 12，共 11 種可能。
    2. 總次數 ($n$)：144 次。
* **數據比對**：理論上，擲 144 次骰子，總和為 2 的機率是 $1/36$（期望次數 4 次），總和為 7 的機率是 $6/36$（期望次數 24 次）。實驗數據如下：
    1. **觀察值 ($Y_i$)**：2, 4, 10, 12, 22, 29, 21, 15, 14, 9, 6
    2. **期望值 ($nP_i$)**：4, 8, 12, 16, 20, 24, 20, 16, 12, 8, 4
* **計算 $\chi^2$ 值**：將上述數據代入公式
    $$\chi^2 = \frac{(2-4)^2}{4} + \frac{(4-8)^2}{8} + \dots + \frac{(6-4)^2}{4} = 7 \frac{7}{48} \approx 7.146$$

### 06-03. 自由度與結果判讀
算出 $\chi^2$ 值後，我們需要判斷這個數值代表「隨機」還是「被操縱」。

- **計算自由度 (Degrees of freedom, df)**：在本例中，可能的結果有 11 種 ($k=11$)，因此自由度 $df = 10$。
    $$df = k - 1$$
    
- **查表判讀**：對照下方的卡方分佈表，找到 $df=10$ 的那一列。
    1. 我們算出的數值 **7.146** 落在 **6.18** ($p=0.80$) 與 **7.27** ($p=0.70$) 之間。
    2. 這代表其 $p$-value（機率）介於 70% 到 80% 之間。
![截圖 2025-12-01 凌晨2.09.59](https://hackmd.io/_uploads/SyrtdZcWZg.png)

- **決策規則 (Decision Rules)**：根據 $p$-value 來評估隨機性好壞
    1. **拒絕 (Reject)**：$p < 1\%$ 或 $p > 99\%$。 (**注意**：如果 $p$ 值過高（例如 99.9%），代表數據「太完美了」，反而極大可能是人為偽造的。)
    2. **可疑 (Suspect)**：$1\% \le p \le 5\%$ 或 $95\% \le p \le 99\%$。
    3. **良好 (Good)**：$20\% \le p \le 30\%$ 或 $70\% \le p \le 80\%$。
    4. **優秀 (Excellent)**：$30\% \le p \le 70\%$。

* **結論**：本例結果落在 70%~80% 區間，屬於 **"Good"**，表示這組骰子沒有明顯的作弊嫌疑。
* **建議**：通常建議至少進行 **3 次** 獨立測試，以獲得更具說服力的評估結果。

<br>

## 07. RC4 加密演算法

### 07-01. 簡介與特性
RC4 是由 Ron Rivest 於 1987 年為 RSA Security 設計的串流加密演算法。
- **運作單位**：以 **Byte (位元組)** 為單位進行運算，每位元組約需 8 到 16 次操作，速度極快。
- **金鑰長度**：可變動 (Variable)，提供彈性的加密強度。
- **週期**：研究顯示其週期極長，可能超過 $10^{100}$。
- **應用歷史**：由於效率高，曾廣泛用於 SSL、WEP 和 WPA 等協定中。

**RC4 的核心是維護一個 256 bytes 的狀態向量 $S$，運作分為兩個階段：**

- **初始化階段 (KSA, Key-Scheduling Algorithm)**：利用暫存向量 $T$ (填滿金鑰 $K$) 來打亂狀態向量 $S$ 的初始排列 ($0 \sim 255$)。
    ```text
    j = 0;
    for i = 0 to 255 do
        j = (j + S[i] + T[i]) mod 256
        swap(S[i], S[j])
    ```

:::info
**注意事項**：經過此步驟，S 陣列內的數值已被金鑰打亂，但仍包含 0 到 255 的所有數值。
:::
    

- **生成階段 (PRGA, Pseudo-Random Generation Algorithm)**：持續交換 $S$ 內部的元素並輸出金鑰流 $k$，再與明文 $M$ 進行 XOR。
    ```text
    i = 0, j = 0;
    For each message byte M_i:
        i = (i + 1) mod 256
        j = (j + S[i]) mod 256
        swap(S[i], S[j])
        t = (S[i] + S[j]) mod 256
        k = S[t]          // 產出的金鑰流 byte
        C_i = M_i XOR k   // 加密
    ```
![截圖 2025-12-01 凌晨2.17.42](https://hackmd.io/_uploads/HJl8c-q--g.png)

### 07-03. 廣播攻擊 (Broadcast RC4 Attack)
由 Itsik Mantin 與 Adi Shamir 於 2001 年提出，揭露了 RC4 的重大統計弱點。
* **垂直分析 (Vertical Analysis)**：不同於傳統分析單一金鑰流的偏差，此攻擊觀察「使用同一把金鑰加密不同明文」時，**相同位置**的輸出位元組。
* **偏差發現**：
    1. RC4 的 **第二個輸出 byte** 有強烈的偏差，傾向於出現 **0**。
    2. 實驗顯示，第二個 byte 為 0 的機率約為 $1/128$，遠高於隨機分佈應有的 $1/256$。
* **影響與解法**：
    1. 攻擊者可利用大量密文區分出 RC4 加密流與真隨機流 (Distinguishing Attack)，甚至還原資訊。
    2. **解法**：只要拋棄 RC4 輸出的**前幾個 bytes** (Drop the first few outputs)，即可避開此偏差。

### 07-04. 運作流程
RC4 分為兩個主要階段：
- **KSA (Key-Scheduling Algorithm)**：利用金鑰 $K$ 來打亂 S-Box 的初始排列（原本是 0~255 的順序）。
- **PRGA (Pseudo-Random Generation Algorithm)**：
    1. 持續交換 S-Box 內的元素並輸出數值作為金鑰流 $k$。
    2. 最後將 $k$ 與明文 $M$ 進行 XOR：$C = M \oplus k$。

### 07-05. 安全性崩潰與禁用
隨著時間推移，RC4 的安全性逐漸瓦解，最終被網路標準淘汰。
- **WEP 的設計缺陷**：IEEE 802.11 WEP 協定雖然使用 RC4，但因 IV (初始向量) 的構建方式有誤，導致金鑰極易被破解，WEP 因此被視為完全不安全。
- **NOMORE 攻擊**：2015 年針對 TLS 與 WPA-TKIP 的新攻擊，進一步證實了 RC4 在現代環境下的脆弱性。
- **正式禁用**：
    1. 2015 年 2 月，**RFC 7465** 發布，正式禁止在 TLS 的所有版本中使用 RC4。
    2. 取而代之的主流演算法為 **AES-GCM** 與 **ChaCha20-Poly1305**。

<br>

## 08. 常見串流加密攻擊手法

### 08-01. 相關初始化向量攻擊 (Related-IV Attack)
許多串流加密法會結合金鑰 (Key) 與初始化向量 (IV) 來產生金鑰串流，目的是確保即使使用同一把金鑰，每次加密也能產生不同的輸出。然而，若 IV 管理不當，將導致嚴重漏洞。

**攻擊原理**：
* 若兩個不同的加密過程使用了**相同**或**極為相似**的 IV，可能會產生相似甚至完全相同的金鑰串流 (Keystream Reuse)。
* **數學推導**：
    當金鑰串流 $K$ 被重複使用時：
    $$C_1 = P_1 \oplus K$$
    $$C_2 = P_2 \oplus K$$
    將兩式進行 XOR 運算：
    $$C_1 \oplus C_2 = (P_1 \oplus K) \oplus (P_2 \oplus K) = P_1 \oplus P_2$$
* **後果**：攻擊者無需知道金鑰 $K$，只要攔截密文 $C_1, C_2$，就能消除金鑰的保護，直接分析出明文之間的關係。

:::success
**重點筆記**：WEP 協定的崩潰
- IEEE 802.11 無線網路早期的 WEP 協定是此攻擊最著名的受害者。
- **設計缺陷**：WEP 直接將 24-bit 的 IV 與金鑰串接 (`RC4 key = IV || key`) 作為種子。
- **IV 過短**：24-bit 的空間太小，導致 IV 在短時間內就會發生重複 (Collision)。
- **結果**：攻擊者只需收集足夠的封包（Packet），利用 IV 重複的特性，幾分鐘內就能完全破解 WEP 金鑰。
:::

### 08-02. 區別攻擊 (Distinguishing Attack)
一個安全的串流加密法，其輸出應無法與「真隨機亂數」區分開來。此攻擊旨在打破這個假設。

* **攻擊目標**：不需要直接解出金鑰，而是試圖證明該加密法的輸出具有**統計偏差 (Statistical Bias)** 或非均勻的模式。
* **意義**：
    1. 若能將金鑰串流與真隨機區分開來，代表加密法存在結構性弱點。
    2. 這些統計偏差往往是更進一步攻擊（如金鑰還原）的基礎。
* **實例**：RC4 金鑰串流的**前幾個 Bytes** 具有顯著偏差（例如 Mantin's Bias），攻擊者利用這些偏差可以識別出 RC4 流量，甚至在 TLS 等協定中協助還原明文。

### 08-03. 猜測與決定攻擊 (Guess-and-Determine Attack)
這是一種針對加密法「內部狀態 (Internal State)」的攻擊方式，常見於攻擊基於 LFSR 的系統。

* **運作邏輯**：
    1.  **猜測 (Guess)**：攻擊者先猜測內部狀態的「一部分」（例如暫存器中的某幾個 bits）。
    2.  **推導 (Determine)**：利用加密法的結構特性（如遞迴公式），根據剛剛猜測的部分，推導出剩餘的內部狀態。
    3.  **驗證**：將推導出的完整狀態用來產生金鑰流，並與實際攔截到的金鑰流比對。若符合則猜測正確；若不符則修正猜測。
* **威脅**：一旦內部狀態被完全還原，攻擊者就能重建出過去與未來的所有金鑰串流，導致通訊完全透明化。