1. 程式人生 > >資料加密 ---- RSA 加密

資料加密 ---- RSA 加密

1. 前言

之前幾篇博文介紹了資料加密中的幾種常用形式,如,單向加密中的MD5加密SHA加密,如,分組加密中的AES加密DES加密,也介紹了經常使用的異或加密。這一篇來介紹不對稱加密演算法中經常使用的一種——RSA加密。

2. 簡介

RSA加密演算法是一種非對稱加密演算法。在公開金鑰加密和電子商業中RSA被廣泛使用。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。

1973年,在英國政府通訊總部工作的數學家克利福德·柯克斯(Clifford Cocks)在一個內部檔案中提出了一個相同的演算法,但他的發現被列入機密,一直到1997年才被髮表。

對極大整數做因數分解的難度決定了RSA演算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA演算法愈可靠。假如有人找到一種快速因數分解的演算法的話,那麼用RSA加密的資訊的可靠性就肯定會極度下降。但找到這樣的演算法的可能性是非常小的。今天只有短的RSA鑰匙才可能被強力方式解破。到目前為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。只要其鑰匙的長度足夠長,用RSA加密的資訊實際上是不能被解破的。

1983年9月12日麻省理工學院在美國為RSA演算法申請了專利。這個專利2000年9月21日失效。由於該演算法在申請專利前就已經被髮表了,在世界上大多數其它地區這個專利權不被承認。

3. 公鑰和私鑰

RSA公開金鑰密碼體制。所謂的公開金鑰密碼體制就是使用不同的加密金鑰與解密金鑰,是一種“由已知加密金鑰推匯出解密金鑰在計算上是不可行的”密碼體制。

在公開金鑰密碼體制中,加密金鑰(即公開金鑰)public key(PK) 是公開資訊,而解密金鑰(即祕密金鑰)secret key(sk) 是需要保密的。加密演算法E和解密演算法D也都是公開的。雖然解密金鑰SK是由公開金鑰PK決定的,由於無法計算出大數的尤拉函式{\color{Magenta}\phi(N)},所以不能根據PK計算出SK。

所以一段資料的RSA 演算法過程大概總結為下圖:

例如,Alice 給Tom 發一個私密訊息,又不能讓其他人擷取,Alice 只需要拿到Tom 給的公鑰,Tom拿到加密好的密文用自己的私鑰進行解密,就可以知道Alice 傳送的私密訊息。同樣的,Tom 給Alice 回覆訊息,只需要通過Alice給的公鑰進行加密後,Alice 通過自己的私鑰進行解密即可。這樣,只要擁有對方的公鑰,就可以相互的通訊,而即使在此過程中公鑰被擷取,也無法計算出私鑰而進行解密。

4. RSA 演算法

4.1 獲取金鑰

1、尋找兩個不相同的質數

隨意選擇兩個大的質數 p和 q,p 不等於 q,計算N=p * q

什麼是質數?

質數(Prime number),又稱素數,指在大於1的自然數中,除了1和該數自身外,無法被其他自然數整除的數(也可定義為只有1與該數本身兩個正因數的數)。

比如2,3,5,7這些都是質數,9就不是了,因為3*3=9了

2、根據尤拉函式獲取 r

求得 r = φ(N) = φ(p)φ(q) = (p-1)(q-1)

這裡的數學概念就是什麼是尤拉函數了,什麼是尤拉函式呢?

尤拉函式的定義:

尤拉函式 φ(n)是小於或等於 的正整數中與 n 互質的數的數目。

互質的定義:

如果兩個或兩個以上的整數的最大公約數是 1,則稱它們為互質

例如:φ(8) = 4,因為1,3,5,7均和8互質。

推導尤拉函式:

(1)如果n = 1φ(1) = 1;(小於等於1的正整數中唯一和1互質的數就是1本身);

