<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Prime Numbers on kenji.blog</title><link>http://kenji.blog/zh-tw/tags/prime-numbers/</link><description>Recent content in Prime Numbers on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 16:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/zh-tw/tags/prime-numbers/index.xml" rel="self" type="application/rss+xml"/><item><title>黎曼猜想與質數分佈：與現代密碼學的深層關聯</title><link>http://kenji.blog/zh-tw/p/riemann-hypothesis-prime-distribution-cryptography/</link><pubDate>Fri, 11 Sep 2026 16:00:00 +0900</pubDate><guid>http://kenji.blog/zh-tw/p/riemann-hypothesis-prime-distribution-cryptography/</guid><description>&lt;img src="http://kenji.blog/p/riemann-hypothesis-prime-distribution-cryptography/img/eyecatch.jpg" alt="Featured image of post 黎曼猜想與質數分佈：與現代密碼學的深層關聯" />&lt;h1 id="1-前言質數這宇宙之謎與黎曼猜想">1. 前言：質數這宇宙之謎與黎曼猜想
&lt;/h1>&lt;p>「質數（Prime Numbers）」是只能被1和自己整除的自然數，在數學世界中也被稱為「原子」。2, 3, 5, 7, 11, 13&amp;hellip; 這般延續的數列，乍看之下似乎毫無秩序、隨機出現。自從古希臘數學家歐幾里得證明了「質數有無窮多個」以來，無數的數學家們便不斷挑戰，試圖解開隱藏在這個質數排列中的規律。&lt;/p>
&lt;p>最逼近這個質數之謎的，是1859年由德國數學家波恩哈德·黎曼（Bernhard Riemann）所提出的**「黎曼猜想（Riemann Hypothesis）」**。黎曼猜想是現代數學中最重要且未解決的難題之一，被克雷數學研究所列為千禧年大獎難題之一，並懸賞了100萬美元的獎金。&lt;/p>
&lt;p>乍看之下，關於質數分佈的純數學難題，似乎與我們的日常生活毫無關聯。然而，支撐現代社會基礎設施的網際網路安全，特別是&lt;strong>RSA加密和橢圓曲線密碼學（ECC）等現代密碼技術&lt;/strong>，都深深依賴於巨大質數的性質。&lt;/p>
&lt;p>本篇文章將帶領讀者踏上一段數學之旅，從質數分佈、質數定理、黎曼ζ函數，一路探討到黎曼猜想的核心，並極為詳細且深入地解說它如何與現代密碼技術相結合，以及如果黎曼猜想被證明，世界將會發生什麼樣的變化。&lt;/p>
&lt;hr>
&lt;h1 id="2-質數定理與質數分佈高斯的發現">2. 質數定理與質數分佈：高斯的發現
&lt;/h1>&lt;p>為了解質數是如何分佈的，數學家們構想出了&lt;strong>質數計數函數（Prime-counting function）&lt;/strong> $\pi(x)$，用來表示「小於等於某個數 $x$ 的質數有多少個」。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;ul>
&lt;li>$\pi(10) = 4$ （2, 3, 5, 7）&lt;/li>
&lt;li>$\pi(100) = 25$&lt;/li>
&lt;li>$\pi(1000) = 168$&lt;/li>
&lt;/ul>
&lt;p>15歲的天才數學家卡爾·弗里德里希·高斯（Carl Friedrich Gauss）在計算了龐大的質數表後，發現質數的出現頻率與自然對數 $\ln x$ 成反比地遞減。也就是說，他猜想在某個數 $x$ 附近找到質數的機率大約是 $\frac{1}{\ln x}$。&lt;/p>
&lt;p>將這個猜想用積分來表現，就是&lt;strong>對數積分（Logarithmic integral）&lt;/strong> $\text{Li}(x)$：&lt;/p>
$$ \text{Li}(x) = \int_{2}^{x} \frac{dt}{\ln t} $$
&lt;p>高斯的猜想後來在1896年由雅克·阿達馬和夏爾-讓·德拉瓦萊·普桑各自獨立證明，並確立為&lt;strong>質數定理（Prime Number Theorem, PNT）&lt;/strong>。&lt;/p>
$$ \lim_{x \to \infty} \frac{\pi(x)}{\text{Li}(x)} = 1 $$
&lt;p>或者近似地表示如下：&lt;/p>
$$ \pi(x) \sim \frac{x}{\ln x} $$
&lt;p>透過這個定理，我們了解到從巨觀來看，質數具有非常平滑且可預測的分佈。然而，從微觀來看，$\pi(x)$ 和 $\text{Li}(x)$ 之間總是存在著「誤差」，也就是「波動」。這個波動的真面目，正是黎曼猜想所試圖解開的最大謎團。&lt;/p>
&lt;hr>
&lt;h1 id="3-黎曼ζ函數與歐拉乘積">3. 黎曼ζ函數與歐拉乘積
&lt;/h1>&lt;p>在解析質數分佈時，最強大的武器就是&lt;strong>黎曼ζ函數（Riemann Zeta Function）&lt;/strong>。這原本是由萊昂哈德·歐拉（Leonhard Euler）針對實數 $s > 1$ 所定義的無窮級數。&lt;/p>
$$ \zeta(s) = \sum_{n=1}^\infty \frac{1}{n^s} = 1 + \frac{1}{2^s} + \frac{1}{3^s} + \frac{1}{4^s} + \dots $$
&lt;p>歐拉最大的貢獻之一，就是證明了這個無窮級數可以表示為所有質數 $p$ 的無窮乘積。這就是&lt;strong>歐拉乘積（Euler Product Formula）&lt;/strong>。&lt;/p>
$$ \zeta(s) = \prod_{p \text{ prime}} \frac{1}{1 - p^{-s}} = \left( \frac{1}{1 - 2^{-s}} \right) \left( \frac{1}{1 - 3^{-s}} \right) \left( \frac{1}{1 - 5^{-s}} \right) \dots $$
&lt;p>這個證明的直觀理解是，將等式右邊的每一項展開為等比級數並將它們相乘，根據算術基本定理（每個自然數都可以唯一地表示為質數的乘積），等式左邊的自然數倒數和將會被完美地重構出來。&lt;/p>
&lt;p>&lt;strong>就這麼一個數學公式，成為了連結分析學（無窮級數・連續函數）與數論（質數・離散數）的橋樑。&lt;/strong> 研究ζ函數，就等同於研究質數的分佈。&lt;/p>
&lt;hr>
&lt;h1 id="4-解析延拓與複數平面的擴展">4. 解析延拓與複數平面的擴展
&lt;/h1>&lt;p>黎曼的天才之處在於，他將歐拉原本只在實數範圍內考慮的 $\zeta(s)$ 的變數 $s$，擴展到了&lt;strong>複數 $s = \sigma + it$（$\sigma$ 為實部，$t$ 為虛部）&lt;/strong>。&lt;/p>
&lt;p>原本的無窮級數只在 $\sigma > 1$ 時收斂，但黎曼使用了「解析延拓（Analytic Continuation）」的手法，將 $\zeta(s)$ 的定義擴展到除了極點 $s = 1$ 之外的整個複數平面上，使其具有意義。&lt;/p>
&lt;p>他更進一步導出了ζ函數所滿足的優美函數方程式（Functional equation）：&lt;/p>
$$ \zeta(s) = 2^s \pi^{s-1} \sin\left(\frac{\pi s}{2}\right) \Gamma(1-s) \zeta(1-s) $$
&lt;p>這裡的 $\Gamma(x)$ 是伽瑪函數。透過這個方程式，我們可以從右半平面的性質得知左半平面的性質。&lt;/p>
&lt;h3 id="零點zeros-of-the-zeta-function">零點（Zeros of the Zeta Function）
&lt;/h3>&lt;p>使ζ函數的值為 0 的複數 $s$ 被稱為「零點」。
由函數方程式可知，當 $s$ 為負偶數（$-2, -4, -6, \dots$）時，$\sin(\pi s / 2)$ 會變成 0，因此 $\zeta(s) = 0$。這些被稱為&lt;strong>平凡零點（Trivial zeros）&lt;/strong>。&lt;/p>
&lt;p>然而，在質數分佈中真正重要的，是除此之外的零點，也就是存在於 $0 \le \sigma \le 1$ 的「臨界帶（Critical strip）」內的&lt;strong>非平凡零點（Non-trivial zeros）&lt;/strong>。&lt;/p>
&lt;hr>
&lt;h1 id="5-黎曼猜想的核心與顯式公式">5. 黎曼猜想的核心與顯式公式
&lt;/h1>&lt;p>黎曼計算了少數幾個零點，並提出了一個令人驚嘆的猜想。這就是&lt;strong>黎曼猜想&lt;/strong>。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>黎曼猜想 (Riemann Hypothesis)&lt;/strong>
黎曼ζ函數 $\zeta(s)$ 的所有非平凡零點，其實部都位於 $1/2$ 的直線上（$\text{Re}(s) = 1/2$）。&lt;/p>
&lt;/blockquote>
&lt;p>這條實部為1/2的直線被稱為「臨界線（Critical line）」。&lt;/p>
&lt;div class="mermaid">graph TD
A["黎曼ζ函數 ζ(s)"] --> B["透過解析延拓擴展至複數平面"]
B --> C["平凡零點 (s = -2, -4, -6 ...)"]
B --> D["非平凡零點 (0 &lt;= Re(s) &lt;= 1)"]
D --> E["黎曼猜想"]
E --> F["所有非平凡零點皆位於 Re(s) = 1/2 上"]
F --> G["通往質數分佈誤差項極限的證明"]&lt;/div>
&lt;p>為什麼黎曼猜想會如此重要呢？那是因為，ζ函數的零點&lt;strong>完全&lt;/strong>決定了質數的分佈。&lt;/p>
&lt;p>黎曼與後來的數學家馮·曼戈爾特，導出了一個能精確描述質數分佈的「顯式公式（Explicit formula）」。使用切比雪夫函數 $\psi(x)$，可以表示如下：&lt;/p>
$$ \psi(x) = x - \sum_{\rho} \frac{x^\rho}{\rho} - \ln(2\pi) - \frac{1}{2}\ln(1 - x^{-2}) $$
&lt;p>這裡的 $\rho$ 遍歷ζ函數的所有非平凡零點。
主項是 $x$（這對應於質數定理），從中加上或減去依賴於零點 $\rho$ 的波狀項，就能精確還原質數階梯狀的分佈。可以說，非平凡零點代表了質數分佈的「頻率（波）」。&lt;/p>
&lt;p>如果黎曼猜想是正確的，也就是所有非平凡零點 $\rho$ 的實部恰好都是 $1/2$，那麼質數定理的誤差項將會在理論上可預期的最小範圍內。&lt;/p>
$$ |\pi(x) - \text{Li}(x)| \le \frac{1}{8\pi} \sqrt{x} \ln x \quad \text{for} \quad x \ge 2657 $$
&lt;p>也就是說，&lt;strong>如果黎曼猜想為真，這將證明質數是以我們所能想像最「規律、優美」的方式分佈著。&lt;/strong>&lt;/p>
&lt;hr>
&lt;h1 id="6-現代密碼技術與質數不可分割的關係">6. 現代密碼技術與質數不可分割的關係
&lt;/h1>&lt;p>到目前為止，我們探討的是深奧的純數學世界，但這些質數的性質，卻從根本上支撐著現代數位社會。其代表性例子，便是以&lt;strong>RSA加密&lt;/strong>為首的公開金鑰密碼系統。&lt;/p>
&lt;p>網際網路上的信用卡支付、密碼傳輸、區塊鏈的數位簽章等，所有通訊的安全性都依賴於「質數」。&lt;/p>
&lt;h3 id="rsa加密的運作原理">RSA加密的運作原理
&lt;/h3>&lt;p>RSA加密的安全性，建立在「將位數極大的合成數進行質因數分解是非常困難的」這個數學事實（質因數分解問題）之上。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>金鑰生成&lt;/strong>:
隨機選擇兩個巨大的質數 $p$ 和 $q$（例如各2048位元）。
將它們相乘計算出 $N = p \times q$。這個 $N$ 將成為公開金鑰的一部分。
利用歐拉函數 $\phi(N) = (p-1)(q-1)$，生成私鑰 $d$。&lt;/p>
$$ e \times d \equiv 1 \pmod{\phi(N)} $$
&lt;/li>
&lt;li>
&lt;p>&lt;strong>加密與解密&lt;/strong>:
明文 $M$ 使用公開金鑰 $e, N$ 轉換為密文 $C$。
&lt;/p>
$$ C \equiv M^e \pmod{N} $$
&lt;p>
只有擁有私鑰 $d$ 的人才能解密。
&lt;/p>
$$ M \equiv C^d \pmod{N} $$
&lt;/li>
&lt;/ol>
&lt;div class="mermaid">graph LR
A["明文 (Plaintext)"] --> B["使用公開金鑰(e, N)進行加密"]
B --> C["密文 (Ciphertext)"]
C --> D["使用私鑰(d)進行解密"]
D --> E["原始明文"]
F["攻擊者 (Attacker)"] -- "嘗試對N進行質因數分解" --> C
F -.-> G["若不知道p與q，則無法計算出d"]&lt;/div>
&lt;p>要破解RSA加密，就必須從巨大的 $N$ 中找出原本的質數 $p$ 和 $q$（進行質因數分解）。即使使用目前主流的演算法（如普通數域篩法：GNFS），要將數百位數的數字進行質因數分解，即使動用超級電腦，所花費的時間也被認為會遠遠超過宇宙的年齡。&lt;/p>
&lt;hr>
&lt;h1 id="7-黎曼猜想對密碼技術的影響">7. 黎曼猜想對密碼技術的影響
&lt;/h1>&lt;p>那麼，位居純數學頂點的「黎曼猜想」與「密碼技術」是如何產生交集的呢？&lt;/p>
&lt;h3 id="71-質數生成演算法質數判定與廣義黎曼猜想grh">7.1. 質數生成演算法（質數判定）與廣義黎曼猜想（GRH）
&lt;/h3>&lt;p>為了運用RSA加密，首先必須生成巨大的質數 $p$ 和 $q$。然而，要確切且高速地判定「某個數是否為質數」並不容易。&lt;/p>
&lt;p>目前實用上被廣泛使用的是&lt;strong>米勒-拉賓質數判定法（Miller-Rabin primality test）&lt;/strong>，這是一種機率性演算法。這個演算法速度很快，但有極低的機率會將合成數誤判為質數（稱為「偽質數」）。&lt;/p>
&lt;p>但是，如果假設將黎曼猜想擴展到狄利克雷L函數上的**「廣義黎曼猜想（Generalized Riemann Hypothesis, GRH）」&lt;strong>為真，情況就會發生戲劇性的變化。
若GRH為真，米勒-拉賓判定法的測試次數上限就能獲得數學上的保證，從機率性演算法&lt;/strong>昇華為「確定性多項式時間演算法」**（這是在AKS質數測試演算法被發現前就已知的重要事實）。&lt;/p>
&lt;p>也就是說，黎曼猜想（及其推廣）扮演著直接為「能否以絕對的自信且高速地生成巨大質數」這個密碼學基礎生成過程背書的角色。&lt;/p>
&lt;h3 id="72-與質因數分解演算法的關係">7.2. 與質因數分解演算法的關係
&lt;/h3>&lt;p>在評估破解密碼一方的演算法（如普通數域篩法等）的計算複雜度時，關於質數分佈的知識也是不可或缺的。許多質因數分解演算法依賴於「平滑數（Smooth numbers：只包含較小質因數的數字）」的分佈。&lt;/p>
&lt;p>為了嚴密評估平滑數出現的頻率，需要對質數分佈有深刻的理解，這裡也充分運用了直接關聯到ζ函數與黎曼猜想的解析數論技巧。如果黎曼猜想被證明，質數分佈的誤差被完全確定，我們就能更精確地看清質因數分解演算法的效能極限。&lt;/p>
&lt;hr>
&lt;h1 id="8-如果黎曼猜想被證明密碼會被破解嗎">8. 如果黎曼猜想被證明，密碼會被破解嗎？
&lt;/h1>&lt;p>雖然有如都市傳說般流傳著「如果黎曼猜想被解開，RSA加密就會在一瞬間瓦解」，但&lt;strong>這在數學上是不正確的&lt;/strong>。&lt;/p>
&lt;p>黎曼猜想的證明本身，並不會立刻孕育出能讓質因數分解戲劇性加速的魔法演算法。因為黎曼猜想終究是關於質數「巨觀分佈規律性」的定理，並不能直接告訴我們個別數字 $N$ 能被哪個質數整除（局部性質）。&lt;/p>
&lt;p>然而，這並不代表影響為零。
因為在證明黎曼猜想的過程中，&lt;strong>極有可能性會發現「新的數學工具」或「未知的解析手法」&lt;/strong>。回顧歷史，當費馬最後定理或龐加萊猜想被證明時，在此過程中發展出的新理論，都讓整個數學領域有了大幅度的飛躍。&lt;/p>
&lt;p>如果確立了能夠完全操作黎曼ζ函數零點性質的未知代數幾何手法，或是非交換幾何的手法，我們不能否認，這最終可能導致劃時代的質因數分解演算法（例如將計算複雜度降至多項式時間的古典演算法）被發現。就這個意義而言，密碼學家絕不能對黎曼猜想的動向掉以輕心。&lt;/p>
&lt;h3 id="量子電腦與秀爾演算法">量子電腦與秀爾演算法
&lt;/h3>&lt;p>對密碼技術而言，更直接、更具現實威脅的不是黎曼猜想的證明，而是&lt;strong>量子電腦&lt;/strong>。1994年彼得·秀爾（Peter Shor）發表的「秀爾演算法」證明了，只要擁有足夠效能的量子電腦，就能在多項式時間內解決質因數分解問題。這將導致RSA加密和橢圓曲線密碼學從根本上被破解。&lt;/p>
&lt;p>目前，世界各地正積極推進轉移至即使是量子電腦也無法解讀的「後量子密碼學（Post-Quantum Cryptography, PQC）」（如晶格密碼等）。依賴於質數的密碼技術，或許在某種意義上即將結束其黃金時代，但質數本身的數學價值，永遠不會消失。&lt;/p>
&lt;hr>
&lt;h1 id="9-結語數學的抽象性與現實社會的交會點">9. 結語：數學的抽象性與現實社會的交會點
&lt;/h1>&lt;div class="mermaid">graph TD
A["純數學的探索"] --> B["解明黎曼猜想"]
B --> C["完全理解質數分佈"]
C --> D["數論與代數幾何學的飛躍性發展"]
D -.-> E["全新質因數分解演算法的可能性"]
E -.-> F["密碼技術安全性評估的更新"]
A --> G["應用數學與電腦科學"]
G --> H["質數判定與密碼生成的效率化"]
H --> F&lt;/div>
&lt;p>從古希臘延續至今對質數無止盡的探索，被天才黎曼昇華為複數平面上一首優美的交響曲（ζ函數的零點）。而令人驚嘆的是，這純粹無瑕的數學結晶，在經過數個世紀後，竟被應用為確保網際網路社會安全的最強盾牌。&lt;/p>
&lt;p>黎曼猜想同時象徵了數學所具備的「抽象之美」與「對物理世界・現實社會驚人的適用力」。&lt;/p>
&lt;p>當這座至今無人登頂的巨大數學山峰有朝一日被征服時，我們不僅能完全理解質數這宇宙真理，更將對資訊化社會的基礎產生全新的觀點。學習密碼技術，就如同踏上一段追溯人類智慧歷史的旅程。&lt;/p></description></item><item><title>【數學解說】讓高中生也能看懂的RSA加密原理</title><link>http://kenji.blog/zh-tw/p/rsa-encryption-math-explained-for-beginners/</link><pubDate>Fri, 11 Sep 2026 13:00:00 +0900</pubDate><guid>http://kenji.blog/zh-tw/p/rsa-encryption-math-explained-for-beginners/</guid><description>&lt;img src="http://kenji.blog/p/rsa-encryption-math-explained-for-beginners/img/eyecatch.jpg" alt="Featured image of post 【數學解說】讓高中生也能看懂的RSA加密原理" />&lt;p>互聯網社會安全的底層支柱技術之一就是「RSA加密」。線上購物的信用卡支付、與朋友在社群網路上的交流、公司機密資訊的收發等，我們每天不經意間使用的通訊，很多都是由RSA加密或其後續技術保護的。&lt;/p>
&lt;p>然而，一聽到「加密」，可能會聯想到間諜電影裡那種複雜的密碼機，或是只有少數天才才能理解的超高深數學。雖然現代密碼學確實建立在高等數學的基礎上，但&lt;strong>RSA加密的根本原理，只要具備高中數學（整數性質、質數、同餘等）的知識就足以理解&lt;/strong>。&lt;/p>
&lt;p>這篇文章將以高中數學知識為起點，逐步深入且徹底地解說RSA加密是基於什麼樣的數學原理運作的，以及為什麼它很難被破解。即使是不太擅長數學的人，我也會透過具體例子來淺顯易懂地解釋。&lt;/p>
&lt;hr>
&lt;h2 id="1-對稱密鑰加密與公鑰加密">1. 對稱密鑰加密與公鑰加密
&lt;/h2>&lt;p>在進入RSA加密的數學機制之前，我們先整理一下密碼學的基本概念。加密方式大致可分為「對稱密鑰加密」與「公鑰加密」兩種。&lt;/p>
&lt;h3 id="11-對稱密鑰加密方式的極限">1.1 對稱密鑰加密方式的極限
&lt;/h3>&lt;p>自古以來使用的加密方式，大多稱為「對稱密鑰加密方式」。這是一種&lt;strong>在「加密（將訊息轉換成秘密的密文）」與「解密（將密文還原成原本的訊息）」時使用相同密鑰&lt;/strong>的方式。&lt;/p>
&lt;p>例如，愛麗絲要寄一封秘密信件給鮑勃。愛麗絲用掛鎖（對稱密鑰）將信件鎖在箱子裡。鮑勃要打開那個箱子，就必須擁有與愛麗絲使用的同一把鑰匙。&lt;/p>
&lt;p>這種方式有一個很大的問題，就是「密鑰配送問題」。相隔兩地的愛麗絲與鮑勃在首次通訊時，該如何共享鑰匙而不被竊聽呢？如果在郵寄鑰匙的途中被第三者偷走，之後的加密通訊就會全部洩漏。&lt;/p>
&lt;h3 id="12-劃時代的發明公鑰加密方式">1.2 劃時代的發明「公鑰加密方式」
&lt;/h3>&lt;p>為了解決這個密鑰配送問題而發明出來的，就是「公鑰加密方式」。RSA加密也是其中一種。&lt;/p>
&lt;p>在公鑰加密方式中，會使用**「用來加密的密鑰（公鑰）」與「用來解密的密鑰（私鑰）」這兩把不同的鑰匙**。&lt;/p>
&lt;ol>
&lt;li>接收者鮑勃會建立一對「公鑰」與「私鑰」。&lt;/li>
&lt;li>鮑勃將「公鑰」公開給全世界（任何人都可以取得）。&lt;/li>
&lt;li>發送者愛麗絲使用鮑勃的「公鑰」來加密訊息並發送。&lt;/li>
&lt;li>加密後的訊息，只能用鮑勃獨有的「私鑰」來解密。&lt;/li>
&lt;/ol>
&lt;p>如果用掛鎖來比喻，鮑勃製作了許多「打開狀態的掛鎖（公鑰）」並散佈到全世界。愛麗絲將給鮑勃的訊息放入箱子，撿起鮑勃的掛鎖並將它鎖上。掛鎖一旦鎖上，就只有擁有「萬能鑰匙（私鑰）」的鮑勃才能打開。即使途中有人偷走了箱子，因為沒有萬能鑰匙，所以也打不開。&lt;/p>
&lt;div class="mermaid">graph TD
A["愛麗絲 (發送者)"] --> B["明文 (訊息)"]
B --> C["加密處理"]
D["鮑勃的公鑰 (任何人皆可取得)"] --> C
C --> E["透過網際網路發送: 密文"]
E --> F["解密處理"]
G["鮑勃的私鑰 (僅鮑勃擁有)"] --> F
F --> H["還原後的明文 (訊息)"]
H --> I["鮑勃 (接收者)"]&lt;/div>
&lt;p>要實現這種劃時代的系統，就需要一種**「單向函數（單向的數學謎題）」**，也就是「用公鑰很容易加密，但沒有私鑰就絕對無法解密」。而成為這個謎題零件的，正是我們熟知的「質數」。&lt;/p>
&lt;hr>
&lt;h2 id="2-支撐rsa加密的數學基礎1質數與質因數分解">2. 支撐RSA加密的數學基礎1：質數與質因數分解
&lt;/h2>&lt;p>RSA加密的安全性，建立在**「巨大數字的質因數分解非常困難」**這個數學事實上。&lt;/p>
&lt;h3 id="21-什麼是質數">2.1 什麼是質數
&lt;/h3>&lt;p>質數是指「除了1和自己本身之外，無法被其他數整除，且大於1的自然數」。
例如：$2, 3, 5, 7, 11, 13, 17, 19, 23...$&lt;/p>
&lt;p>質數就像是所有整數的「原子」。任何自然數都可以分解成質數相乘的形式。這稱為&lt;strong>質因數分解&lt;/strong>。例如 $60 = 2^2 \times 3 \times 5$，如果不考慮順序，就只有一種質因數分解的方法，這被稱為「算術基本定理」。&lt;/p>
&lt;h3 id="22-質因數分解的困難度單向函數">2.2 質因數分解的困難度（單向函數）
&lt;/h3>&lt;p>這裡的重點在於**「乘法很簡單，但質因數分解很困難」**這種不對稱性。&lt;/p>
&lt;p>例如，請試著心算以下兩個質數的乘法：
$11 \times 13 = ?$
這很簡單，答案是 $143$。&lt;/p>
&lt;p>那麼，這個數字呢？
請將 $323$ 進行質因數分解。
覺得如何？應該需要花一點時間。（答案是 $17 \times 19$）。&lt;/p>
&lt;p>如果數字很小，人類還能勉強算出來；但當數字變大時，即使使用電腦，計算難度也會呈現爆炸性成長。目前主流的RSA加密，會使用將兩個高達2048位元（十進位約600位數）、極其巨大的質數 $p$ 與 $q$ 相乘後的數字 $N = p \times q$。&lt;/p>
&lt;p>給定兩個巨大的質數 $p$ 和 $q$ 時，電腦瞬間（毫秒以下）就能計算出 $N$。但反過來，如果只給 $N$，要找出原本的 $p$ 和 $q$，即使讓現在最快的超級電腦運算幾兆年也解不出來。&lt;/p>
&lt;p>這種**「計算的不對稱性（去程簡單，回程困難）」**，就是創造出公鑰與私鑰關係的基礎。&lt;/p>
&lt;hr>
&lt;h2 id="3-支撐rsa加密的數學基礎2同餘模運算">3. 支撐RSA加密的數學基礎2：同餘（模運算）
&lt;/h2>&lt;p>RSA加密的計算，並不是我們平常用來讓數字無限變大的加法或乘法，而是在除以某個數的「餘數」世界中進行的。這稱為&lt;strong>同餘（模運算）&lt;/strong>。&lt;/p>
&lt;h3 id="31-時鐘的數學">3.1 時鐘的數學
&lt;/h3>&lt;p>模運算常被比喻為「時鐘的數學」。假設現在是10點，5小時後是幾點？ $10 + 5 = 15$ 點，但在一般的12小時制時鐘裡，我們會回答「3點」。這是因為15除以12的餘數是3。&lt;/p>
&lt;p>在數學的世界裡，我們會這樣表示：
&lt;/p>
$$ 15 \equiv 3 \pmod{12} $$
&lt;p>
讀作「15與3，在模12之下同餘（除以12的餘數相等）」。&lt;/p>
&lt;h3 id="32-同餘的基本性質">3.2 同餘的基本性質
&lt;/h3>&lt;p>同餘擁有與等式（$=$）非常相似且非常方便的性質。假設模（除數）為 $N$。
當 $a \equiv b \pmod N$ 且 $c \equiv d \pmod N$ 時，以下敘述成立：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>加法:&lt;/strong> $a + c \equiv b + d \pmod N$&lt;/li>
&lt;li>&lt;strong>減法:&lt;/strong> $a - c \equiv b - d \pmod N$&lt;/li>
&lt;li>&lt;strong>乘法:&lt;/strong> $a \times c \equiv b \times d \pmod N$&lt;/li>
&lt;li>&lt;strong>冪次方:&lt;/strong> $a^k \equiv b^k \pmod N$ （$k$ 為自然數）&lt;/li>
&lt;/ol>
&lt;p>其中特別重要的是「冪次方」的性質。這意味著**「餘數的次方，等於次方的餘數」**。
例如，我們想求 $7^{100}$ 除以 $5$ 的餘數。如果真的把 $7$ 乘100次再除以 $5$ 會非常辛苦；但如果使用同餘的性質，因為 $7 \equiv 2 \pmod 5$，所以 $7^{100} \equiv 2^{100} \pmod 5$，這能讓計算變得非常簡單。在密碼學的世界中，由於處理的是非常大數字的次方運算，這個性質是不可或缺的。&lt;/p>
&lt;hr>
&lt;h2 id="4-支撐rsa加密的數學基礎3歐拉函數與歐拉定理">4. 支撐RSA加密的數學基礎3：歐拉函數與歐拉定理
&lt;/h2>&lt;p>接下來就是RSA加密核心的數學魔法了。作為「費馬小定理」推廣的「歐拉定理」即將登場。&lt;/p>
&lt;h3 id="41-歐拉的總計函數-phin">4.1 歐拉的總計函數 $\phi(N)$
&lt;/h3>&lt;p>歐拉總計函數（$\phi$ 函數）是針對某個自然數 $N$，回傳**「從1到 $N$ 的自然數中，與 $N$ 互質（最大公因數為1）的數字個數」**的函數。&lt;/p>
&lt;p>我們來看幾個例子：&lt;/p>
&lt;ul>
&lt;li>$\phi(5)$：在1, 2, 3, 4, 5中，與5互質的有1, 2, 3, 4，共4個。因此 $\phi(5) = 4$。&lt;/li>
&lt;li>$\phi(6)$：在1, 2, 3, 4, 5, 6中，與6互質的有1, 5，共2個。因此 $\phi(6) = 2$。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【質數時的特殊性質】&lt;/strong>
如果 $p$ 是質數，從 1 到 $p-1$ 的所有數字都會與 $p$ 互質。因此：
&lt;/p>
$$ \phi(p) = p - 1 $$
&lt;p>&lt;strong>【質數相乘時的特殊性質】&lt;/strong>
對於兩個不同的質數 $p$ 和 $q$，當 $N = p \times q$ 時，$\phi(N)$ 可以很容易地用以下公式計算：
&lt;/p>
$$ \phi(N) = \phi(p) \times \phi(q) = (p - 1)(q - 1) $$
&lt;p>
這個性質就是RSA加密中的「秘密後門（陷門函數）」。知道 $p$ 和 $q$ 的人（密鑰建立者）可以瞬間計算出 $\phi(N)$，但只知道 $N$ 的第三者，除非對 $N$ 進行質因數分解，否則無法求得 $\phi(N)$。&lt;/p>
&lt;h3 id="42-歐拉定理">4.2 歐拉定理
&lt;/h3>&lt;p>萊昂哈德·歐拉（Leonhard Euler）利用這個 $\phi(N)$，證明了以下優美的定理：&lt;/p>
&lt;p>&lt;strong>歐拉定理：&lt;/strong>
當整數 $a$ 與 $N$ 互質時，以下的同餘式成立：
&lt;/p>
$$ a^{\phi(N)} \equiv 1 \pmod N $$
&lt;p>這是一個驚人的性質：「將某個數字 $a$ 自乘 $\phi(N)$ 次後除以 $N$，餘數必定會是 $1$」。（當 $N$ 是質數 $p$ 時，公式為 $a^{p-1} \equiv 1 \pmod p$，這被稱為費馬小定理）。&lt;/p>
&lt;p>讓我們變形一下這個歐拉定理。兩邊再乘以 $a$：
&lt;/p>
$$ a^{\phi(N) + 1} \equiv a \pmod N $$
&lt;p>此外，對於任意整數 $k$，$a^{k \cdot \phi(N)}$ 也會是 $1^k = 1$，因此以下公式成立：
&lt;/p>
$$ a^{k \cdot \phi(N) + 1} \equiv a \pmod N $$
&lt;p>這個公式正是讓RSA加密中**「加密後再解密就能還原」**這種魔法得以成立的根本原理。&lt;/p>
&lt;hr>
&lt;h2 id="5-rsa加密的演算法密鑰生成加密解密的步驟">5. RSA加密的演算法：密鑰生成、加密、解密的步驟
&lt;/h2>&lt;p>基礎知識準備好後，我們終於要來看看RSA加密的具體步驟了。RSA加密主要分為「1. 密鑰生成」、「2. 加密」、「3. 解密」三個階段。&lt;/p>
&lt;div class="mermaid">flowchart TD
A1["1. 選擇質數 p, q"] --> A2["計算 N = p × q"]
A1 --> A3["計算 φ(N) = (p-1)(q-1)"]
A3 --> A4["選擇與 φ(N) 互質的 e"]
A3 --> A5["計算 d 使得 e × d ≡ 1 (mod φ(N))"]
A2 --> A6["公鑰 (N, e)"]
A4 --> A6
A5 --> A7["私鑰 d"]
B1["2. 明文訊息 M"] --> B2["計算 C ≡ M^e (mod N)"]
A6 -.-> B2
B2 --> B3["發送密文 C"]
B3 --> C1["3. 接收到的密文 C"]
C1 --> C2["計算 M ≡ C^d (mod N)"]
A7 -.-> C2
C2 --> C3["取得原本的明文訊息 M"]&lt;/div>
&lt;h3 id="51-密鑰生成key-generation">5.1 密鑰生成（Key Generation）
&lt;/h3>&lt;p>作為接收者的鮑勃，要為自己生成「公鑰」與「私鑰」。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>選擇質數:&lt;/strong> 隨機選擇兩個大質數 $p$ 和 $q$。&lt;/li>
&lt;li>&lt;strong>計算模 $N$:&lt;/strong> 計算 $N = p \times q$。這個 $N$ 會被公開。&lt;/li>
&lt;li>&lt;strong>計算 $\phi(N)$:&lt;/strong> 計算歐拉函數 $\phi(N) = (p - 1)(q - 1)$。這是只有鮑勃知道的秘密數字。&lt;/li>
&lt;li>&lt;strong>選擇公鑰 $e$:&lt;/strong> 選擇一個整數 $e$，滿足 $1 &lt; e &lt; \phi(N)$，且與 $\phi(N)$ 互質。&lt;/li>
&lt;li>&lt;strong>計算私鑰 $d$:&lt;/strong> 找出滿足以下條件的整數 $d$：
$$ e \times d \equiv 1 \pmod{\phi(N)} $$
也就是說，「找一個數字 $d$，使得 $e \times d$ 除以 $\phi(N)$ 的餘數為 $1$」。&lt;/li>
&lt;/ol>
&lt;p>這樣密鑰就準備完成了。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>公鑰:&lt;/strong> $(N, e)$ 的組合。公開給全世界。&lt;/li>
&lt;li>&lt;strong>私鑰:&lt;/strong> $d$。絕對不能告訴任何人。&lt;/li>
&lt;/ul>
&lt;h3 id="52-加密encryption">5.2 加密（Encryption）
&lt;/h3>&lt;p>假設愛麗絲想發送秘密訊息 $M$ 給鮑勃。（將 $M$ 視為文字數值化後的結果，且 $0 \le M &lt; N$）。愛麗絲會使用鮑勃的公鑰 $(N, e)$ 進行以下計算：&lt;/p>
$$ C \equiv M^e \pmod N $$
&lt;p>計算「將訊息 $M$ 的 $e$ 次方，除以 $N$ 的餘數 $C$」。這個 $C$ 就是密文。&lt;/p>
&lt;h3 id="53-解密decryption">5.3 解密（Decryption）
&lt;/h3>&lt;p>鮑勃接收到密文 $C$。鮑勃使用私鑰 $d$ 進行以下計算：&lt;/p>
$$ M \equiv C^d \pmod N $$
&lt;p>「將密文 $C$ 的 $d$ 次方，除以 $N$ 的餘數」，計算後竟然就能還原出原本的訊息 $M$！&lt;/p>
&lt;hr>
&lt;h2 id="6-為什麼解密後能還原數學證明">6. 為什麼解密後能還原？（數學證明）
&lt;/h2>&lt;p>你可能會覺得疑問：「只是把 $C$ 做了 $d$ 次方，為什麼就能還原成原本的 $M$ 呢？」這時，先前的「歐拉定理」就發揮威力了。&lt;/p>
&lt;p>我們把解密的計算式 $C^d \pmod N$ 中，代入加密的式子 $C = M^e$：
&lt;/p>
$$ C^d \equiv (M^e)^d \equiv M^{ed} \pmod N $$
&lt;p>回想一下密鑰生成的步驟5。鮑勃在製作 $d$ 時，選擇了讓 $e \times d \equiv 1 \pmod{\phi(N)}$ 的數字。這意味著「$ed$ 是 $\phi(N)$ 的倍數加 $1$」。我們可以用整數 $k$ 這樣寫：
&lt;/p>
$$ ed = k \cdot \phi(N) + 1 $$
&lt;p>將它代入指數部分，並利用指數律來分解：
&lt;/p>
$$ M^{ed} = M^{k \cdot \phi(N) + 1} = M^{k \cdot \phi(N)} \times M^1 = (M^{\phi(N)})^k \times M $$
&lt;p>這裡假設訊息 $M$ 與 $N$ 互質，根據&lt;strong>歐拉定理&lt;/strong>，會有 $M^{\phi(N)} \equiv 1 \pmod N$。
&lt;/p>
$$ (M^{\phi(N)})^k \times M \equiv 1^k \times M \equiv M \pmod N $$
&lt;p>因此，完美地成立了以下公式：
&lt;/p>
$$ C^d \equiv M \pmod N $$
&lt;p>愛麗絲不知道 $d$，竊聽者也不知道 $d$，所以能從 $C$ 取出 $M$ 的，只有擁有 $d$ 的鮑勃。&lt;/p>
&lt;hr>
&lt;h2 id="7-具體例子用小質數手動計算體驗rsa">7. 具體例子：用小質數手動計算體驗RSA
&lt;/h2>&lt;p>讓我們實際用小數字（質數）來試試看愛麗絲給鮑勃的加密通訊。&lt;/p>
&lt;p>&lt;strong>【鮑勃的密鑰生成階段】&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>選擇兩個質數 $p=11$, $q=13$。&lt;/li>
&lt;li>計算 $N = 11 \times 13 = 143$。&lt;/li>
&lt;li>計算 $\phi(N) = (11 - 1) \times (13 - 1) = 10 \times 12 = 120$。&lt;/li>
&lt;li>選擇與 $\phi(N)=120$ 互質的公鑰 $e$。這裡我們選擇 $e=7$。&lt;/li>
&lt;li>求私鑰 $d$。尋找能讓 $7 \times d \equiv 1 \pmod{120}$ 的 $d$。
在方程式 $7d = 120k + 1$ 中，當 $k=6$ 時為 $721$，而 $721 \div 7 = 103$。
因此，$d = 103$。&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>公鑰：$(N=143, e=7)$&lt;/li>
&lt;li>私鑰：$d=103$&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【愛麗絲的加密階段】&lt;/strong>
假設想發送的訊息 $M = 9$。
公式：$C \equiv 9^7 \pmod{143}$
$9^7 = 4,782,969$。把它除以 143，商為 $33447$ 餘數 $48$。
密文 $C = 48$。&lt;/p>
&lt;p>&lt;strong>【鮑勃的解密階段】&lt;/strong>
鮑勃收到密文 $C = 48$，使用私鑰 $d = 103$ 來解密。
公式：$M \equiv 48^{103} \pmod{143}$
在計算機中執行 &lt;code>(48 ** 103) % 143&lt;/code>，結果完美地出現「&lt;strong>9&lt;/strong>」！順利收到了原本的訊息。&lt;/p>
&lt;hr>
&lt;h2 id="8-私鑰-d-的求法擴展歐幾里得演算法">8. 私鑰 $d$ 的求法：擴展歐幾里得演算法
&lt;/h2>&lt;p>在手動計算的例子中，我們是靠直覺找 $k$ 才找出 $d=103$，但當數字高達幾百位數時，這種方法就行不通了。在實際的程式中，會使用**「擴展歐幾里得演算法」**。&lt;/p>
&lt;p>解開 $7d \equiv 1 \pmod{120}$，就等同於尋找滿足 $7d + 120y = 1$ 的整數 $d, y$。透過逆推歐幾里得演算法，就可以機械化地求出這個值。&lt;/p>
&lt;ol>
&lt;li>$120 \div 7 = 17$ 餘 $1$&lt;/li>
&lt;li>將其變形後為 $1 = 120 - 17 \times 7$&lt;/li>
&lt;li>也就是 $-17 \times 7 \equiv 1 \pmod{120}$&lt;/li>
&lt;/ol>
&lt;p>$-17$ 在模 $120$ 的世界裡，與 $120 - 17 = 103$ 意義相同。因此，瞬間就能求得 $d = 103$。無論多麼巨大的數字，用這個方法都能非常快速地計算出來。&lt;/p>
&lt;hr>
&lt;h2 id="9-rsa加密的另一面數位簽章">9. RSA加密的另一面：數位簽章
&lt;/h2>&lt;p>RSA加密最棒的一點在於，如果將公鑰和私鑰的角色反過來，還能當作**「數位簽章」**使用。&lt;/p>
&lt;p>加密時是「用公鑰加密 $\Rightarrow$ 用私鑰解密」，
但在數位簽章中，則會採取「用私鑰加密 $\Rightarrow$ 用公鑰解密」的步驟。&lt;/p>
&lt;div class="mermaid">flowchart TD
A1["1. 愛麗絲用私鑰建立簽章"] --> A2["S ≡ M^d (mod N)"]
A2 --> A3["發送訊息 M 與簽章 S"]
A3 --> B1["2. 鮑勃用公鑰驗證簽章"]
B1 --> B2["計算 M' ≡ S^e (mod N)"]
B2 --> B3["確認 M' 是否與 M 一致"]&lt;/div>
&lt;p>愛麗絲使用自己的私鑰 $d$ 來轉換訊息（這就是簽章 $S$），然後發送給鮑勃。鮑勃使用愛麗絲的公鑰 $e$ 來進行驗證計算。如果計算結果與原本的訊息一致，就能同時證明「這是只有愛麗絲的私鑰才能建立的資料」，以及「訊息在途中沒有被篡改」。&lt;/p>
&lt;hr>
&lt;h2 id="10-透過程式體驗rsa加密">10. 透過程式體驗RSA加密
&lt;/h2>&lt;p>手動計算很辛苦的次方運算，只要用Python就能非常簡單地實作出來。以下是能體驗RSA加密核心邏輯的Python程式碼。&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;/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="k">def&lt;/span> &lt;span class="nf">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;求最大公因數&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&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="k">def&lt;/span> &lt;span class="nf">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;求私鑰 d（使用 Python 3.8 以後的內建功能）&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&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"># 1. 密鑰生成&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">13&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">N&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">phi&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&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;公鑰: (N=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, e=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">), 私鑰: d=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">d&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>&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">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ciphertext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&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">ciphertext&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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 解密&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">decrypted_message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&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">decrypted_message&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;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Python的 &lt;code>pow(base, exp, mod)&lt;/code> 函數在內部使用了名為「反覆平方法（快速冪）」的高速演算法，因此即使是幾百位數的數字，也能瞬間完成計算。&lt;/p>
&lt;hr>
&lt;h2 id="11-總結與未來的密碼技術">11. 總結與未來的密碼技術
&lt;/h2>&lt;p>我們以高中數學知識為基礎，解開了RSA加密的原理。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>質因數分解的困難度:&lt;/strong> $p \times q = N$ 很簡單，但從 $N$ 找出 $p, q$ 非常困難。&lt;/li>
&lt;li>&lt;strong>同餘與歐拉定理:&lt;/strong> 根據 $a^{\phi(N)} \equiv 1 \pmod N$ 這個法則，完成了「用某個數做次方運算就能還原」的魔法陷門函數。&lt;/li>
&lt;li>&lt;strong>公鑰與私鑰:&lt;/strong> 任何人都能加密，但只有合法的接收者才能解密。&lt;/li>
&lt;/ol>
&lt;p>現在使用的RSA加密的 $N$ 有600位數以上，即使動用全世界的超級電腦，質因數分解所花的時間也會超過宇宙的年齡。然而，近年來研究不斷進展的「量子電腦」若在未來實用化，透過「秀爾演算法（Shor&amp;rsquo;s algorithm）」，這種質因數分解可能瞬間就被解開。因此，現在全世界都在加速開發連量子電腦也無法破解的「後量子密碼學（抗量子計算機密碼）」。&lt;/p>
&lt;p>常被認為「派不上用場」的高等數學，其實在底層保護著我們的日常生活。RSA加密就是能告訴我們數學有多深奧與優美的絕佳教材。希望透過這篇文章，能讓您稍微感受到密碼學與數學的有趣之處。&lt;/p></description></item></channel></rss>