RSA入門

陳朕@shu發表於2018-11-22

RSA演算法涉及到生成引數Gen,加密Enc、解密Dec三個函式.

生成引數

生成引數輸入指令並且輸出兩個足夠大的素數pq,不妨令N=pq.
實際過程中輸出素數是通過構造大整數然後利用已知素性測試實驗比如Miller rabin或者AKS(通常前者)判斷是否素數,不是就重新構造大整數,這是很簡單的.

  • 求尤拉函式

計算ϕ(N)=(p1)(q1)\phi(N)=(p-1)(q-1)也就是N的尤拉函式,必須強調由於已知N的質數分解這個計算十分容易,同時如果不知道N的質因數,或者說不能分解N,計算ϕ(N)\phi(N)是不可行的.
找出一個e,利用擴充套件歐幾里得乘法extended Euclidean algorithm保證e與ϕ(N)\phi(N)互素,#e=ϕ(ϕ(N)) \#e=\phi(\phi(N))確保了有足夠多個e.
需要強調的是,實際過程中e往往取e為3(需要填充系統的幫助)或者已知最大費馬素數224+1=655372^{2^4}+1=65537,最新的協議都要求e取65537(快速平方法只需要4次乘法一次加法),各位可以自行搜尋相關安全性分析(https://crypto.stackexchange.com/questions/3110/impacts-of-not-using-rsa-exponent-of-65537),e取這兩者的安全性有一定的差別.

  • 求逆

利用擴充套件歐幾里得乘法extended Euclidean algorithm計算e模的逆,不妨將之記為d,也即是說e和d滿足ed=1ed=1 mod ϕ(N)\phi(N).
我們將N 和e作為公鑰對,將d設為私鑰,整個RSA的安全性可以說基於第三者對d的不瞭解,或者說第三者不能高效進行大數分解.

素數定理

對於足夠大的x,我們有:0.921π(x)x/Inx1.1060.921\leq\frac{\pi(x)}{x/Inx}\leq 1.106
素數定理用來估計素數個數,具體來說當我們考慮找一個1024bit也就是300位左右的素數時,我們自然想知道這樣的素數大約有多少個:
# of 1024 bit primes=π(21024)π(21023)21024in2102421023in2102321013.53\#\ of\ 1024 \ bit \ primes=\pi(2^{1024})-\pi(2^{1023})\approx \frac{2^{1024}}{in 2^{1024}}-\frac{2^{1023}}{in 2^{1023}}\approx 2^{1013.53}
也即是說我們隨機選取的一個1024位數有大約0.04%的概率直接是素數.這其實是我們生成大素數的一個很重要的理論依據:如果素數足夠少,那生成素數就會非常困難.

我們考慮Alice和Bob在一個不安全通道上進行通訊,Eve是一個惡意的第三者,Eve可能監聽資訊,甚至可能篡改資訊,製造偽公鑰(active attack)等.

加密過程

Bob選擇明文,將明文m表示成適當的進位制(比如ASCII碼).

  • 加密

c=me mod  Nc=m^e\ mod\ \ N
其中c為密文.
事實上計算密文所需大數求模也有諸如Barrett的化簡演算法,或者快速平方法.

解密過程

Alice 通過不安全通道接收到密文c,進行如下運算:

  • 解密
    m=cd mod Nm=c^d\ mod\ N
    其中c為密文,d為私鑰,也就是e的模ϕ(N)\phi(N)逆元.該計算仍可運用諸如Barrett或者快速平方法的化簡演算法,.

安全性分析

考慮到密碼學的任務就是“在非安全的通道上安全的通訊”,那麼一個惡意的第三者Eve就不可避免的出現.
我們進行最簡單的分析,假設Eve只能竊取到密文,也就是c=me mod  Nc=m^e\ mod\ \ N,此外加上Eve 也可以得到的公鑰資訊,也就是N和e,Eve要解決的問題就是已知N,e,me mod  NN,e,m^e\ mod\ \ N,如何計算m.
這個問題可以歸約到大數分解問題,這裡僅給出一個例子:
我們計算x滿足x9=15mod  3×7x^9=15 \mod 3\times7
計算過程如下:

{x9=15mod  3x=15mod  3x=0mod  3x9=15mod  7x3=1mod  7x15=15mod  7x=1mod  7 \left\{ \begin{aligned} &x^9=15 \mod 3\Leftrightarrow x=15\mod3\Leftrightarrow x=0\mod 3 \\ &x^9=15 \mod 7\Leftrightarrow x^3=1\mod7\Leftrightarrow x^{15}=1^5\mod 7\Leftrightarrow x=1\mod 7 \end{aligned} \right.
可以看出當我們知道模N的質數分解後,這就是一個簡單的中國剩餘定理問題,3和7互素必有解,解為x=15+21kx=15+21k

一點小問題

為什麼p,q要足夠大?
為什麼N是兩個素數的乘積而不是一個或者三個或者更多?
Eve還可以進行說明操作來影響Alice和Bob之間的通訊?

擴充套件

事實上更多的內容值得我們去深究,比如素數的選取除了大還需要滿足什麼才能抵抗足夠多的攻擊?(比如要求p12\frac{p-1}2仍是素數)又或者RSA還有那些其他性質?(比如乘法同態)RSA安全性是否足夠可靠?(能否抵擋CCA,CPA等攻擊)這點都需要討論.

相關文章