(2)如果n為質數,φ(n) = n - 1;因為質數和每一個比它小的數字都互質。比如5,比它小的正整數1,2,3,4都和他互質;

(3)如果nak次冪,則 φ(n) = φ(a^k) = a^k- a^{k-1} = (a-1)a^{k-1};

(4)若m,n互質,則 φ(mn) = φ(m)φ(n)

證明:ABC是跟mnmn互質的數的集,據中國剩餘定理(經常看數學典故的童鞋應該瞭解,剩餘定理又叫韓信點兵,也叫孫子定理),A*BC可建立雙射一一對應)的關係。(或者也可以從初等代數角度給出尤拉函式積性的簡單證明) 因此的φ(n)值使用算術基本定理便知。(來自維基百科)

3、選擇一個小於 r 並與 r 互質的整數 e

選擇一個小於 r 並與 r 互質的整數 e,求得 e關於 r 的模反元素,命名為ded \equiv 1(mod r)模反元素存在,當且僅當e與r互質),e我們通常取65537。

模反元素:

如果兩個正整數 a 和 n 互質,那麼一定可以找到整數 b,使得 ab -1 被n整除,或者說ab被n除的餘數是1

比如3和5互質,3關於5的模反元素就可能是2,因為3*2-1=5可以被5整除。所以很明顯模反元素不止一個,2加減5的整數倍都是3關於5的模反元素{…-3, 2,7,12…} 放在公式裡就是3*2 = 1 (mod 5);

上面所提到的尤拉函式用處實際上在於尤拉定理

如果兩個正整數an互質,則n的尤拉函式 φ(n) 可以讓下面的等式成立:

a^{\varphi(n)} \equiv 1(mod n)

由此可得:aφ(n - 1)次方肯定是a關於n的模反元素。

尤拉定理就可以用來證明模反元素必然存在。

由模反元素的定義和尤拉定理我們知道,aφ(n)次方減去1,可以被n整除。比如,3和5互質,而5的尤拉函式φ(5)等於4,所以34次方(81)減去1,可以被5整除(80/5=16)。

小費馬定理:

假設正整數a與質數p互質,因為質數p的φ(p)等於p-1,則尤拉定理可以寫成

a^{p-1}\equiv 1 (mod p)

這其實是尤拉定理的一個特例。

4、銷燬p和q

此時我們的(N , e)是公鑰,(N, d)為私鑰,把公鑰(N, e)傳給別人,然後將(N, d)自己藏起來

4.2 加密訊息

假設Alice 想給Tom 送一個訊息 m,他知道Tom 產生的 N和 e。他使用起先與Tom 約好的格式將 m轉換為一個小於 N的非負整數 n,比如他可以將每一個字轉換為這個字的Unicode碼,然後將這些數字連在一起組成一個數字。假如他的資訊非常長的話,他可以將這個資訊分為幾段,然後將每一段轉換為 n。用下面這個公式他可以將 n 加密為 c:

{\color{Red} \mathbf{n^e}} {\color{Red} \mathbf{\equiv}} c (mod N)

計算 c並不複雜。Alice算出 c後就可以將它傳遞給Tom 。

4.3 解密訊息

Tom 得到Alice 的訊息 c 後就可以利用她的金鑰 d 來解碼。她可以用以下這個公式來將 c 轉換為 n:

\mathbf{{\color{Red} c^d}} {\color{Red} \equiv} n (mod N)

得到 n 後,她可以將原來的資訊 m 重新復原。

解碼原理:

由 n^e \equiv c (mod N)

c = n^e - kN

那麼,c^d = (n^e - kN)^d,所以,只需要證明(n^e - kN)^d \equiv n (mod N) 即可。

將上述方程式的左側用二項式定理展開,

(n^e - kN)^d = C_d^0 * n^{ed} * (-kN)^0 + C_d^1 * n^{e(d-1)} * (-kN)^1 + ... +  C_d^d * n^{e0} * (-kN)^d

