--- title: RSA tags: crypto lang: zh_tw --- * [筆記總覽](https://hackmd.io/@LJP/rkerFdnqS) [TOC] # RSA ## 加解密 $m$: 明文 $c$: 密文 $$ c \equiv m^e\ mod\ n $$ $$ m \equiv c^d\ mod\ n $$ 那如何生出 $e, d, n$ 呢? 請看下一章節 ## Key Generation 1. 找兩個大質數 $p, q$ 2. $n = p \times q$ 3. $\phi(n) = (p-1)(q-1)$ 4. 任意選取一個 $e \in \{2, 3, ..., \phi(n) - 1\}$,需滿足 $gcd(e, \phi(n)) = 1$ 5. 計算 $d$ 滿足 $d \times e \equiv 1\ mod\ \phi(n)$ public key: $e, n$ private key: $d$ 找大質數可以使用 [Miller-Rabin Test](https://hackmd.io/@LJP/ByqGC2UIK#Miller-Rabin-Test) ## Proof 那用以上方式產生出來的 key pair, 用以上的加解密方式, 真的能正確加解密嗎? 這裡就要試圖驗證這件事情 根據 [Fermat's Little Theorem](https://hackmd.io/@LJP/ry_Ei3L8Y) $$ a^{p-1} \equiv 1\ (mod\ p) $$ 推廣一下 $$ a^{p-1} \times a^{p-1} \equiv 1\ (mod\ p) $$ 上面的式子是對的,因為 $$ \begin{split}&(a^{p-1} \times a^{p-1})\ mod\ p \\ &= (a^{p-1}\ mod\ p) \times (a^{p-1}\ mod\ p) \\ &= 1 \times 1\\ &= 1 \end{split} $$ 再推廣成 $$ a^{k(p-1)} \equiv 1\ (mod\ p) $$ 不管 $k$ 為多少都成立,推法都可以用上面的推法如法炮製 將 $k$ 配成 $k(q-1)$,變成 $$ a^{k(p-1)(q-1)} \equiv 1\ (mod\ p) $$ 那假設 $q$ 也是質數的話,其實也可以用前面的推導推出 $$ a^{k(p-1)(q-1)} \equiv 1\ (mod\ q) $$ 將 $a^{k(p-1)(q-1)}$ 替換為 $x$,前面兩個式子表示 $$ \begin{split} x &\equiv 1\ (mod\ p)\\ x &\equiv 1\ (mod\ q)\\ \end{split} $$ $$ \begin{split} x &\equiv 1\ (mod\ p)\\ x &= pu + 1 \end{split} $$ $$ \begin{split} x &\equiv 1\ (mod\ q)\\ pu + 1 &\equiv 1\ (mod\ q)\\ pu &\equiv 0\ (mod\ q)\\ \end{split} $$ 這表示了 $u$ 能被 $q$ 整除($p$ 無法被 $q$ 整除) 將 $u$ 改成 $kq$ $$ \begin{split} x &= kpq + 1\\ x &\equiv 1\ (mod\ pq)\\ x &\equiv 1\ (mod\ n)\\ a^{k(p-1)(q-1)} &\equiv 1\ (mod\ n)\\ a^{1+k(p-1)(q-1)} &\equiv a\ (mod\ n)\\ \end{split} $$ 以上式子先推導到這邊,現在回來看一下加解密的方式 $$ c \equiv m^e\ mod\ n $$ $$ \begin{split} m &\equiv c^d\ mod\ n \\ m &\equiv (m^e\ mod\ n)^d\ mod\ n \\ m &\equiv (m^e)^d\ mod\ n \\ m &\equiv m^{ed}\ mod\ n \\ \end{split} $$ 由於我們知道 $$ ed \equiv 1\ mod\ \phi(n) $$ 可以換成這樣的形式 $$ \begin{split} ed &= 1 + k\phi(n)\\ &= 1 + k(p-1)(q-1) \end{split} $$ 替換一下 $ed$ $$ \begin{split} m &\equiv m^{ed}\ mod\ n \\ &\equiv m^{1 + k(p-1)(q-1)}\ mod\ n \\ \end{split} $$ 根據前面推導的 $a^{1+k(p-1)(q-1)} \equiv a\ (mod\ n)$ 證明 $m \equiv c^d\ mod\ n$ 的正確性 ## 安全性 RSA 的安全性觀察完 Key generation 後 在 Client 只會拿到 $e, n$ 的情況下 若 $n$ 被質因數分解出 $p, q$, 那 Client 就能算出 $d$, 那 RSA 就被破了 所以 RSA 的安全性建構在 **$n$ 很難被質因數分解** 的問題上 ## 使用中國餘式定理加速解密 參考[這篇文章](https://www.di-mgt.com.au/crt_rsa.html) 在[中國餘式定理 CRT](https://hackmd.io/@LJP/B17an2I8t)中有舉一個例子: > 舉個例子,若已知 $(a\ mod\ 7, a\ mod\ 5)$ 系統,求在 $(4, 3)$ 座標上的數字 $x$ > 這個例子中, 得到 $(4, 3)$ 就能高速反推在 $mod\ (7 \times 5)$ 中對應的 $x$ RSA 解密式是 $m \equiv c^d\ mod\ n$ 若能先得到明文在 $(a\ mod\ p, a\ mod\ q)$ 系統的座標 就能高速反推在 $mod\ (p \times q)$ (就是 $mod\ n$)中對應的 $p$ 實際算法分成兩部分 第一部分是 Server 可以先準備好的, 不用每次解密都重算一遍 $$ \begin{split} d_p &\equiv e^{-1}\ (mod\ (p-1)) \\ d_q &\equiv e^{-1}\ (mod\ (q-1)) \\ q_{inv} &\equiv q^{-1}\ (mod\ p) \\ \end{split} $$ 第二部分才是每次解密要重算的部分 $$ \begin{split} m_1 &\equiv c^{d_p}\ (mod\ p) \\ m_2 &\equiv c^{d_q}\ (mod\ q) \\ h &\equiv q_{inv}(m_1 - m_2)\ (mod\ p) \\ m &\equiv m_2 + hq \\ \end{split} $$ ### Proof 算出明文在 $(a\ mod\ p, a\ mod\ q)$ 系統的座標 也就是求 $$ \begin{split} m &\equiv c^d\ (mod\ p) \\ m &\equiv c^d\ (mod\ q) \\ \end{split} $$ 而 $c^d\ (mod\ p)$ 可以推導一下 將 $d$ 改寫為 $k\phi(p) + d\ mod(\phi(p))$ (也就是 $d$ 除 $\phi(p)$ 的形式) $$ \begin{split} c^d &\equiv c^{k\phi(p) + d\ mod(\phi(p))}\ (mod\ p) \\ &\equiv (c^{\phi(p)})^k \times c^{d\ mod(\phi(p))}\ (mod\ p) \\ \end{split} $$ 因為 $p$ 是質數, 根據[Fermat’s Little Theorem](https://hackmd.io/@LJP/ry_Ei3L8Y)可得知 $c^{\phi(p)} \equiv c^{p-1} \equiv 1\ (mod\ p)$ 所以上面的推導繼續變成 $$ \begin{split} c^d &\equiv (c^{\phi(p)})^k \times c^{d\ mod(\phi(p))}\ (mod\ p) \\ &\equiv (1)^k \times c^{d\ mod(\phi(p))}\ (mod\ p) \\ &\equiv c^{d\ mod(\phi(p))}\ (mod\ p) \\ &\equiv c^{e^{-1}\ mod(p-1)}\ (mod\ p) \\ \end{split} $$ 讓我們回顧一下第一部分 $$ \begin{split} d_p &\equiv e^{-1}\ (mod\ (p-1)) \\ d_q &\equiv e^{-1}\ (mod\ (q-1)) \\ q_{inv} &\equiv q^{-1}\ (mod\ p) \\ \end{split} $$ 展開一下第二部分第一行 $$ \begin{split} m_1 &\equiv c^{d_p}\ (mod\ p) \\ &\equiv c^{e^{-1}\ (mod\ (p-1))}\ (mod\ p) \\ \end{split} $$ 發現其實這就是在求明文在 $mod\ p$ 這一軸的座標 同理, 第二部分第二行就是求明文在 $mod\ q$ 這一軸的座標 得到座標後就可反推出在 $mod\ (p \times q)$ 原本的數字是什麼, 也就是明文 ## 攻擊手段 ### Common Factor Attacks 參考[RSA Common Factor Attacks](https://blog.louie.lu/2017/09/30/rsa-common-factor-attacks/) 若挑選質數時不夠亂 假設第一次挑 $P, Q$ 分別挑到 $A, B$ 算出了 $N_1 = AB$ 第二次挑 $P, Q$ 挑到 $A, C$ 算出了 $N_2 = AC$ 求 $N_1, N_2$ 的公因數就會得到 $A$, 就破 RSA 了 ### Mathematical Attacks 這個攻擊是走分解 $n$ 的路線 找到一組 $x, y$ 符合 $x^2 \equiv y^2\ (mod\ n)$ 如此就找到 $x^2 - y^2 \equiv (x+y)(x-y) \equiv 0\ (mod\ n)$ 等於 0, 表示 $n$ 能整除 $(x+y)(x-y)$ 表示 $p \times q$ 能整除 $(x+y)(x-y)$ 計算 $d = gcd(x-y, n)$ $d$ 只會有以下四種狀況 - $d = p$ 表示 $p$ 能整除 $x-y$ 且 $q$ 能整除 $x+y$ - $d = q$ 表示 $q$ 能整除 $x-y$ 且 $p$ 能整除 $x+y$ - $d = n$ 表示 $p, q$ 皆能整除 $x-y$ - $d = 1$ 表示 $p, q$ 皆不能整除 $x-y$ 且 $p, q$ 皆能整除 $x+y$ 如此就有二分之一的機率能夠分解 $n$ 但要如何尋找 $x, y$ 呢 有幾種方式 - Continued Fraction - Quadratic Sieve - Number Field Sieve #### Continued Fraction TBD #### Quadratic Sieve TBD #### Number Field Sieve TBD ### Protocol Attacks 竄改密文 $c$, 在前面乘上 $s^e$ 受害者解密時 $$ (s^ec)^d \equiv sm\ mod\ n $$ ### Fault-injection Attacks TBD ### Pollard's p – 1 Attack 參考 [Mathematical attack on RSA ](https://www.nku.edu/~christensen/Mathematical%20attack%20on%20RSA.pdf) 以下講解原理 若有一個數字 $r$ 使得 $r!$ 能被 $p-1$ 整除 那麼可以說 $r! = (p-1)j$ 此時任選一個 $a, 1 < a < p-1$ 因為 [Fermat’s Little Theorem](https://hackmd.io/@LJP/ry_Ei3L8Y) 所以下面式子正確 $a^{r!} \equiv a^{(p-1)j} \equiv 1\ mod\ p$ $a^{r!} - 1 \equiv 0\ mod\ p$ 以上說明 $a^{r!} - 1$ 能被 $p$ 整除 而 $n = pq$ 也能被 $p$ 整除 所以 $gcd(a^{r!}-1,n) = p$ 就分解 $n$ 了 若 $p-1$ 或 $q-1$ 的最大質因數過小會導致此攻擊成功 ### Low Public Exponent Attack 參考 [Rsa e attack](https://wiki.x10sec.org/crypto/asymmetric/rsa/rsa_e_attack/) 若 e 選的小, 例如說 3 因為加密方式是 $c \equiv m^3\ mod\ n$ 所以 $m^3 = k \times n + c$ 只要對 $k \times n + c$ 開三次根就能解出 $m$ 實際攻擊時 $k$ 可以暴力枚舉, 直到解出整數, 則此整數就是 $m$ ### Broadcast Attack 若知道同個 $m$ 用 $e$ 個不同的 $n$ 加密的 $c$ 用[中國餘式定理](https://hackmd.io/@LJP/B17an2I8t) 可以直接推回 $m$ 以 $e = 3$ 為例 $m^3 \equiv c_1\ mod\ n_1$ $m^3 \equiv c_2\ mod\ n_2$ $m^3 \equiv c_3\ mod\ n_3$ 用 CRT 推得 $c$ $m^3 \equiv c\ mod\ n_1n_2n_3$ 因為 $m^3 < n_1n_2n_3$, 所以上式可得知 $m^3 = c$ 直接對 $c$ 開三次方根就能得到明文 以上在只知道 $c_1, c_2, c_3$ 與 3 組公鑰的條件下解 $m$ ### Wiener Attack 若選的 $d$ 小於 $\frac{1}{3}n^{\frac{1}{4}}$ 則以下成立 $$ \vert(\frac{e}{n} - \frac{k}{d})\vert < \frac{1}{2d^2} $$ $\frac{k}{d}$ 會出現在 $\frac{e}{n}$ 的收斂連分數中 ### LSB Oracle Attack 假設有一個解密機器叫做 Oracle 給他密文 $c$ 他會 return 明文的最後一 bit 怎麼解回對應 $c$ 的整個明文 $m$ 給 Oracle 吃 $2^ec$ 解密時 $$ (2^ec)^d \equiv 2m\ mod\ n $$ 若 $m$ 低於 $\frac{1}{2}n$, 則 $2m$ 低於 $n$ 此時 $(2^ec)^d$ 對應的解密結果會是 $2m$ return 的最後一 bit 必為 0, 因為乘 2 了嘛 若 $m$ 高於 $\frac{1}{2}n$, 則 $2m$ 高於 $n$ 此時 $(2^ec)^d$ 對應的解密結果會是 $2m - n$, 因為 $mod\ n$ 嘛, 超過 $n$ 就減 $n$ 因為 $2m$ 一定是偶數, $n$ 為兩個奇數相乘所以也必為奇數, 偶數減掉奇數一定是奇數 return 的最後一 bit 必為 1 所以給 $(2^ec)^d \equiv 2m\ mod\ n$ 看 return 的 LSB 就能初步確定 $m$ 的範圍 return 0: $m$ 低於 $\frac{1}{2}n$ return 1: $m$ 高於 $\frac{1}{2}n$ 繼續餵 Oracle 吃 $4^ec$ 解密時 $(4^ec)^d \equiv 4m\ mod\ n$ return 0: $m$ 低於 $\frac{1}{4}n$ return 1: $m$ 高於 $\frac{1}{4}n$ 以下類推 總之這就是用這種方式進行類似二分搜索的攻擊 更進一步, 假設回傳 4 bits LSB 傳送 $16^ec$, 則解密時 $$ (16^ec)^d \equiv 16m\ mod\ n $$ :hankey: 假設回傳 0 若 server 回傳 0 (0b0000), 則表示 $$ (16m\ mod\ n)mod\ 16 \equiv 0 $$ $$ 16m - kn \equiv 0\ mod\ 16 $$ ☆ 推導 k 的範圍 因為 $n=pq$ 無法被 16 整除, 要滿足上式則 $k$ 一定得為 16 的倍數, 這邊改寫 $$ 16m = kn + (16m\ mod\ n) $$ $$ 16m = 16un + (16m\ mod\ n) $$ ★ 推導 m 的範圍 $$ 0 < m < \frac{n}{16} $$ 因為 $$ 0 < 16m < n $$ $$ 16m\ mod\ n = 16m $$ $$ 16m\ mod\ 16 = 0 $$ 若 $\frac{n}{16} < m < \frac{2n}{16}$, 則 $$ n < 16m < 2n $$ $$ 16m\ mod\ n = 16m - n $$ $$ 16m - n\ mod\ 16 \neq 0 $$ 所以論證不能是 $\frac{n}{16} < m < \frac{2n}{16}$ 這個範圍 同樣的方式能論證 $\frac{2n}{16} < m < \frac{3n}{16}$ ... $\frac{15n}{16} < m < n$ 皆不可能 :hankey: 假設回傳 1 若 server 回傳 1 (0b0001), 則表示 $$ (16m\ mod\ n)mod\ 16 \equiv 1 $$ $$ 16m - kn \equiv 1\ mod\ 16 $$ $$ 16m \equiv kn + 1\ mod\ 16 $$ $$ 0 \equiv kn + 1\ mod\ 16 $$ ☆ 推導 k 的範圍 $$ kn + 1 = 16u $$ $$ kn = 16u - 1 $$ $$ k = \frac{16u - 1}{n} $$ ★ 推導 m 的範圍 $$ \frac{n}{16} < m < \frac{2n}{16} $$ 因為 $$ n < 16m < 2n $$ $$ 16m\ mod\ n = 16m - n $$ $$ (16m - n)\ mod\ 16 = 1 $$ 而 $n\ mod\ 16 = 1$, 所以 $n = 16i + 1$ $$ (16m - 16i + 1)\ mod\ 16 = 1 $$ 若 $\frac{2n}{16} < m < \frac{3n}{16}$, 則 $$ 2n < 16m < 3n $$ $$ 16m\ mod\ n = 16m - 2n $$ $$ 16m - 2n\ mod\ 16 \neq 1 $$ $$ (16m - 2(16i + 1))\ mod\ 16 = 1 $$ $$ (16m - 32i + 2))\ mod\ 16 \neq 1 $$ 所以論證不能是 $\frac{2n}{16} < m < \frac{3n}{16}$ 這個範圍 同樣的方式能論證 $\frac{3n}{16} < m < \frac{4n}{16}$ ... $\frac{15n}{16} < m < n$ 皆不可能 以及 $0 < m < \frac{n}{16}$ 也不可能 :hankey: 小結論 回傳 x, 則表示 $\frac{xn}{16} < m < \frac{(x+1)n}{16}$ :fishing_pole_and_fish: 假設第一次回傳 0 第二步根據上次送的再乘一次 $16^e$, 則解密時 $(16^{2e}c)^d \equiv 16^2m\ mod\ n$ 由第一次配上前面的推導, 已經知道 $0 < m < \frac{n}{16}$ $(16^2m\ mod\ n)mod\ 16 \equiv 0$ 因為 $0 < 16m < n$, 所以 $16m\ mod\ n = 16m$ 乘上一個 16 後, 16m 的可能範圍又回到 $0 < 16m < n$ 這次再乘上 16 後根據回傳的值 x 又能說 $\frac{xn}{16} < 16m < \frac{(x+1)n}{16}$ 再除回去 $\frac{xn}{16^2} < m < \frac{(x+1)n}{16^2}$ 配上 $\frac{xn}{16} < m < \frac{(x+1)n}{16}$ 交集出 $m$ 的範圍 ### Bleichenbacher 1998 Attack (BB98) TBD