<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Security on kenji.blog</title><link>http://kenji.blog/zh-tw/categories/security/</link><description>Recent content in Security on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 21:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/zh-tw/categories/security/index.xml" rel="self" type="application/rss+xml"/><item><title>格子密碼學（Lattice-based cryptography）的數學直觀</title><link>http://kenji.blog/zh-tw/p/lattice-based-cryptography-math-intuition/</link><pubDate>Fri, 11 Sep 2026 21:00:00 +0900</pubDate><guid>http://kenji.blog/zh-tw/p/lattice-based-cryptography-math-intuition/</guid><description>&lt;img src="http://kenji.blog/p/lattice-based-cryptography-math-intuition/img/eyecatch.jpg" alt="Featured image of post 格子密碼學（Lattice-based cryptography）的數學直觀" />&lt;h1 id="1-導入後量子密碼學pqc的黎明與格子密碼學的崛起">1. 導入：後量子密碼學（PQC）的黎明與格子密碼學的崛起
&lt;/h1>&lt;p>支撐現代社會數位基礎設施的是以 RSA 密碼和橢圓曲線密碼（ECC）為首的公鑰密碼技術。這些密碼系統是將安全性的基礎建立在「質因數分解問題」與「離散對數問題」等數學難題上，人們相信傳統古典電腦無法有效率地解決這些問題（需要指數級時間）。&lt;/p>
&lt;p>然而，彼得·秀爾（Peter Shor）於1994年發表的「秀爾演算法（Shor&amp;rsquo;s algorithm）」在密碼學界引發了震撼。該演算法在數學上證明了，一旦大規模的量子電腦問世，就能在多項式時間內解決質因數分解問題與離散對數問題。這意味著目前被廣泛使用的公鑰密碼學，在未來將完全可能被破解。&lt;/p>
&lt;p>為了對抗這種「量子威脅（Quantum Threat）」，迫切需要研究即使使用量子電腦也難以破解的新型密碼系統。這就是被稱為「後量子密碼學（Post-Quantum Cryptography: PQC）」或「抗量子計算密碼學」的領域。&lt;/p>
&lt;p>PQC 有幾個有力的候選方案。包括基於雜湊的密碼學、基於編碼的密碼學、多變數多項式密碼學以及同源密碼學等，但其中目前最受矚目，且處於 NIST（美國國家標準暨技術研究院）PQC 標準化流程核心的，就是「格子密碼學（Lattice-based cryptography）」。與其他方法相比，格子密碼學具有極快的加密和解密處理速度，並具備一個在密碼理論中極為強大的安全性證明：將「最壞情況複雜度（Worst-case complexity）」歸約至「平均情況複雜度（Average-case complexity）」。&lt;/p>
&lt;p>本文將從作為格子密碼學基礎的「格子（Lattice）」的數學定義出發，深入淺出地解說格子上的困難問題，如 SVP（最短向量問題）和 CVP（最近點向量問題），以及可說是現代格子密碼學心臟的「LWE 問題（Learning With Errors，容錯學習問題）」。文中將結合數學公式、幾何直觀，以及具體的數值範例來進行徹底且深入的解說。&lt;/p>
&lt;h1 id="2-格子lattice的數學定義與幾何直觀">2. 格子（Lattice）的數學定義與幾何直觀
&lt;/h1>&lt;h2 id="21-向量空間與格子">2.1 向量空間與格子
&lt;/h2>&lt;p>在數學中，「格子（Lattice）」是指在 $n$ 維實數向量空間 $\mathbb{R}^n$ 內，有規則地排列的離散點的集合。雖然它與線性代數中學到的向量空間（Vector Space）相似，但有著決定性的差異。向量空間是由基底向量以「實數係數」的線性組合所表示的連續空間，而格子則是由基底向量以「整數係數」的線性組合所表示的離散空間。&lt;/p>
&lt;p>讓我們給出數學上嚴格的定義。考慮在 $m$ 維實數向量空間 $\mathbb{R}^m$ 中的 $n$ 個（$n \le m$）線性獨立的向量 $\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n$。將這些向量作為行向量構成的矩陣設為 $B = [\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n] \in \mathbb{R}^{m \times n}$。我們將這個 $B$ 稱為格子的「基底（Basis）」。&lt;/p>
&lt;p>由這個基底 $B$ 所生成的格子 $\mathcal{L}(B)$ 定義如下：&lt;/p>
$$
\mathcal{L}(B) = \left\{ \sum_{i=1}^{n} x_i \mathbf{b}_i \mathrel{\bigg|} x_i \in \mathbb{Z} \right\} = \{ B \mathbf{x} \mid \mathbf{x} \in \mathbb{Z}^n \}
$$
&lt;p>這裡的重點在於，係數 $x_i$ 僅限於整數 $\mathbb{Z}$，而非實數 $\mathbb{R}$。這使得空間內形成的不是無數連續的點，而是像等間距排列的十字路口般的「離散點的集合」。&lt;/p>
&lt;h2 id="22-幾何直觀">2.2 幾何直觀
&lt;/h2>&lt;p>讓我們以二維平面 $\mathbb{R}^2$ 為例來思考。如果選擇基底向量為 $\mathbf{b}_1 = \begin{pmatrix} 1 \\ 0 \end{pmatrix}$ 與 $\mathbf{b}_2 = \begin{pmatrix} 0 \\ 1 \end{pmatrix}$，由它們生成的格子，將會是座標平面上所有整數座標 $(x, y) \in \mathbb{Z}^2$ 的集合。這是最簡單的「正方格子」。&lt;/p>
&lt;p>然而，格子並不總是正交的。例如，如果我們考慮基底 $\mathbf{b}_1 = \begin{pmatrix} 2 \\ 1 \end{pmatrix}$ 與 $\mathbf{b}_2 = \begin{pmatrix} 1 \\ 3 \end{pmatrix}$，所生成的點將會像傾斜扭曲的網格交點。&lt;/p>
&lt;h2 id="23-基底的非唯一性與么模變換">2.3 基底的非唯一性與么模變換
&lt;/h2>&lt;p>這裡有一個攸關格子密碼學安全性根本的重要性質。那就是「能生成相同格子的基底有無數個」。&lt;/p>
&lt;p>例如，前面提到的由基底 $\mathbf{b}_1 = (1, 0)^T, \mathbf{b}_2 = (0, 1)^T$ 生成的 $\mathbb{Z}^2$ 格子，如果使用 $\mathbf{b}'_1 = (1, 1)^T, \mathbf{b}'_2 = (2, 3)^T$ 這個基底，也會生成完全相同的格子 $\mathbb{Z}^2$。&lt;/p>
&lt;p>某個基底 $B$ 和另一個基底 $B'$ 能生成相同格子的充分必要條件是：存在一個元素均為整數的矩陣 $U \in \mathbb{Z}^{n \times n}$，其行列式為 $\det(U) = \pm 1$，並且可以表示為：
&lt;/p>
$$ B' = B U $$
&lt;p>
這樣的矩陣 $U$ 被稱為「么模矩陣（Unimodular matrix）」。&lt;/p>
&lt;p>在密碼學應用上的基本概念是：將「好的基底（接近正交、由較短向量組成的基底）」作為私鑰，並將「壞的基底（互相極度斜交、由非常長的向量組成的基底）」作為公鑰。隨著維度的增加，要透過計算從壞的基底求出好的基底將會變得非常困難。這就是格子密碼學的基本直觀。&lt;/p>
&lt;h1 id="3-格子中的計算困難問題">3. 格子中的計算困難問題
&lt;/h1>&lt;p>格子密碼學的安全性仰賴於解決格子上特定數學問題的困難度。在這裡，我們介紹最基本且最著名的兩個問題。&lt;/p>
&lt;h2 id="31-最短向量問題shortest-vector-problem-svp">3.1 最短向量問題（Shortest Vector Problem: SVP）
&lt;/h2>&lt;p>SVP 是格子理論中最經典且著名的問題。&lt;/p>
&lt;p>&lt;strong>定義（SVP）：&lt;/strong>
給定任意格子基底 $B$，在該格子 $\mathcal{L}(B)$ 所屬的非零向量中，找出歐幾里得範數（長度）最小的向量 $\mathbf{v}$。&lt;/p>
&lt;p>用數學公式表示，就是求出使得 $\min_{\mathbf{v} \in \mathcal{L}(B) \setminus \{\mathbf{0}\}} \| \mathbf{v} \|$ 成立的 $\mathbf{v}$ 的問題。這個最小的長度記為 $\lambda_1(\mathcal{L})$，被稱為「格子的第一連續最小值（First successive minimum）」。&lt;/p>
&lt;p>如果是在二維或三維的低維度空間，只要畫個圖就能用肉眼找到最短的向量。或者，也可以使用高斯（Gauss）的格子基底歸約演算法等來有效率地解決。然而，當維度 $n$ 達到數百至數千這類高維度時，已知嚴格解出 SVP 是 NP 困難的。&lt;/p>
&lt;p>在現實的密碼學中，使用的是尋找「近似較短向量」的近似 SVP（$\gamma$-SVP），而不是嚴格的最短向量。當近似係數 $\gamma$ 為多項式大小時，該問題仍然被認為是非常困難的。&lt;/p>
&lt;h2 id="32-最近點向量問題closest-vector-problem-cvp">3.2 最近點向量問題（Closest Vector Problem: CVP）
&lt;/h2>&lt;p>CVP 也是格子密碼學中極為重要的問題。&lt;/p>
&lt;p>&lt;strong>定義（CVP）：&lt;/strong>
給定任意格子基底 $B$ 以及空間內任意的目標向量 $\mathbf{t} \in \mathbb{R}^m$（不一定是格子點），找出所有格子點中距離 $\mathbf{t}$ 最近的格子點 $\mathbf{v} \in \mathcal{L}(B)$。&lt;/p>
&lt;p>用數學公式表示，就是尋找使得 $\min_{\mathbf{v} \in \mathcal{L}(B)} \| \mathbf{v} - \mathbf{t} \|$ 成立的格子點 $\mathbf{v}$ 的問題。&lt;/p>
&lt;p>與 SVP 一樣，CVP 在高維度中也是 NP 困難的。從密碼學應用的角度來看，稍後將提到的 LWE 問題，與這個 CVP 的特殊變體（Bounded Distance Decoding: BDD，有界距離解碼）有著密切的關係。&lt;/p>
&lt;h2 id="33-為什麼高維度時會解不出來lll-與-bkz-的極限">3.3 為什麼高維度時會解不出來？（LLL 與 BKZ 的極限）
&lt;/h2>&lt;p>作為解決高維度格子問題的著名演算法，有 LLL 演算法（Lenstra-Lenstra-Lovász algorithm）。LLL 演算法可以在多項式時間內運作，並將格子基底在某種程度上歸約（Reduction）為「好的基底」。然而，LLL 演算法所能找到的最短向量，其長度相對於真正的最短向量有一個呈指數級（$2^{\mathcal{O}(n)}$）增長的近似係數，因此並不足以破解密碼的安全性。&lt;/p>
&lt;p>如果使用對 LLL 進行改良的 BKZ（Block Korkine-Zolotarev）演算法等更強大的基底歸約演算法，就能找到更短的向量，但其計算量會相對於區塊大小（Block size）呈指數級增長。在格子密碼學中，正是透過估算這個 BKZ 演算法的執行時間來決定安全的參數（例如維度 $n$ 的大小等）。在目前 PQC 的標準參數中，維度 $n$ 被設定為 500 到 1000 以上的值，據說即使使用超級電腦或未來的量子電腦，破解所需的時間也會超過宇宙的年齡。&lt;/p>
&lt;h1 id="4-lwe-問題learning-with-errors的數學形式化">4. LWE 問題（Learning With Errors）的數學形式化
&lt;/h1>&lt;p>現代大部分的格子密碼學都基於 2005 年由 Oded Regev 所提出的「LWE 問題（Learning With Errors，容錯學習問題）」。LWE 問題的絕妙之處在於其形式化的簡單性，以及擁有「將最壞情況複雜度歸約為平均情況複雜度」這項強大的數學證明。&lt;/p>
&lt;h2 id="41-無雜訊的線性方程組">4.1 無雜訊的線性方程組
&lt;/h2>&lt;p>為了理解 LWE 問題，首先讓我們先考慮一個沒有雜訊的簡單線性方程組。
假設有一個未知的秘密向量 $\mathbf{s} \in \mathbb{Z}_q^n$（各個分量為 $0$ 到 $q-1$ 的整數）。這裡我們假設 $q$ 是質數。&lt;/p>
&lt;p>隨機選取係數向量 $\mathbf{a}_1, \mathbf{a}_2, \dots \in \mathbb{Z}_q^n$，並計算與秘密向量 $\mathbf{s}$ 的內積（對 $q$ 取模）：
$b_1 = \langle \mathbf{a}_1, \mathbf{s} \rangle \pmod q$
$b_2 = \langle \mathbf{a}_2, \mathbf{s} \rangle \pmod q$
$\vdots$&lt;/p>
&lt;p>只要給定足夠數量（$n$ 個以上）的 $(\mathbf{a}_i, b_i)$ 數對，我們就可以利用線性代數中的「高斯消去法（Gaussian elimination）」，輕鬆地還原出秘密向量 $\mathbf{s}$。這是一個在多項式時間內可以輕易解出的問題。&lt;/p>
&lt;h2 id="42-lwe-問題的定義加入雜訊">4.2 LWE 問題的定義：加入雜訊
&lt;/h2>&lt;p>那麼，如果在這個問題中加入微小的「雜訊（誤差）」，會發生什麼事呢？
這就是 LWE 問題的本質。&lt;/p>
&lt;p>對未知的秘密向量 $\mathbf{s} \in \mathbb{Z}_q^n$，在各個方程式的結果中加入微小的誤差 $e_i \in \mathbb{Z}_q$：
$b_i = \langle \mathbf{a}_i, \mathbf{s} \rangle + e_i \pmod q$&lt;/p>
&lt;p>這裡的 $e_i$ 是一個平均值為 0、標準差相對較小（例如從常態分佈那樣的離散高斯分佈中選取）的微小整數值。
給定的資訊是隨機向量 $\mathbf{a}_i$ 與加上誤差後計算出的 $b_i$ 所構成的數對列表：
$( \mathbf{a}_1, b_1 ), ( \mathbf{a}_2, b_2 ), \dots, ( \mathbf{a}_m, b_m )$&lt;/p>
&lt;p>用矩陣來表示會非常簡潔：
使用隨機矩陣 $A \in \mathbb{Z}_q^{m \times n}$、秘密向量 $\mathbf{s} \in \mathbb{Z}_q^n$、誤差向量 $\mathbf{e} \in \mathbb{Z}_q^m$，可以寫成：
&lt;/p>
$$ \mathbf{b} = A \mathbf{s} + \mathbf{e} \pmod q $$
&lt;p>
我們只會被給予 $A$ 和 $\mathbf{b}$。從中求出 $\mathbf{s}$ 的問題就是「搜尋 LWE 問題（Search LWE problem）」。&lt;/p>
&lt;p>因為加入了誤差 $e_i$，如果試圖使用高斯消去法，在方程式加減的過程中誤差會呈指數級放大，最終將無法推導出正確的答案。乍看之下這只是一個簡單的線性方程組，但僅僅因為加入了這個微小的雜訊，問題的難度就躍升至 NP 困難的層級。&lt;/p>
&lt;h2 id="43-判定-lwe-問題decision-lwe">4.3 判定 LWE 問題（Decision LWE）
&lt;/h2>&lt;p>在密碼理論的證明中頻繁使用的，是搜尋 LWE 問題的變體——「判定 LWE 問題（Decision LWE problem）」。&lt;/p>
&lt;p>判定 LWE 問題是指，給定一個從以下兩種分佈中取得樣本的列表時，判定它來自哪一種分佈的問題：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>LWE 分佈&lt;/strong>：刻意計算出的 $(A, \mathbf{b} = A\mathbf{s} + \mathbf{e} \pmod q)$&lt;/li>
&lt;li>&lt;strong>均勻隨機分佈&lt;/strong>：由完全隨機選取的矩陣 $A$ 與向量 $\mathbf{u}$ 所構成的 $(A, \mathbf{u})$&lt;/li>
&lt;/ol>
&lt;p>令人驚訝的是，只要適當地選擇 LWE 問題的參數，從 LWE 分佈取得的數對，將與完全隨機資料的數對「在計算上不可區分（Computationally Indistinguishable）」。這個性質正是基於 LWE 的密碼能夠生成「與隨機數無法區分的密文」的根據。&lt;/p>
&lt;h2 id="44-從最壞情況複雜度到平均情況複雜度的歸約regev-定理">4.4 從最壞情況複雜度到平均情況複雜度的歸約（Regev 定理）
&lt;/h2>&lt;p>Oded Regev 最大的貢獻，就是將這個 LWE 問題的困難度，在數學上與前述的格子問題（SVP 與 CVP）的困難度連結了起來。&lt;/p>
&lt;p>他運用了量子歸約（Quantum reduction），證明了「如果存在能在平均情況下（對於隨機選取的 $A$ 和 $\mathbf{e}$）在多項式時間內解決 LWE 問題的演算法，那麼就存在能在多項式時間內解決任何格子在最壞情況下（最難的情況）的 Gap-SVP 的量子演算法」。（後來，Peikert 等人也提出了古典歸約的證明）。&lt;/p>
&lt;p>這在密碼理論中是一個夢寐以求的性質。因為它消除了「密碼被破解，可能只是因為我們碰巧選到了弱的密鑰（平均情況中的一小部分）」這種疑慮，並提供了「如果能解決平均情況的 LWE，就能解決格子中所有最難的問題（因此 LWE 絕對是困難的）」這樣強大的保證。&lt;/p>
&lt;div class="mermaid">graph TD
A["最壞情況的格子問題 (Gap-SVP, SIVP)"] -->|量子/古典歸約| B["平均情況的 LWE 問題"]
B -->|密碼學構造| C["基於 LWE 的密碼系統 (PKE, KEM, FHE)"]
style A fill:#ffcccc,stroke:#ff0000,stroke-width:2px,color:#000
style B fill:#ccffcc,stroke:#00aa00,stroke-width:2px,color:#000
style C fill:#ccccff,stroke:#0000ff,stroke-width:2px,color:#000&lt;/div>
&lt;h1 id="5-基於-lwe-的公鑰密碼系統regev-密碼的建構">5. 基於 LWE 的公鑰密碼系統（Regev 密碼）的建構
&lt;/h1>&lt;p>了解了 LWE 問題的困難度之後，我們來看看如何使用它進行加密和解密，也就是 Oded Regev 所提出的基本公鑰密碼系統。這裡將解說對 1 位元訊息 $M \in \{0, 1\}$ 進行加密的最基本機制。&lt;/p>
&lt;h2 id="51-金鑰生成key-generation">5.1 金鑰生成（Key Generation）
&lt;/h2>&lt;ol>
&lt;li>作為系統參數，決定模數質數 $q$、維度 $n$、方程式數量 $m$（$m > n \log q$）。&lt;/li>
&lt;li>隨機選取向量 $\mathbf{s} \in \mathbb{Z}_q^n$ 作為私鑰。&lt;/li>
&lt;li>生成隨機矩陣 $A \in \mathbb{Z}_q^{m \times n}$。&lt;/li>
&lt;li>從離散高斯分佈等誤差分佈中選取微小的誤差向量 $\mathbf{e} \in \mathbb{Z}_q^m$。&lt;/li>
&lt;li>計算向量 $\mathbf{b} = A \mathbf{s} + \mathbf{e} \pmod q$。&lt;/li>
&lt;li>公鑰（Public Key）為 $(A, \mathbf{b})$。&lt;/li>
&lt;li>私鑰（Secret Key）為 $\mathbf{s}$。&lt;/li>
&lt;/ol>
&lt;p>公鑰本身簡直就是「LWE 問題的實例」。由於從公鑰 $(A, \mathbf{b})$ 求出私鑰 $\mathbf{s}$ 等同於解決搜尋 LWE 問題，因此保證了其安全性。&lt;/p>
&lt;h2 id="52-加密encryption">5.2 加密（Encryption）
&lt;/h2>&lt;p>愛麗絲使用鮑伯的公鑰 $(A, \mathbf{b})$，對 1 位元訊息 $M \in \{0, 1\}$ 進行加密。&lt;/p>
&lt;ol>
&lt;li>隨機選取一個二進位向量（各分量為 0 或 1）$\mathbf{r} \in \{0, 1\}^m$。&lt;/li>
&lt;li>計算向量 $\mathbf{u} = A^T \mathbf{r} \pmod q$，作為密文的前半部。（$A^T$ 是 $A$ 的轉置矩陣。也就是說，這是在將 $A$ 的列中與 $\mathbf{r}$ 分量為 1 對應的那些列加總起來）。&lt;/li>
&lt;li>計算純量 $v = \mathbf{b}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor \pmod q$，作為密文的後半部。
（如果訊息 $M$ 為 0，則不加任何東西；如果為 1，則加上正好是 $q$ 一半的值 $\lfloor \frac{q}{2} \rfloor$）。&lt;/li>
&lt;li>密文（Ciphertext）為 $(\mathbf{u}, v)$。&lt;/li>
&lt;/ol>
&lt;p>加密直觀上的意義，是針對公鑰的矩陣 $A$ 和向量 $\mathbf{b}$ 取「隨機子集的和」。由於判定 LWE 問題的困難度，這個密文 $(\mathbf{u}, v)$ 看起來將與完全隨機的向量和均勻隨機數無法區分（語意安全性：Semantic Security）。&lt;/p>
&lt;div class="mermaid">flowchart LR
M["訊息 M 屬於 {0,1}"] --> Enc
PK["公鑰 (A, b)"] --> Enc
r["隨機二進位向量 r"] --> Enc
subgraph Enc ["加密過程"]
direction TB
u_calc["u = A^T * r mod q"]
v_calc["v = b^T * r + M * floor(q/2) mod q"]
end
Enc --> CT["密文 (u, v)"]&lt;/div>
&lt;h2 id="53-解密decryption">5.3 解密（Decryption）
&lt;/h2>&lt;p>鮑伯使用私鑰 $\mathbf{s}$ 來解密密文 $(\mathbf{u}, v)$。&lt;/p>
&lt;ol>
&lt;li>計算以下的值： $D = v - \mathbf{s}^T \mathbf{u} \pmod q$&lt;/li>
&lt;li>如果計算結果接近 $0$，則輸出 $M=0$；如果接近 $\lfloor \frac{q}{2} \rfloor$，則輸出 $M=1$。&lt;/li>
&lt;/ol>
&lt;p>為什麼這樣就能解密呢？讓我們在數學上展開來看看。
請回憶一下 $\mathbf{b} = A \mathbf{s} + \mathbf{e}$。&lt;/p>
$$
\begin{aligned}
v - \mathbf{s}^T \mathbf{u} &amp;= (\mathbf{b}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T (A^T \mathbf{r}) \\
&amp;= ((A \mathbf{s} + \mathbf{e})^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T A^T \mathbf{r} \\
&amp;= (\mathbf{s}^T A^T \mathbf{r} + \mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T A^T \mathbf{r} \\
&amp;= \mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor \pmod q
\end{aligned}
$$
&lt;p>在這裡，公式中的 $\mathbf{s}^T A^T \mathbf{r}$ 被完美地抵消掉了！
剩下的部分是 $\mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor$。&lt;/p>
&lt;p>$\mathbf{e}$ 是分量非常小的雜訊向量，而 $\mathbf{r}$ 是分量為 0 或 1 的二進位向量。因此，它們的內積 $\mathbf{e}^T \mathbf{r}$ 也會（只要參數設定得當）保持在一個相對較小的值。&lt;/p>
&lt;ul>
&lt;li>如果 $M=0$，結果會是 $\mathbf{e}^T \mathbf{r}$，這是一個接近 $0$ 的小數值。&lt;/li>
&lt;li>如果 $M=1$，結果會是 $\mathbf{e}^T \mathbf{r} + \lfloor \frac{q}{2} \rfloor$，這會位於 $q$ 的一半即 $\lfloor \frac{q}{2} \rfloor$ 附近。&lt;/li>
&lt;/ul>
&lt;p>只要參數的設計能讓誤差 $\mathbf{e}^T \mathbf{r}$ 的絕對值收斂在 $\frac{q}{4}$ 以內，鮑伯只需要看計算結果是比較接近 $0$ 還是 $\lfloor \frac{q}{2} \rfloor$，就能正確地判定（解密）訊息 $M$。這就是基於 LWE 的密碼能夠運作的美妙機制。&lt;/p>
&lt;div class="mermaid">flowchart LR
CT["密文 (u, v)"] --> Dec
SK["私鑰 s"] --> Dec
subgraph Dec ["解密過程"]
direction TB
calc["計算 D = v - s^T * u mod q"]
check["檢查 D 是接近 0 還是 q/2"]
end
calc --> check
Dec --> M_out["還原出的訊息 M"]&lt;/div>
&lt;h1 id="6-使用具體數值的-lwe-密碼玩具範例">6. 使用具體數值的 LWE 密碼玩具範例
&lt;/h1>&lt;p>只看一堆數學公式可能很難有真實感，所以我們實際設定極小的數值參數，來追蹤一次從加密到解密的計算過程。
（※在現實的密碼系統中，為了確保安全性，$n$ 會設定在 500 以上，$q$ 則是使用數千以上的值）&lt;/p>
&lt;p>&lt;strong>【參數設定】&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>模數 $q = 17$ （質數。因此值會落在 $0$ 到 $16$ 的範圍內）&lt;/li>
&lt;li>維度 $n = 2$&lt;/li>
&lt;li>方程式數量 $m = 4$&lt;/li>
&lt;li>假設要加密的訊息為 $M = 1$。&lt;/li>
&lt;li>訊息的位移量：$\lfloor \frac{q}{2} \rfloor = \lfloor \frac{17}{2} \rfloor = 8$&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【1. 金鑰生成階段】&lt;/strong>
鮑伯隨機選取私鑰 $\mathbf{s}$、矩陣 $A$ 以及誤差向量 $\mathbf{e}$。
&lt;/p>
$$ \mathbf{s} = \begin{pmatrix} 3 \\ 4 \end{pmatrix} \in \mathbb{Z}_{17}^2 $$
$$ A = \begin{pmatrix} 2 &amp; 15 \\ 1 &amp; 8 \\ 14 &amp; 5 \\ 9 &amp; 10 \end{pmatrix} \in \mathbb{Z}_{17}^{4 \times 2} $$
$$ \mathbf{e} = \begin{pmatrix} 1 \\ -1 \\ 0 \\ 2 \end{pmatrix} \equiv \begin{pmatrix} 1 \\ 16 \\ 0 \\ 2 \end{pmatrix} \pmod{17} $$
&lt;p>接著計算公鑰 $\mathbf{b}$。
&lt;/p>
$$ A \mathbf{s} = \begin{pmatrix} 2 &amp; 15 \\ 1 &amp; 8 \\ 14 &amp; 5 \\ 9 &amp; 10 \end{pmatrix} \begin{pmatrix} 3 \\ 4 \end{pmatrix} = \begin{pmatrix} 2\times 3 + 15\times 4 \\ 1\times 3 + 8\times 4 \\ 14\times 3 + 5\times 4 \\ 9\times 3 + 10\times 4 \end{pmatrix} = \begin{pmatrix} 6 + 60 \\ 3 + 32 \\ 42 + 20 \\ 27 + 40 \end{pmatrix} = \begin{pmatrix} 66 \\ 35 \\ 62 \\ 67 \end{pmatrix} $$
&lt;p>
將其對 17 取模。($66 = 17 \times 3 + 15$ 等)
&lt;/p>
$$ A \mathbf{s} \pmod{17} = \begin{pmatrix} 15 \\ 1 \\ 11 \\ 16 \end{pmatrix} $$
&lt;p>
加上誤差向量 $\mathbf{e}$。
&lt;/p>
$$ \mathbf{b} = A \mathbf{s} + \mathbf{e} = \begin{pmatrix} 15 \\ 1 \\ 11 \\ 16 \end{pmatrix} + \begin{pmatrix} 1 \\ 16 \\ 0 \\ 2 \end{pmatrix} = \begin{pmatrix} 16 \\ 17 \\ 11 \\ 18 \end{pmatrix} \equiv \begin{pmatrix} 16 \\ 0 \\ 11 \\ 1 \end{pmatrix} \pmod{17} $$
&lt;p>公鑰為 $A$ 與 $\mathbf{b} = (16, 0, 11, 1)^T$。&lt;/p>
&lt;p>&lt;strong>【2. 加密階段】&lt;/strong>
愛麗絲加密訊息 $M = 1$。
選取一個隨機向量 $\mathbf{r}$。這裡假設 $\mathbf{r} = (1, 0, 1, 0)^T$。&lt;/p>
&lt;p>計算 $\mathbf{u}$。
&lt;/p>
$$ \mathbf{u} = A^T \mathbf{r} = \begin{pmatrix} 2 &amp; 1 &amp; 14 &amp; 9 \\ 15 &amp; 8 &amp; 5 &amp; 10 \end{pmatrix} \begin{pmatrix} 1 \\ 0 \\ 1 \\ 0 \end{pmatrix} = \begin{pmatrix} 2 \times 1 + 14 \times 1 \\ 15 \times 1 + 5 \times 1 \end{pmatrix} = \begin{pmatrix} 16 \\ 20 \end{pmatrix} \equiv \begin{pmatrix} 16 \\ 3 \end{pmatrix} \pmod{17} $$
&lt;p>計算 $v$。
&lt;/p>
$$ \mathbf{b}^T \mathbf{r} = (16, 0, 11, 1) \begin{pmatrix} 1 \\ 0 \\ 1 \\ 0 \end{pmatrix} = 16 \times 1 + 11 \times 1 = 27 \equiv 10 \pmod{17} $$
&lt;p>
加上對應於訊息 $M=1$ 的值 $\lfloor 17/2 \rfloor = 8$。
&lt;/p>
$$ v = \mathbf{b}^T \mathbf{r} + M \cdot 8 = 10 + 1 \times 8 = 18 \equiv 1 \pmod{17} $$
&lt;p>愛麗絲將密文 $(\mathbf{u}, v) = \left( \begin{pmatrix} 16 \\ 3 \end{pmatrix}, 1 \right)$ 傳送給鮑伯。&lt;/p>
&lt;p>&lt;strong>【3. 解密階段】&lt;/strong>
收到密文的鮑伯，使用私鑰 $\mathbf{s} = (3, 4)^T$ 進行解密。
計算解密處理公式： $D = v - \mathbf{s}^T \mathbf{u} \pmod{17}$。&lt;/p>
$$ \mathbf{s}^T \mathbf{u} = (3, 4) \begin{pmatrix} 16 \\ 3 \end{pmatrix} = 3 \times 16 + 4 \times 3 = 48 + 12 = 60 \equiv 9 \pmod{17} $$
$$ D = v - \mathbf{s}^T \mathbf{u} = 1 - 9 = -8 \pmod{17} $$
&lt;p>在這裡，在模 17 的世界中，$-8$ 等於 $9$（$-8 + 17 = 9$）。
判斷得到的值 $D = 9$ 是比較接近 $0$ 還是 $8$（$\lfloor 17/2 \rfloor$）。
因為 $9$ 明顯比接近 $0$ 更接近 $8$，所以鮑伯正確地還原出了 $M = 1$！&lt;/p>
&lt;p>為什麼會變成 $9$ 呢？讓我們回想一下先前的證明。
誤差部分為 $\mathbf{e}^T \mathbf{r} = (1, -1, 0, 2) (1, 0, 1, 0)^T = 1 \times 1 + 0 \times 1 = 1$。
因此，計算結果會是 $\mathbf{e}^T \mathbf{r} + M \cdot 8 = 1 + 8 = 9$，證實了算出來的值符合理論預期。&lt;/p>
&lt;h1 id="7-邁向實用化的演進ring-lwe-與-module-lwe">7. 邁向實用化的演進：Ring-LWE 與 Module-LWE
&lt;/h1>&lt;p>我們到目前為止所說明的標準 LWE 問題（Standard LWE），雖然擁有非常強大的安全性證明，但在實際應用上卻有一個致命的弱點。那就是「金鑰的容量會變得十分巨大」以及「計算成本過高」。&lt;/p>
&lt;p>在 Standard LWE 中，公鑰包含了一個巨大的矩陣 $A \in \mathbb{Z}_q^{m \times n}$。當參數 $n$ 達到數百至數千時，這個矩陣的容量會達到數百萬位元組（MB）之多，要在網際網路通訊協定（如 TLS）中每次傳送和接收的話，負擔會太重。此外，矩陣與向量的乘法運算會花費 $\mathcal{O}(n^2)$ 的計算量。&lt;/p>
&lt;p>為了解決這個問題而導入的，是將名為多項式環（Polynomial rings）的代數結構結合到格子上的「Ring-LWE（RLWE）」以及「Module-LWE（MLWE）」。&lt;/p>
&lt;h2 id="71-ring-lwe-的直觀">7.1 Ring-LWE 的直觀
&lt;/h2>&lt;p>在 Ring-LWE 中，我們將向量與矩陣替換成多項式環 $\mathcal{R}_q = \mathbb{Z}_q[X]/(X^n + 1)$ 上的元素（多項式）。（這裡的 $n$ 會選擇 2 的次方數）。&lt;/p>
&lt;p>相對於 Standard LWE 的公鑰是矩陣 $A$，Ring-LWE 則是使用單一的多項式 $a(x)$。私鑰 $s(x)$ 與誤差 $e(x)$ 也都會變成多項式。
方程式會變成如下所示：
&lt;/p>
$$ b(x) = a(x) \cdot s(x) + e(x) \pmod q $$
&lt;p>因為這是多項式的乘法，所以可以透過使用類似於快速傅立葉變換（FFT）的「數論轉換（Number Theoretic Transform: NTT）」，將計算量大幅縮減至 $\mathcal{O}(n \log n)$。此外，因為公鑰的容量也從矩陣縮減成了單一多項式，所以資料大小減少到了 $\mathcal{O}(n)$。這在通訊頻寬上帶來了壓倒性的優勢。&lt;/p>
&lt;p>從數學角度來看，Ring-LWE 解決的不再是一般的格子，而是歸約到具有特殊對稱性，被稱為「理想格子（Ideal Lattice）」上的問題。&lt;/p>
&lt;h2 id="72-module-lwe-與-nist-的標準化kyber--ml-kem">7.2 Module-LWE 與 NIST 的標準化（Kyber / ML-KEM）
&lt;/h2>&lt;p>Ring-LWE 雖然效率很高，但卻也令人擔心理想格子特殊的代數結構會不會成為未來攻擊的突破口。因此，擷取 Standard LWE 的保守安全性以及 Ring-LWE 效率的「兩全其美」方案，就是「Module-LWE（MLWE）」。&lt;/p>
&lt;p>在 Module-LWE 中，我們考慮的是以多項式為元素所構成的小型矩陣和向量。也就是說，處理的是環上的模組（Module，加群）。
目前，被 NIST 選定作為 PQC 金鑰交換演算法（KEM）標準的「CRYSTALS-Kyber」（標準化名稱：ML-KEM），正是建構在這個 Module-LWE 問題的困難度之上。&lt;/p>
&lt;h1 id="8-為什麼對量子電腦是安全的">8. 為什麼對量子電腦是安全的？
&lt;/h1>&lt;p>最後，我們來探討一個核心問題：「為什麼格子密碼學被認為即使使用量子電腦也無法破解？」&lt;/p>
&lt;p>量子電腦用來破解 RSA 密碼與橢圓曲線密碼的秀爾演算法，本質上是一個用於解決「隱含子群問題（Hidden Subgroup Problem: HSP）」的演算法。RSA 或 ECC 背後的數學結構（有限阿貝爾群）具有週期性，透過使用名為量子傅立葉變換（QFT）的量子演算法特有操作，可以一次萃取出這個週期（隱含的子群）。&lt;/p>
&lt;p>然而，格子問題卻截然不同。格子雖然也有週期性，但在 SVP 或 CVP 中要求出的是「最短距離」或「消除雜訊」這種幾何學上的非線性性質。即使直接套用像秀爾演算法這種「阿貝爾群上的量子傅立葉變換」，也無法有效率地萃取出對解答格子問題有用的資訊。截至目前為止，尚未發現能在多項式時間內解決 SVP 或 LWE 的量子演算法，學界普遍相信，即使擁有量子電腦的平行計算能力，也只有類似於暴力破解的搜尋方式（透過葛羅夫演算法（Grover&amp;rsquo;s algorithm）達成的平方根加速程度）才是有效的手段。&lt;/p>
&lt;h1 id="9-總結">9. 總結
&lt;/h1>&lt;p>本文中，我們從格子的幾何定義開始，詳細地解說了格子密碼學的數學直觀，包括 LWE 問題的形式化，一直到公鑰密碼系統的建構。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>格子（Lattice）&lt;/strong> 是一個由基底向量以整數係數進行線性組合所表示的離散空間，在高維度下，要找到接近正交的「好基底」（SVP）將會變得困難。&lt;/li>
&lt;li>&lt;strong>LWE 問題（Learning With Errors）&lt;/strong> 是一個求解帶有雜訊的線性方程組的問題，因為這與格子在最壞情況下問題的困難度息息相關，所以能提供強大的安全性基礎。&lt;/li>
&lt;li>透過利用 LWE 問題，藉由刻意加入或消除雜訊的精妙機制，實現了加密與解密（&lt;strong>Regev 密碼&lt;/strong>）。&lt;/li>
&lt;li>在現實的協定中，為了提升通訊效率和計算速度，採用了使用多項式環的 &lt;strong>Ring-LWE&lt;/strong> 與 &lt;strong>Module-LWE&lt;/strong>，並成為了 NIST 標準 &lt;strong>ML-KEM&lt;/strong> 的基礎。&lt;/li>
&lt;/ol>
&lt;p>在量子電腦帶來前所未有的計算典範轉移之際，誕生於古典線性代數與數論深淵之中的「格子密碼學」，將肩負起未來網際網路安全基礎的重任，這是一件非常浪漫的事情。格子密碼學基礎的數學絕非過於艱澀難懂，只要具備線性代數與機率的基礎知識，就能充分理解其優美的結構。希望本文能幫助您理解作為 PQC 核心的格子密碼學。&lt;/p></description></item><item><title>零知識證明（ZKP）的機制與最新的Web3及安全應用</title><link>http://kenji.blog/zh-tw/p/zero-knowledge-proofs-zkp-web3-security/</link><pubDate>Fri, 11 Sep 2026 19:00:00 +0900</pubDate><guid>http://kenji.blog/zh-tw/p/zero-knowledge-proofs-zkp-web3-security/</guid><description>&lt;img src="http://kenji.blog/p/zero-knowledge-proofs-zkp-web3-security/img/eyecatch.jpg" alt="Featured image of post 零知識證明（ZKP）的機制與最新的Web3及安全應用" />&lt;h2 id="前言">前言
&lt;/h2>&lt;p>在現代數位社會中，資料隱私與擴展性（Scalability）已經成為最重要的兩個課題。隨著個人資料外洩與不當使用的風險增加，「在不向對方透露自己資訊的情況下，證明自己擁有該資訊」的技術需求變得越來越強烈。實現這一點的就是&lt;strong>零知識證明（Zero-Knowledge Proof: ZKP）&lt;/strong>。&lt;/p>
&lt;p>零知識證明是1980年代由Shafi Goldwasser、Silvio Micali與Charles Rackoff首次提出的密碼學概念，但長久以來僅停留在理論研究階段。然而，隨著區塊鏈技術與Web3的崛起，情況發生了巨大變化。作為能同時解決以太坊等公有鏈所面臨的擴展性問題（處理能力的極限）與隱私問題（所有交易皆被公開）的「魔法棒」，ZKP一躍成為眾所矚目的焦點。&lt;/p>
&lt;p>本文將從零知識證明的基本概念出發，深入探討目前主流的&lt;strong>zk-SNARKs&lt;/strong>與&lt;strong>zk-STARKs&lt;/strong>深奧的數學與密碼學機制，並涵蓋ZK-Rollups與去中心化身份（DID）等最新的Web3與安全應用案例，為您進行極為詳細且具技術深度的解說。&lt;/p>
&lt;hr>
&lt;h2 id="什麼是零知識證明zkp">什麼是零知識證明（ZKP）？
&lt;/h2>&lt;p>零知識證明（ZKP）是指在證明者（Prover）向驗證者（Verifier）證明某個命題為真時，除了「該命題為真」之外不傳遞任何其他資訊的協定。&lt;/p>
&lt;h3 id="zkp必須滿足的三個條件">ZKP必須滿足的三個條件
&lt;/h3>&lt;p>要成立為ZKP，必須嚴格滿足以下三個特性：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>完整性（Completeness）&lt;/strong>
如果命題為真，且證明者與驗證者雙方都正確遵守協定，那麼驗證者必須以壓倒性的機率接受（Accept）該證明。&lt;/li>
&lt;li>&lt;strong>健全性（Soundness）&lt;/strong>
如果命題為假，無論證明者的運算能力多強、多麼心懷不軌，都無法欺騙驗證者使其接受證明（除了可以忽略的極小機率外）。&lt;/li>
&lt;li>&lt;strong>零知識性（Zero-Knowledge）&lt;/strong>
如果命題為真，驗證者除了「命題為真」這個事實之外，無法從證明過程中獲得任何其他資訊。從驗證者的角度來看，這透過能夠模擬證明過程（存在模擬器）的數學定義來證明。&lt;/li>
&lt;/ol>
&lt;h3 id="互動式證明與非互動式證明">互動式證明與非互動式證明
&lt;/h3>&lt;p>ZKP分為兩種：證明者與驗證者需要進行多次通訊的&lt;strong>互動式（Interactive）證明&lt;/strong>，以及證明者只需發送一次證明資料即可完成的&lt;strong>非互動式（Non-Interactive）證明&lt;/strong>。&lt;/p>
&lt;h4 id="互動式證明interactive-zkp">互動式證明（Interactive ZKP）
&lt;/h4>&lt;p>早期的ZKP被設計為互動式協定。著名的「阿里巴巴山洞」比喻就屬於此類。一般的協定流程如下：&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Prover as "Prover (證明者)"
participant Verifier as "Verifier (驗證者)"
Note over Prover, Verifier: "互動式證明協定的基本流程"
Prover->>Verifier: "1. 傳送承諾 (Commitment)"
Verifier->>Prover: "2. 傳送隨機挑戰 (Challenge)"
Prover->>Verifier: "3. 計算並傳送回應 (Response)"
Note over Verifier: "驗證回應 (Verification)"
Verifier-->>Prover: "4. 接受或拒絕 (Accept / Reject)"
Note over Prover, Verifier: "※為提高準確度，此過程會重複數十次"&lt;/div>
&lt;p>這種方法雖然強大，但要求驗證者必須在線，因此不便於應用在區塊鏈這種非同步的分散式系統中。在區塊鏈上，任何人必須隨時都能驗證過去的證明。&lt;/p>
&lt;h4 id="菲亞特-沙米爾轉換fiat-shamir-heuristic與非互動化">菲亞特-沙米爾轉換（Fiat-Shamir Heuristic）與非互動化
&lt;/h4>&lt;p>將互動式證明轉換為非互動式證明（Non-Interactive Zero-Knowledge Proof: NIZK）的劃時代方法，就是&lt;strong>菲亞特-沙米爾轉換（Fiat-Shamir Heuristic）&lt;/strong>。&lt;/p>
&lt;p>證明者不再依賴驗證者傳送的「隨機挑戰」，而是利用自己的承諾與公開資訊的雜湊值，自行生成「偽隨機挑戰」。只要假設密碼學雜湊函數（例如SHA-256或Keccak等）能作為隨機預言機（Random Oracle）發揮作用，證明者就無法事前預測或操作挑戰，從而在維持與互動式證明同等安全性的情況下，僅透過一次訊息傳送就能完成證明。&lt;/p>
&lt;hr>
&lt;h2 id="zk-snarks-的技術細節">zk-SNARKs 的技術細節
&lt;/h2>&lt;p>目前，ZKP中最廣泛使用的是&lt;strong>zk-SNARKs&lt;/strong>（Zero-Knowledge Succinct Non-Interactive Argument of Knowledge）。顧名思義，它具備零知識性（zk），證明大小極小且驗證高速（Succinct，簡潔），並且是非互動式（Non-Interactive）的知識論證（Argument of Knowledge）。&lt;/p>
&lt;p>zk-SNARKs的基礎是進階的代數幾何與密碼理論。它將程式的執行與計算轉換為特定多項式方程式的驗證。&lt;/p>
&lt;h3 id="1-轉換為算術電路與r1csrank-1-constraint-system">1. 轉換為算術電路與R1CS（Rank-1 Constraint System）
&lt;/h3>&lt;p>首先，將想要證明的任意計算（演算法或智慧合約的邏輯）轉換為由加法閘與乘法閘組成的&lt;strong>算術電路（Arithmetic Circuit）&lt;/strong>。&lt;/p>
&lt;p>接著，將這個算術電路轉換為稱為**R1CS（Rank-1 Constraint System）**的矩陣方程式集合。R1CS是針對變數向量 $x$ ，尋找滿足以下約束條件的矩陣 $A, B, C$ 的問題。&lt;/p>
$$ (A \cdot x) \circ (B \cdot x) = C \cdot x $$
&lt;p>其中，$\circ$ 表示哈達瑪積（Hadamard product，逐項相乘）。這個約束條件保證了電路中的所有邏輯閘（尤其是乘法閘）都被正確計算。&lt;/p>
&lt;h3 id="2-轉換為qapquadratic-arithmetic-program">2. 轉換為QAP（Quadratic Arithmetic Program）
&lt;/h3>&lt;p>由於R1CS的矩陣約束數量龐大，逐一驗證非常缺乏效率。因此，我們利用拉格朗日插值法，將這些約束壓縮成單一的多項式方程式。這就是&lt;strong>QAP（Quadratic Arithmetic Program）&lt;/strong>。&lt;/p>
&lt;p>透過轉換為QAP，需要證明的問題便歸結為：「特定多項式 $P(x)$ 是否能被另一個已知的多項式 $Z(x)$ 整除？」的問題。&lt;/p>
$$ P(x) = L(x) \cdot R(x) - O(x) $$
&lt;p>其中，$L(x), R(x), O(x)$ 分別是對應矩陣 $A, B, C$ 各行的多項式組合。如果證明者知道正確的解（Witness），在 $P(x)$ 的各個根（評估點）上的值都會是0，因此 $P(x)$ 會將目標多項式 $Z(x)$ 作為因式。也就是說，存在某個多項式 $H(x)$ 使得以下等式成立：&lt;/p>
$$ P(x) = H(x) \cdot Z(x) $$
&lt;p>驗證者只需在某個隨機的秘密點 $s$ 上，檢查這個方程式 $P(s) = H(s) \cdot Z(s)$ 是否成立，就能瞬間驗證整個計算是否正確進行。這就是「Succinct（簡潔性）」的秘密。&lt;/p>
&lt;h3 id="3-橢圓曲線密碼學與對配bilinear-pairings">3. 橢圓曲線密碼學與對配（Bilinear Pairings）
&lt;/h3>&lt;p>然而，如果驗證者知道秘密點 $s$，證明者就能偽造假的多項式來滿足方程式（導致健全性崩潰）。因此，必須在不讓任何人知道 $s$ 的情況下，保持加密狀態（利用同態加密）來進行計算。&lt;/p>
&lt;p>實現這一點的是&lt;strong>橢圓曲線對配（Bilinear Pairings）&lt;/strong>。
對配 $e$ 是一個特殊的函數，它可以從兩個加密的值中，計算出相當於它們乘積加密值的值。&lt;/p>
$$ e(g_1^a, g_2^b) = e(g_1, g_2)^{ab} $$
&lt;p>證明者即使不知道 $s$ 本身，也能利用 $s$ 的次方的加密值（這稱為CRS: Common Reference String）來計算多項式 $P(s)$ 與 $H(s)$ 的加密值。驗證者則使用對配函數，在維持加密值的狀態下驗證 $P(s) = H(s) \cdot Z(s)$ 的關係是否成立。&lt;/p>
&lt;h3 id="4-信任設定trusted-setup">4. 信任設定（Trusted Setup）
&lt;/h3>&lt;p>zk-SNARKs（特別是早期的Groth16等）最大的弱點在於，它需要生成秘密點 $s$ 的過程，即所謂的&lt;strong>信任設定（Trusted Setup）&lt;/strong>。如果 $s$ 的生成者保留了該值而沒有將其銷毀，就能夠生成任意的假證明（Toxic Waste 問題）。&lt;/p>
&lt;p>為防止這種情況，會使用多方計算（MPC）進行稱為「Ceremony（儀式）」的程序。只要有多名參與者合作提供隨機性，且至少有一名參與者誠實地銷毀了自己的隨機值，就能保持整個系統的安全性。然而，為了消除這種依賴關係，長年以來相關研究仍不斷在進行。&lt;/p>
&lt;hr>
&lt;h2 id="zk-starks-的技術細節">zk-STARKs 的技術細節
&lt;/h2>&lt;p>作為對依賴信任設定以及量子電腦破解橢圓曲線密碼學風險的回應，&lt;strong>zk-STARKs&lt;/strong>（Zero-Knowledge Scalable Transparent Argument of Knowledge）應運而生。&lt;/p>
&lt;p>由Eli Ben-Sasson等人開發的STARKs，正如其名「Transparent（透明性）」，完全不需要信任設定；同時也如同其名「Scalable（可擴展性）」，即使計算量增加，也能有效地保持較小的證明大小與較短的驗證時間。&lt;/p>
&lt;h3 id="1-多項式承諾與fri協定">1. 多項式承諾與FRI協定
&lt;/h3>&lt;p>zk-STARKs不依賴橢圓曲線密碼學，而是將安全性基礎&lt;strong>僅建立在雜湊函數上&lt;/strong>。因此，它具備抗量子計算機密碼學（Post-Quantum Cryptography）的特性。&lt;/p>
&lt;p>計算的驗證會在轉換為被稱為AIR（Algebraic Intermediate Representation）的格式後，利用一維或多維多項式的性質來進行。STARKs的核心在於**FRI（Fast Reed-Solomon Interactive Oracle Proof of Proximity）**協定。&lt;/p>
&lt;p>FRI協定是一種用於驗證「某個函數是否足夠接近特定次數的多項式（Proximity）」的技術。證明者將多項式的值作為默克爾樹（Merkle Tree）的葉節點進行承諾（多項式承諾）。&lt;/p>
&lt;div class="mermaid">graph TD
Root["Merkle Root (承諾)"] --> Node0["Node 0"]
Root --> Node1["Node 1"]
Node0 --> Leaf0["P(x_0)"]
Node0 --> Leaf1["P(x_1)"]
Node1 --> Leaf2["P(x_2)"]
Node1 --> Leaf3["P(x_3)"]&lt;/div>
&lt;p>驗證者要求揭露隨機的幾個點，並使用默克爾證明（Merkle Proof）來確認它們包含在承諾中。透過遞迴地重複此過程，可以以壓倒性的機率保證原始多項式的次數確實很低。&lt;/p>
&lt;h3 id="zk-snarks-與-zk-starks-的比較">zk-SNARKs 與 zk-STARKs 的比較
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">特徵&lt;/th>
&lt;th style="text-align:left">zk-SNARKs&lt;/th>
&lt;th style="text-align:left">zk-STARKs&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>密碼學假設&lt;/strong>&lt;/td>
&lt;td style="text-align:left">橢圓曲線、對配&lt;/td>
&lt;td style="text-align:left">抗碰撞雜湊函數&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>信任設定&lt;/strong>&lt;/td>
&lt;td style="text-align:left">需要（Plonk等為通用型）&lt;/td>
&lt;td style="text-align:left">不需要（Transparent）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>抗量子性&lt;/strong>&lt;/td>
&lt;td style="text-align:left">無&lt;/td>
&lt;td style="text-align:left">有&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>證明大小&lt;/strong>&lt;/td>
&lt;td style="text-align:left">極小（~200 Byte）&lt;/td>
&lt;td style="text-align:left">稍大（數十 KB）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>證明生成計算成本&lt;/strong>&lt;/td>
&lt;td style="text-align:left">高&lt;/td>
&lt;td style="text-align:left">較SNARKs相對較低&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>驗證成本（Gas費）&lt;/strong>&lt;/td>
&lt;td style="text-align:left">極低（固定）&lt;/td>
&lt;td style="text-align:left">低（呈對數增長）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>近年來，如Plonk與Halo2等「不需要信任設定，或只需設定一次的SNARKs」問世，SNARKs與STARKs之間的界線逐漸變得模糊，但基本數學方法的差異依然重要。&lt;/p>
&lt;hr>
&lt;h2 id="零知識證明在web3與安全領域的最新應用">零知識證明在Web3與安全領域的最新應用
&lt;/h2>&lt;p>從理論走向實踐的ZKP，目前正在Web3與網路安全的最前線掀起革命。&lt;/p>
&lt;h3 id="1-透過-zk-rollups-實現以太坊的終極擴容">1. 透過 ZK-Rollups 實現以太坊的終極擴容
&lt;/h3>&lt;p>像以太坊這類L1（Layer 1）區塊鏈，為了重視去中心化與安全性，在擴展性上面臨了極大的限制（不可能三角）。解決這個問題的L2（Layer 2）終極解決方案就是&lt;strong>ZK-Rollups&lt;/strong>。&lt;/p>
&lt;p>ZK-Rollup在鏈下（L2）執行並處理數以千計的交易，然後生成「一個ZKP（Validity Proof，有效性證明）」來顯示這些交易都已正確執行。L1鏈上的智慧合約只需驗證這個證明即可。&lt;/p>
&lt;div class="mermaid">flowchart LR
Users["Users (發送交易)"] --> Sequencer["Sequencer (收集與執行交易)"]
Sequencer --> Prover["Prover (生成 ZKP)"]
Sequencer --> L1Contract["L1 Smart Contract (發布交易資料)"]
Prover --> L1Contract["提交 ZKP (證明)"]
L1Contract --> Verify["驗證與狀態更新"]&lt;/div>
&lt;p>與Optimistic Rollups（如Arbitrum或Optimism等）不同，ZK-Rollups最大的優勢在於不需要為了欺詐證明（Fraud Proof）而等待挑戰期（通常為7天）。由於密碼學保證了其正確性，因此在證明被驗證的瞬間，往L1的資金提取（Finality，最終確定性）就完成了。目前，zkSync、Starknet、Scroll、Polygon zkEVM等專案正展開激烈的開發競爭，與EVM（以太坊虛擬機）相容的&lt;strong>zkEVM&lt;/strong>的實現正促使生態系快速成長。&lt;/p>
&lt;h3 id="2-隱私保護身份zkp-for-identity">2. 隱私保護身份（ZKP for Identity）
&lt;/h3>&lt;p>數位世界中個人認證的方式也將因為ZKP而徹底改變。
例如，面對「你年滿18歲了嗎？」這個問題，在傳統系統中我們必須出示駕照或護照，甚至將姓名與地址等不必要的個人資訊一併交給對方。&lt;/p>
&lt;p>利用ZKP，我們可以基於公家機關發行的數位憑證（Verifiable Credential），在數學上&lt;strong>只證明「根據我的出生年月日計算，在今天的日期我已年滿18歲」這個事實&lt;/strong>。驗證者只需驗證憑證的簽章與ZKP即可，無法得知使用者的出生年月日或身分。&lt;/p>
&lt;p>像Worldcoin這樣的Proof of Personhood（人格證明）專案，也不會直接儲存或分享虹膜資料，而是引入ZKP來僅僅證明「這是一個獨特的人類」。&lt;/p>
&lt;h3 id="3-機密智慧合約與企業應用">3. 機密智慧合約與企業應用
&lt;/h3>&lt;p>公有鏈「所有資料皆被公開」的特性，是企業在區塊鏈上處理機密交易或供應鏈資訊時的巨大障礙。&lt;/p>
&lt;p>如果使用ZKP技術（例如Aleo或Aztec等專注於隱私的網路），就能在將交易的輸入值、輸出值，甚至執行的智慧合約邏輯本身保持加密的狀態下，僅將狀態更新的正當性記錄在公有鏈上。如此一來，就能在享有公有鏈高度安全性的同時，防止DeFi（去中心化金融）中的搶先交易（Front-running / MEV），並在企業間建立機密聯盟網路。&lt;/p>
&lt;hr>
&lt;h2 id="zkp的未來挑戰與展望">ZKP的未來挑戰與展望
&lt;/h2>&lt;p>ZKP無疑是次世代的基礎技術，但也仍有一些挑戰需要解決。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>證明生成的計算成本與硬體加速&lt;/strong>
生成ZKP需要龐大的多項式運算、FFT（快速傅立葉轉換）與MSM（多純量乘法）。目前，為了加速這種證明生成，專用硬體（FPGA或ASIC）的開發，也就是所謂的&lt;strong>ZKP挖礦&lt;/strong>（Prover Network）研究正在快速進展。&lt;/li>
&lt;li>&lt;strong>標準化與開發者體驗（DX）的提升&lt;/strong>
用於撰寫ZKP電路的專用語法（如Circom、Cairo、Noir、Leo等）百花齊放。統一這些標準，以及能從現有的Rust或C++自動生成ZKP電路的編譯器發展成熟度，將成為一般軟體工程師導入ZKP的關鍵。&lt;/li>
&lt;/ol>
&lt;h2 id="結語">結語
&lt;/h2>&lt;p>零知識證明（ZKP）已經從單純「提高加密貨幣匿名性的技術」，進化為「重新定義整個網際網路信任（Trust）的通用技術」。在數學公式與密碼理論深處計算出的小小證明，將無限擴展區塊鏈的擴展性，並成為堅固保護我們隱私的盾牌。&lt;/p>
&lt;p>為了實現Web3的真正大規模採用（Mass Adoption），並建立安全且私密的次世代網際網路，零知識證明將持續扮演最重要的拼圖。ZKP技術未來的發展絕對不容錯過。&lt;/p>
&lt;hr>
&lt;p>&lt;em>參考文獻與相關連結&lt;/em>&lt;/p>
&lt;ul>
&lt;li>Groth, J. (2016). &amp;ldquo;On the Size of Pairing-based Non-interactive Arguments&amp;rdquo;&lt;/li>
&lt;li>Ben-Sasson, E., et al. (2018). &amp;ldquo;Scalable, transparent, and post-quantum secure computational integrity&amp;rdquo;&lt;/li>
&lt;li>Vitalik Buterin&amp;rsquo;s blog on zk-SNARKs and zk-STARKs&lt;/li>
&lt;/ul></description></item><item><title>完全同態加密（FHE）是什麼？解析次世代資安的核心</title><link>http://kenji.blog/zh-tw/p/fully-homomorphic-encryption-fhe-explained/</link><pubDate>Fri, 11 Sep 2026 11:00:00 +0900</pubDate><guid>http://kenji.blog/zh-tw/p/fully-homomorphic-encryption-fhe-explained/</guid><description>&lt;img src="http://kenji.blog/p/fully-homomorphic-encryption-fhe-explained/img/eyecatch.jpg" alt="Featured image of post 完全同態加密（FHE）是什麼？解析次世代資安的核心" />&lt;p>隨著雲端運算和 AI 技術逐漸成為社會的基礎，『資料隱私』與『資料活用』之間的權衡，已成為最重要的課題之一。越來越多的需求希望能在雲端上讓 AI 分析醫療數據、金融資訊、個人生物特徵等高機密性資料，但由於資安上的疑慮，許多企業對於將資料外傳感到猶豫。&lt;/p>
&lt;p>傳統的加密技術（如 AES 或 RSA 等）非常擅長保護儲存中的資料（Data at Rest）以及在網路上傳輸的資料（Data in Transit）。然而，當伺服器端要對資料進行搜尋或機器學習等&lt;strong>處理（計算）時（Data in Use），就必須先進行解密，將其還原為明文&lt;/strong>。如果在解密的這段期間伺服器遭到駭客攻擊，或是內部的惡意管理者偷窺資料，將直接導致資訊外洩。&lt;/p>
&lt;p>為了克服這種「處理時必須解密」的根本性弱點，有一項夢幻技術應運而生，那就是&lt;strong>完全同態加密（Fully Homomorphic Encryption: FHE）&lt;/strong>。只要使用 FHE，就能在維持資料加密的狀態下進行運算處理，而完全不需要解密，並且僅將計算結果的密文回傳給客戶端。&lt;/p>
&lt;p>本文將從 FHE 的概念與歷史、Craig Gentry 帶來的突破性進展、數學基礎（如 Ring-LWE 等）、其面臨的最大課題「雜訊」與解決方案（自舉，Bootstrapping），一路探討到最新的實作函式庫，為您深入且徹底地解析這項次世代資安的核心技術：FHE。&lt;/p>
&lt;hr>
&lt;h2 id="1-什麼是同態加密基本概念">1. 什麼是同態加密？基本概念
&lt;/h2>&lt;p>「同態（Homomorphic）」是代數學的術語，指在具有某種結構的集合之間，能夠在保持運算結構的情況下進行映射的性質。在密碼學理論中的「同態性」，則是指&lt;strong>在明文空間中的運算，可以對應到密文空間中的運算&lt;/strong>。&lt;/p>
&lt;p>用簡單的數學式來表示，假設對明文 $m_1$ 與 $m_2$ 的加密函數為 $E(\cdot)$，解密函數為 $D(\cdot)$。當明文上的運算（如加法或乘法等）為 $\circ$，而密文上的運算為 $\diamond$ 時，會成立以下關係：&lt;/p>
$$ D(E(m_1) \diamond E(m_2)) = m_1 \circ m_2 $$
&lt;p>也就是說，對密文 $E(m_1)$ 與 $E(m_2)$ 施以某種運算 $\diamond$ 後，將其結果解密，會與原本明文之間進行運算 $\circ$ 的結果完全一致。&lt;/p>
&lt;h3 id="雲端運算中的資料流程">雲端運算中的資料流程
&lt;/h3>&lt;p>使用 FHE 的雲端運算架構與傳統架構截然不同。下圖展示了運用 FHE 的安全資料處理流程。&lt;/p>
&lt;div class="mermaid">graph TD
A["客戶端（持有私鑰）"] -->|1. 將明文 x 加密: E(x)| B["雲端伺服器（僅有加密資料）"]
B -->|2. 在密文狀態下套用函數 f: E(f(x))| B
B -->|3. 計算結果的密文 E(y)| A
A -->|4. 使用私鑰解密: y = f(x)| A
style A fill:#d4edda,stroke:#28a745
style B fill:#f8d7da,stroke:#dc3545&lt;/div>
&lt;p>伺服器雖然接收了加密過後的資料 $E(x)$，但因為沒有私鑰，所以絕對無法知道資料的內容。然而，藉由利用 FHE 的性質，可以直接對密文套用函數 $f$（例如機器學習的推論模型），從而產生 $E(f(x))$。客戶端收到此結果後，使用自己的私鑰進行解密，即可獲得最終目標的結果 $y = f(x)$。&lt;/p>
&lt;hr>
&lt;h2 id="2-同態加密的進化歷史phe-she-fhe">2. 同態加密的進化歷史：PHE, SHE, FHE
&lt;/h2>&lt;p>同態加密並非一開始就達到了現在的「完全」型態。根據所能實現的運算種類與次數，它大致可分為三個階段。&lt;/p>
&lt;h3 id="partially-homomorphic-encryption-phe-部分同態加密">Partially Homomorphic Encryption (PHE: 部分同態加密)
&lt;/h3>&lt;p>PHE 是一種只能無限制地執行加法或乘法中&lt;strong>其中一種&lt;/strong>的加密方式。事實上，具備這種性質的加密技術自古便已存在。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>RSA 加密（對乘法的同態性）&lt;/strong>
RSA 加密在無意中具備了對乘法的同態性。若明文為 $m_1, m_2$，公鑰為 $(e, N)$：
$$ E(m_1) = m_1^e \pmod N $$
$$ E(m_2) = m_2^e \pmod N $$
將它們相乘可得：
$$ E(m_1) \times E(m_2) = (m_1 \cdot m_2)^e \pmod N = E(m_1 \times m_2) $$
像這樣，密文之間的相乘就對應到明文的相乘。&lt;/li>
&lt;li>&lt;strong>Paillier 加密（對加法的同態性）&lt;/strong>
於 1999 年發明的 Paillier 加密具備了對加法的同態性。它已被實際應用於電子投票（對加密的選票進行計票，最後只解密總結果）等領域。&lt;/li>
&lt;/ul>
&lt;h3 id="somewhat-homomorphic-encryption-she-淺度同態加密--具界同態加密">Somewhat Homomorphic Encryption (SHE: 淺度同態加密 / 具界同態加密)
&lt;/h3>&lt;p>雖然可以同時執行加法與乘法，但對於能運算的&lt;strong>次數（電路深度）有其限制&lt;/strong>的加密方式。由於後述的「雜訊」累積問題，只要乘法超過一定的次數，就會變得無法解密。2005 年的 BGN (Boneh-Goh-Nissim) 加密等皆屬此類，但要用來進行實用的複雜計算（如深度學習等）仍有極限。&lt;/p>
&lt;h3 id="fully-homomorphic-encryption-fhe-完全同態加密">Fully Homomorphic Encryption (FHE: 完全同態加密)
&lt;/h3>&lt;p>這是一種能夠&lt;strong>無限制次數&lt;/strong>地同時執行加法與乘法的加密方式。就像資訊理論中的圖靈完備性一樣，只要能無限次組合加法（相當於 XOR）與乘法（相當於 AND），就意味著原則上任何可計算的函數或演算法，都能在加密狀態下執行。&lt;/p>
&lt;p>FHE 長期以來被譽為「密碼學界的聖杯」，甚至曾被認為是不可能實現的。然而在 2009 年，當時還在史丹佛大學攻讀博士的 &lt;strong>Craig Gentry&lt;/strong>，提出了首個基於理想格（Ideal Lattices）的 FHE 方案，震驚了全世界。&lt;/p>
&lt;hr>
&lt;h2 id="3-fhe-的數學基礎lwe-問題與-ring-lwe">3. FHE 的數學基礎：LWE 問題與 Ring-LWE
&lt;/h2>&lt;p>目前主流的 FHE 方案中，有許多都是建構在「格密碼學（Lattice-based Cryptography）」（亦被稱為後量子密碼學，Post-Quantum Cryptography）中的一項數學難題上，也就是 &lt;strong>LWE (Learning With Errors) 問題&lt;/strong>。&lt;/p>
&lt;h3 id="lwe-問題的直觀理解">LWE 問題的直觀理解
&lt;/h3>&lt;p>只要使用高斯消去法等方法，解聯立一次方程式非常簡單。&lt;/p>
$$ \begin{cases} 3s_1 + 4s_2 + 2s_3 \equiv 12 \pmod{17} \\ 1s_1 + 9s_2 + 5s_3 \equiv 8 \pmod{17} \\ \vdots \end{cases} $$
&lt;p>然而，如果在這個方程式的結果中，加入極微小的「隨機誤差（雜訊）」$e$ 會發生什麼事呢？&lt;/p>
$$ \begin{cases} 3s_1 + 4s_2 + 2s_3 + e_1 \equiv 13 \pmod{17} \\ 1s_1 + 9s_2 + 5s_3 + e_2 \equiv 7 \pmod{17} \\ \vdots \end{cases} $$
&lt;p>只要加上這個誤差 $e$，要找出未知變數向量 $\vec{s}$ 的問題，就會變成即使使用現今的超級電腦或量子電腦都難以破解的 NP 困難問題。這就是 LWE 問題。&lt;/p>
&lt;h3 id="ring-lwe-問題rlwe">Ring-LWE 問題（RLWE）
&lt;/h3>&lt;p>標準的 LWE 問題因為包含矩陣運算，所以密鑰的容量非常大（甚至可能達到 Gigabyte 等級），並且有計算效率低落的問題。為了解決這個問題，於是導入了使用多項式環上運算的 &lt;strong>Ring-LWE (RLWE) 問題&lt;/strong>。&lt;/p>
&lt;p>在 RLWE 中，元素屬於多項式環 $R_q = \mathbb{Z}_q[x] / (x^N + 1)$（其中 $N$ 為 2 的冪次方，$q$ 為做為模數的質數）。
若將私鑰設為多項式 $s(x)$，並有隨機多項式 $a(x)$、微小的雜訊多項式 $e(x)$，則公鑰將會是以下的數對：&lt;/p>
$$ (a(x), b(x)) \quad \text{where} \quad b(x) = -a(x) \cdot s(x) + e(x) \pmod q $$
&lt;p>加密時，會利用這個多項式的性質來將明文 $m(x)$ 進行編碼，進而產生密文。&lt;/p>
&lt;hr>
&lt;h2 id="4-最大的障礙雜訊與-gentry-的自舉bootstrapping">4. 最大的障礙「雜訊」與 Gentry 的自舉（Bootstrapping）
&lt;/h2>&lt;p>在理解 FHE 時，最重要的概念就是**「雜訊的管理」**。&lt;/p>
&lt;p>在基於 LWE/RLWE 的加密演算法中，為了確保安全性，會刻意加入微小的「雜訊（誤差）」。
將明文 $m$ 的密文 $c$ 解密的過程，粗略來說可以用以下數學式表示。&lt;/p>
$$ D(c) = (c \cdot s) \pmod q = m + \text{noise} $$
&lt;p>解密時，可以透過捨入（rounding）等處理來消除這個 &lt;code>noise&lt;/code>，從而獲得正確的明文 $m$。然而，當我們在密文之間進行同態運算（特別是乘法）時，這個雜訊將會急遽放大。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>同態加法&lt;/strong>: 雜訊是以相加的方式增加（$e_1 + e_2$）。這種增長相對來說比較平緩。&lt;/li>
&lt;li>&lt;strong>用同態加法來表示的同態性數學式&lt;/strong>:
$$ E(m_1) \oplus E(m_2) = E(m_1 + m_2) $$&lt;/li>
&lt;li>&lt;strong>同態乘法&lt;/strong>: 雜訊會呈乘法級數爆發增長（因為包含了 $e_1 \times e_2$ 等）。只要進行幾次乘法，雜訊就會超過臨界值 $q/2$，導致無法進行正確的捨入處理而解密失敗。&lt;/li>
&lt;li>&lt;strong>用同態乘法來表示的同態性數學式&lt;/strong>:
$$ E(m_1) \otimes E(m_2) = E(m_1 \times m_2) $$&lt;/li>
&lt;/ul>
&lt;p>這就是為何長久以來 FHE 都無法實現，只能停留在 SHE（限制次數）的原因。&lt;/p>
&lt;h3 id="自舉bootstrapping的魔法">自舉（Bootstrapping）的魔法
&lt;/h3>&lt;p>Craig Gentry 天才般的貢獻，就是發明了被稱為**「自舉（Bootstrapping）」**的雜訊消除手法。這是密碼學界的一次典範轉移。&lt;/p>
&lt;p>直觀來說，這個操作就是「在密文因為充滿雜訊而損壞之前，在保持加密的狀態下進行『解密』以清理雜訊，然後重新放入新的密文之中」。&lt;/p>
&lt;ol>
&lt;li>假設有一個雜訊變得很大的密文 $C_{noisy}$。&lt;/li>
&lt;li>客戶端會將私鑰 $sk$ 事先「用公鑰加密」成 $E_{pk}(sk)$（這稱為 Bootstrapping key，自舉密鑰），並交給伺服器。&lt;/li>
&lt;li>伺服器針對 $C_{noisy}$，以同態的方式執行&lt;strong>解密電路（Decryption Circuit）&lt;/strong>。&lt;/li>
&lt;li>具體來說，就是針對 $E_{pk}(C_{noisy})$ 使用 $E_{pk}(sk)$ 來進行「在加密空間內的解密」。&lt;/li>
&lt;li>由於這個解密電路本身也是同態運算，因此會產生新的雜訊，但所輸出之新密文 $C_{fresh}$ 的雜訊，將被重設到一個固定的「恆定水準」。&lt;/li>
&lt;/ol>
&lt;div class="mermaid">graph LR
A["高雜訊密文 C_noisy"] --> B["同態解密電路 (Eval_Dec)"]
C["加密過的私鑰 E(sk)"] --> B
B --> D["低雜訊密文 C_fresh"]
style B fill:#ffeeba,stroke:#ffc107&lt;/div>
&lt;p>只要在計算過程中定期執行這種自舉操作，理論上就能計算無限深度的電路（達成 FHE）。然而，早期 Gentry 的方法，每次自舉處理都需要花費數十分鐘甚至數小時，計算成本高得令人絕望。&lt;/p>
&lt;hr>
&lt;h2 id="5-fhe-的世代與主要方案的進化">5. FHE 的世代與主要方案的進化
&lt;/h2>&lt;p>為了讓 FHE 得以實用化，世界各地的密碼學者爭相改良演算法。現在，FHE 主要分為四個世代或家族。&lt;/p>
&lt;h3 id="第-2-世代整數的精確運算-bgv-bfv">第 2 世代：整數的精確運算 (BGV, BFV)
&lt;/h3>&lt;p>於 2011 到 2012 年間登場的 &lt;strong>BGV (Brakerski-Gentry-Vaikuntanathan)&lt;/strong> 與 &lt;strong>BFV (Brakerski/Fan-Vercauteren)&lt;/strong> 方案。這些方案建立在 RLWE 的基礎上，非常適合整數的模數運算（精確計算）。
它們支援類似 SIMD (Single Instruction, Multiple Data) 的批次處理（Batching）技術，其特色是可以在一個巨大的多項式密文當中，塞入數千個資料槽，並一次進行平行運算。&lt;/p>
&lt;h3 id="第-3-世代自舉的加速化-gsw-fhew-tfhe">第 3 世代：自舉的加速化 (GSW, FHEW, TFHE)
&lt;/h3>&lt;p>2013 年的 &lt;strong>GSW (Gentry-Sahai-Waters)&lt;/strong> 方案簡化了 FHE 的結構。而將其進一步發展的，便是目前的主流之一 &lt;strong>TFHE (Fast Fully Homomorphic Encryption over the Torus)&lt;/strong>。
TFHE 的特色在於其自舉速度非常快（達毫秒等級）。它在邏輯閘層級（如 AND、XOR 等邏輯電路）的運算上非常強大，且密文的容量相對較小，因此適合用來高速評估任意的邏輯電路。&lt;/p>
&lt;h3 id="第-4-世代專精於近似計算與機器學習-ckks">第 4 世代：專精於近似計算與機器學習 (CKKS)
&lt;/h3>&lt;p>2017 年由 Cheon 等人所提出的 &lt;strong>CKKS (Cheon-Kim-Kim-Song)&lt;/strong> 方案，可說是目前 AI 與機器學習隱私保護領域的決定性技術。
相較於過去的 FHE 執著於「精確的整數計算」，CKKS 則支援在加密狀態下進行**「浮點數的近似計算」**。在神經網路的訓練或推論等容許微小誤差的實數計算上，它展現了壓倒性的效能。&lt;/p>
&lt;p>下表總結了如何根據不同目的來選擇方案。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">方案名稱&lt;/th>
&lt;th style="text-align:left">擅長的資料型態&lt;/th>
&lt;th style="text-align:left">推薦的應用場景&lt;/th>
&lt;th style="text-align:left">特色&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>BFV / BGV&lt;/strong>&lt;/td>
&lt;td style="text-align:left">整數 (Integer)&lt;/td>
&lt;td style="text-align:left">精確的統計計算、金融資料彙總、資料庫搜尋&lt;/td>
&lt;td style="text-align:left">藉由 SIMD 批次處理實現高吞吐量&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>CKKS&lt;/strong>&lt;/td>
&lt;td style="text-align:left">實數 (Real/Complex)&lt;/td>
&lt;td style="text-align:left">機器學習 (DNN、邏輯迴歸)、訊號處理&lt;/td>
&lt;td style="text-align:left">透過近似計算提升速度、重新縮放 (Rescaling)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>TFHE&lt;/strong>&lt;/td>
&lt;td style="text-align:left">布林值 (Boolean)&lt;/td>
&lt;td style="text-align:left">任意邏輯電路、字串搜尋、非線性函數評估&lt;/td>
&lt;td style="text-align:left">超高速的自舉（毫秒級別）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="6-實踐fhe-函式庫與概念性程式碼">6. 實踐：FHE 函式庫與概念性程式碼
&lt;/h2>&lt;p>時至今日，已經有許多開源函式庫釋出，讓開發者不需要具備深厚的密碼學知識也能使用 FHE。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Microsoft SEAL (Simple Encrypted Arithmetic Library)&lt;/strong>: 支援 BFV、BGV、CKKS 的 C++ 函式庫，也是業界標準之一。其 Python 綁定版 &lt;strong>TenSEAL&lt;/strong> 在 AI 工程師之間廣受歡迎。&lt;/li>
&lt;li>&lt;strong>Zama (Concrete)&lt;/strong>: 基於 TFHE 的框架。可用 Rust/Python 編寫，並提供將現有的 PyTorch 模型編譯為在 FHE 上執行的功能（Concrete ML）。&lt;/li>
&lt;li>&lt;strong>OpenFHE&lt;/strong>: PALISADE 的後繼者，是一個支援所有主要方案的全面性 C++ 函式庫。&lt;/li>
&lt;/ul>
&lt;h3 id="使用-python-tenseal-的-fhe-程式設計範例">使用 Python (TenSEAL) 的 FHE 程式設計範例
&lt;/h3>&lt;p>這裡我們展示一段概念性的 Python 程式碼範例，它使用 CKKS 方案，在加密狀態下將實數向量相加與相乘。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">tenseal&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">ts&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 建立上下文 (包含金鑰生成)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 CKKS 方案，並設定多項式的次數為 8192&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">context&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SCHEME_TYPE&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">CKKS&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">poly_modulus_degree&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">8192&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">coeff_mod_bit_sizes&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">generate_galois_keys&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">global_scale&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">40&lt;/span> &lt;span class="c1"># 實數的縮放係數&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 客戶端：將資料加密&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">vector1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">1.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">2.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">3.5&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">vector2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">2.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">3.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">4.0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 將明文向量轉換為密文 (實際上這會在客戶端執行)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_v1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ckks_vector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">vector1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_v2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ckks_vector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">vector2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 伺服器端：在維持加密的狀態下運算 (保護 Data in Use)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 伺服器並不知道明文為何，但可以執行加法與乘法&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_add&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_v1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">enc_v2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_mul&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_v1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">enc_v2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. 客戶端：解密結果&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 只有擁有私鑰的客戶端能看到結果&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">res_add&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_add&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decrypt&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">res_mul&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_mul&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decrypt&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;解密後的加法結果: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">res_add&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 輸出範例: [3.5000001, 5.5000001, 7.5000002] (因為是近似計算，所以會包含微小誤差)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;解密後的乘法結果: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">res_mul&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 輸出範例: [3.0000002, 7.5000005, 14.0000003]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>從上述的程式碼可以看出，我們能夠像 &lt;code>enc_v1 + enc_v2&lt;/code> 這樣，透過多載 (overload) 一般的 Python 運算子，直觀地撰寫密文之間的計算。而在伺服器端，不需要知道向量的內容也能完成向量運算。&lt;/p>
&lt;hr>
&lt;h2 id="7-fhe-的課題效能與硬體加速">7. FHE 的課題：效能與硬體加速
&lt;/h2>&lt;p>雖然 FHE 在理論上提供了完美的安全性，但實用化上的最大課題在於**「效能的負擔（Overhead）」**。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>計算的負擔&lt;/strong>: 與在明文下計算相比，密文下的計算在 CPU 上會慢了數千到數萬倍。多項式的乘法或自舉需要進行龐大的 FFT（快速傅立葉轉換）或 NTT（數論轉換）計算。&lt;/li>
&lt;li>&lt;strong>資料容量膨脹 (Ciphertext Expansion)&lt;/strong>: 只有幾個位元組的明文，在加密後可能會變成幾十 MB。這會對記憶體頻寬與網路頻寬造成巨大的壓力。&lt;/li>
&lt;/ol>
&lt;h3 id="透過硬體解決的方法">透過硬體解決的方法
&lt;/h3>&lt;p>為克服這種效能負擔，世界各地正積極開發專門針對 FHE 的硬體加速器（支援 ASIC、FPGA、GPU）。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>GPU 加速&lt;/strong>: 使用 NVIDIA 等強大的 GPU，以平行化處理 NTT 運算或自舉的技術正持續發展，已有報告指出比軟體實作快上數十倍（例如：100x.ai、Zama 的 TFHE-rs CUDA backend）。&lt;/li>
&lt;li>&lt;strong>DARPA DPRIVE 專案&lt;/strong>: 美國國防高等研究計劃署（DARPA）正在推動名為「DPRIVE (Data Protection in Virtual Environments)」的專屬硬體開發專案，目標是將 FHE 的計算速度提升至與明文處理相同的等級（負擔在 10 倍以內），參與者包括 Intel、Microsoft、Intellectual Ventures 等。&lt;/li>
&lt;li>&lt;strong>FPU (FHE Processing Unit) 的出現&lt;/strong>: Cornami 與 Optalysys 等新創公司，已經開始著手開發運用光學運算或特殊矽架構的 FHE 專用晶片。&lt;/li>
&lt;/ul>
&lt;p>或許在不久的將來，會像現在 AI 領域中的 NPU（神經網路處理器）一樣，迎來伺服器或雲端基礎架構將「FPU」列為標準配備的時代。&lt;/p>
&lt;hr>
&lt;h2 id="8-備受期待的應用場景">8. 備受期待的應用場景
&lt;/h2>&lt;p>隨著 FHE 逐漸達到具備實用性的速度，人們也期待它能在以下領域帶來破壞式的創新。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>醫療與基因解析的隱私保護&lt;/strong>:
在不違反隱私法規（如 HIPAA 或 GDPR）的情況下，能將多家醫院所擁有的病患病歷或 DNA 資料，在以 FHE 加密的狀態下交由雲端 AI 進行訓練，藉此建立出高準確度的癌症診斷模型或進行新藥開發。&lt;/li>
&lt;li>&lt;strong>金融機構的防詐欺與洗錢防制 (AML)&lt;/strong>:
互相競爭的銀行之間，可以在不公開客戶帳戶資訊或交易紀錄的情況下，以加密狀態比對彼此的資料，進行跨銀行的分析以偵測出龐大的非法匯款網路。&lt;/li>
&lt;li>&lt;strong>安全的 AI 推論 API (MaaS: Model as a Service)&lt;/strong>:
使用者可以將自己的聲音、臉部影像或提示詞加密後，再傳送給 AI 服務（如 ChatGPT 等 LLM）。AI 提供商能在完全不知道使用者輸入內容的情況下生成回答，並以密文形式傳回。這將徹底消除人們對於「個人資料會被 AI 學習或偷窺」的疑慮。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="9-結論密碼學的未來將邁向看不見的計算">9. 結論：密碼學的未來將邁向「看不見的計算」
&lt;/h2>&lt;p>就像 1970 年代發明了公開金鑰加密（RSA）後，網際網路上的安全通訊（如 HTTPS 等）才得以實現一樣，Craig Gentry 發明 FHE 的創舉，同樣是密碼學歷史上最重要的里程碑之一。&lt;/p>
&lt;p>現在，完全同態加密（FHE）已走出實驗室的理論階段，並進入 Microsoft、IBM、Intel、Google 以及許多新創公司為了商業化而激烈競爭的階段。儘管計算成本與資料容量的課題依然存在，但隨著演算法的精進與硬體加速器的發展，其效能正以超越摩爾定律的速度持續提升中。&lt;/p>
&lt;p>幾年之後，「將資料加密並維持該狀態進行計算」將不再是什麼特別的事情，而是會成為雲端服務中保護資料的標準最佳實踐。FHE 正是在數據驅動的社會中，能夠實現&lt;strong>極致隱私與資料活用兼得&lt;/strong>的次世代資安核心技術。&lt;/p></description></item></channel></rss>