可以發現,由於第二項開始都是 N 的整數倍,mod 後都為0,所以step2的證明可以簡化為,

n^{ed} \equiv n (mod N)

又因為ed \equiv 1 (mod r),即 ed = 1 + hφ(N),得到

n^{ed} = n^{1+h\varphi(N)} = n * n^{h\varphi(N)} = n * (n^{\varphi(N)})^h ,那麼只需要證明,

n * \mathbf{{\color{Red} (n^{\varphi(N)})^h}} \mathbf{{\color{Red} \equiv}} n (mod N)

1、如果n 與 N互質,那麼n^{\varphi(N)} \equiv 1 (mod N),

n^{\varphi(N)} = 1 + kN 

這裡的 k 與上面不是一個,理解為一個係數就可以。

最後n * (1 + kN)^h = n + ... + N 的倍數 \equiv n (mod N)

所以,等式驗證成功。

2、如果n 與 N 不是互質關係

此時,N = pq,p、q為兩個質數,那麼n 肯定是p或者q的倍數。即,n 為kp或者為kq。

如果以n=kp為例,這時k 和q必然互質。如果k 與q不為互質,那麼k=ix,q=iy,i 為非1的最大公約數,又因為q 為質數,所以i 為q,那麼n=kp=qxp=xn,但是按照RSA規範,n < N ,所以,k與q必然互質。

因為k 與q 互質,p與q也是互質,所以kp 與q 是互質,即n 與q是互質的。由小費馬定理得,如果n 與質數q 互質,那麼,

(kp)^{q-1} \equiv 1 (mod q)

進一步擴充套件,可得:

[(kp)^{(q-1)}]^{h(p-1)} * (kp) \equiv kp  (mod q)

即,(kp)^{ed} \equivkp  (mod q)

進一步改寫成等式:

(kp)^{ed} = kp + tq

顯然,t能被p整除, 即t=t’p,可以得出,

(kp)^{ed} = kp + t' pq = kp + t'N \equiv kp   (mod N)

因為kp = n,所以得出

n^{ed} \equiv n (mod N)

所以,等式驗證成功。

4.4 舉例

1、P = 65

2、選兩個質數,例如p=61,q=53,從而得到 N=3233

3、通過p、q計算出r=3120

4、找一個與r互質的數e=17(其實這個數很好找,找個質數,整數倍不是r即可)

5、根據e、r計算出d=2753

6、銷燬p、q

--------------- 至此,金鑰部分完成 --------------

7、加密

根據公式 c=n^e mod N (即 n^e \equiv c (mod N)),算得 c=65^{17} mod 3233 = 2790

8、解密

根據公式n=c^d mod N (即c^d \equiv n (mod N)),算得 n=2750^{2753} mod 3233 = 65

5. 安全

假設偷聽者乙獲得了甲的公鑰 N 和 e以及丙的加密訊息 c,但她無法直接獲得甲的金鑰 d,要獲得 d,最簡單的方法是將 N 分解為p  和q,這樣她可以得到同餘方程 de=1 (mod(p-1)(q-1))並解出 {\displaystyle d},然後代入解密公式

c^d \equivn (mod N)

匯出n(破密)。但至今為止還沒有人找到一個多項式時間的演算法來分解一個大的整數的因子,同時也還沒有人能夠證明這種演算法不存在。

至今為止也沒有人能夠證明對 N 進行因數分解是唯一的從 c 匯出 n 的方法,但今天還沒有找到比它更簡單的方法。(至少沒有公開的方法。)

因此今天一般認為只要 N 足夠大,那麼黑客就沒有辦法了。

假如 N 的長度小於或等於 256 位,那麼用一臺個人計算機在幾個小時內就可以分解它的因子了。1999年,數百臺計算機合作分解了一個512位長的N。一個由Shamir 和Tromer在2003年從理論上構建的硬體TWIRL,使人們開始質疑1024位長的N的安全性,目前推薦 N 的長度至少為2048位。

