RSA 是一個著名的非對稱式加密系統,其安全性建立在大數分解的難度上
目前 RSA 僅能透過旁通道攻擊(Side-Channel Attack)
接下來我們需要先介紹 RSA 所需的數學知識
我們會以 (念作 phi) 表示尤拉函數
定義 為在所有的正整數當中,有多少 的數字與 互質的數字
在這個定義之下,如果說 是一個質數的話,那麼所有 的正整數也必定與之互質,因此此時的
這也就是費馬小定理
在 RSA 當中,我們會取兩個質數 ,並計算
此時的
一個整數 在模(mod) 的模反元素是指能滿足以下式子的整數
或是表示成
就如同要找到一個數 的乘法反元素,等同找到一個數字 滿足
此時的 ,也就是我們常見的倒數
在 RSA 當中,我們會去找某個數字 在模(mod) 下的模反元素
由於是在模底下運作,這個是不成立的!
這裡還有一個重要的性質
因為唯有這個條件成立,才會存在模反元素
如果不知道為什麼,不妨舉幾個數字來試試看,例如
會發現到無論如何都不會找到解,這裡先不寫證明
在 python 當中要求模反元素,可以使用 python 的 modules 輕鬆達成
在 RSA 當中有幾個常用的符號
符號 | 意義 |
---|---|
明文 | |
密文 | |
加密指數 | |
解密指數 | |
模數 |
RSA 加密的流程如下:
RSA 解密流程如下
第一步的分解可以透過下列的工具協助
證明
已知
要證明 等同於證明
根據費馬小定理可知
( 為質數)
因此
要做 RSA encryption 運算必須要是一串數字
做完 RSA decryption 後會得到的是一串數字
因此我們須要有可以將字串跟數字之間做轉換的工具,以下使用 pyCryptodome
透過 RSA decryption 的公式 可以知道我們還缺 ,而 為 在模 下的模反元素
先求
因為這題的 還不大,可以透過上述的工具先做分解,可以得到
則
就可以透過 計算出來
當 過大且 過小使得 ,此時只要對 開 次方根就可以得到
先看一下 RSA encryption
如果 ,就意味著 這個操作根本沒做
也就是說 ,倒過來說
可以使用 Python 開多次方根的工具
輸出的結果第一個值會告訴我們結果,第二個值會告訴我們是否可以完全開 次方號
如果我們只要取數字的話
當 和 皆為質數時稱作孿生質數
已知
其中 以及 皆為孿生質數
那麼
可以藉此得到 以及
而
因此,在不分解 的前提下,我們就可以得到 以及 ,並藉此進一步得到 ,然後解出原文
根據前面的敘述,可以分得到
有了 以及 就可以得到 ,也就可以解密了
Wiener Attack 是在特定情況下提供我們猜測 的方式( 稍後說明)
透過猜測 得到 ,因此得到 以及明文
接下來我們需要先介紹 Wiener Attack 所需的數學知識
在數學當中連分數以下列方式表達:
並且也可以用 list 的方式表達,我們會稱呼為 continued fraction expansion
並且可以保證所有的有理數都有有限的連分數展開式
以 舉例來說
從範例當中可以發現,我們會不斷的透過倒數以及商數使得連分數不斷擴張,直到商數為 結束
同時也會有一個數列 稱作 convergents of the continued fraction expasion
也就是一個不斷逼近於 的數列
同樣的,對於一個小數也可以寫成連分數的型態
以 舉例來說
接下來是關於 Wiener Attack 的觀察
接下來同乘以 並移項
從觀察一可以發現,只要有 就可以透過解一元二次方程式的根得到
我們知道
所以
從觀察二可以發現,只要知道 就可以解出
從上面的兩個觀察當中可以得知,只要解出 就可以解出 ,也就可以解密
而 Wiener Attack 其實就是提供我們一種猜 的方式
回顧觀察二並將式子同除以 做整理
由於 很大,可以將 視為
整理式子後會發現
而
得到這個結論後,我們就可以透過尋找 的 convergents of the continued fraction expansion 猜看看
每猜一次就帶回去求 ,然後檢查 是否成立,不是就再找下一個
知道 之後回推 只需要
知道 之後解方程式的根也只需要
而計算 continued fraction expansion 實際上就是在做輾轉相除法
所以嘗試所有的 convergents 需要
並且 ,因此時間複雜度計為
總時間複雜度為
根據前面的推論,先將 convergents of the continued fraction expasion 算出來
接著對於每一組 convergents 去猜測
最後求出 並確認 是否成立即可
這邊我們只詳細介紹了 little e 以及 twin prime ,不過還有其他有趣的部份可以繼續研究
Crypto