1994年彼得·秀爾(Peter Shor)證明一臺量子計算機可以在多項式時間內進行因數分解。假如量子計算機有朝一日可以成為一種可行的技術的話,那麼秀爾的演算法可以淘汰RSA和相關的派生演算法。(即依賴於分解大整數困難性的加密演算法)

假如有人能夠找到一種有效的分解大整數的演算法的話,或者假如量子計算機可行的話,那麼在解密和製造更長的鑰匙之間就會展開一場競爭。但從原理上來說RSA在這種情況下是不可靠的。

6. 細節

6.1 金鑰細節

首先要使用概率演算法來驗證隨機產生的大的整數是否質數,這樣的演算法比較快而且可以消除掉大多數非質數。假如有一個數通過了這個測試的話,那麼要使用一個精確的測試來保證它的確是一個質數。

除此之外這樣找到的 p和 q還要滿足一定的要求,首先它們不能太靠近,此外 p-1或 q-1的因子不能太小,否則的話 N也可以被很快地分解。

此外尋找質數的演算法不能給攻擊者任何資訊,這些質數是怎樣找到的,尤其產生隨機數的軟體必須非常好。要求是隨機和不可預測。這兩個要求並不相同。一個隨機過程可能可以產生一個不相關的數的系列,但假如有人能夠預測出(或部分地預測出)這個系列的話,那麼它就已經不可靠了。比如有一些非常好的隨機數演算法,但它們都已經被髮表,因此它們不能被使用,因為假如一個攻擊者可以猜出 p和 q一半的位的話,那麼他們就已經可以輕而易舉地推算出另一半。

此外金鑰 d必須足夠大,1990年有人證明假如  p大於 q而小於 2q(這是一個很經常的情況)而 d < \frac{1}{3} x N^{\frac{1}{4}},那麼從 N和 e可以很有效地推算出d。此外 e=2永遠不應該被使用。

6.2 速度

比起 DES 和其它對稱演算法來說,RSA要慢得多。實際上Alice 一般使用一種對稱演算法來加密他的資訊,然後用RSA來加密他的比較短的對稱密碼,然後將用RSA加密的對稱密碼和用對稱演算法加密的訊息送給Tom 。

另外,由於RSA的加密速度慢,一般都會將原文進行訊息摘要,進行數字簽名。而原文通過對稱加密的演算法加密,並和該簽名一同傳送。詳細的數字簽名和認證加密,可以看另一篇博文 數字簽名

6.3 金鑰分配

和其它加密過程一樣,對RSA來說分配公鑰的過程是非常重要的。

分配公鑰的過程必須能夠抵擋中間人攻擊。假設Eve交給Alice 一個公鑰,並使Alice 相信這是Tom 的公鑰,並且她可以截下Alice和Tom 之間的資訊傳遞,那麼她可以將她自己的公鑰傳給Alice,Alice以為這是Tom 的公鑰。Eve可以將所有Alice 傳遞給Tom 的訊息截下來,將這個訊息用她自己的金鑰解密,讀這個訊息,然後將這個訊息再用Tom 的公鑰加密後傳給Tom。理論上Tom 和Alice 都不會發現Eve在偷聽他們的訊息。今天人們一般用可靠的第三方機構簽發證書來防止這樣的攻擊。

6.4 時間攻擊

1995年有人提出了一種非常意想不到的攻擊方式:假如Eve對Tom 的硬體有充分的瞭解,而且知道它對一些特定的訊息加密時所需要的時間的話,那麼她可以很快地推匯出d。這種攻擊方式之所以會成立,主要是因為在進行加密時所進行的模指數運算是一個位元一個位元進行的,而位元為1所花的運算比位元為0的運算要多很多,因此若能得到多組訊息與其加密時間,就會有機會可以反推出私鑰的內容。

附:

參考: