RSA演算法過程
構造一個公鑰密碼系統的要求
- 產生一對金鑰是計算可行的
- 傳送方利用公鑰和明文,產生密文是計算可行的
- 接收方利用私鑰和密文,產生明文是計算可行的
- 對於攻擊者,利用公鑰來推斷私鑰是計算不可行的
- 已知公鑰和密文,恢復明文是計算不可行的
- (可選) 加密和解密的順序可交換
RSA 演算法的起源
- RSA 演算法在1977年由MIT 的Ron Rivest、Adi Shamir 和Leonard Adleman 一起提出,並以他們三人姓氏開頭字母命名,是一種獲得廣泛使用的非對稱加密演算法。
- 1983年麻省理工學院在美國為RSA 演算法申請了專利。這個專利2000年9月21日失效。由於該演算法在申請專利前就已經發表,在世界上大多數其它地區這個專利權不被承認。
RSA 演算法的安全性概述
-
對極大整數進行因數分解的難度(The Factoring Problem) 決定了RSA 演算法的可靠性。換言之,對一個極大整數做因數分解愈困難,RSA 演算法就愈可靠。假如有人找到一種快速因數分解的演算法的話,那麼用RSA 加密的資訊的可靠性就肯定會極度下降。目前看來找到這樣的演算法的可能性非常小。
-
目前還沒有可靠的攻擊RSA 演算法的方式。短的RSA 鑰匙可能被強力方式解破(比如768-bit,即232個十進位制位以下的整數)。只要其鑰匙的長度足夠長(比如1024-15360-bit),用RSA 加密的資訊看來很難被破解。
-
在分散式計算技術和量子計算理論日趨成熟的今天,RSA 加密的安全性受到了挑戰。
RSA公鑰和金鑰的生成
-
挑選兩個不同的大素數 ,令
-
利用尤拉 函式來計算$\phi (N) $。 有 。
-
挑選一個整數 ,滿足條件:小於 並與之互素。
-
通過式子 計算得到 , 也就是說 是 的模 逆元。
-
銷燬 , 當 足夠大時,幾乎不可能反向推匯出 。
-
作為公鑰, 作為私鑰。
RSA加密過程
-
假設Bob傳送明文M給Alice,Bob有Alice的公鑰 。
-
要加密,Bob首先需要使用與Alice約定好的方式將明文M轉換成 一個整數n, 整數n小於N。(如果資訊N較大,可能需要分段加密)
-
Bob引用公鑰 利用以下同餘式,將n加密為c:
即
-
Bob算出c之後可以公開傳播。
!接收方公鑰加密 !
RSA解密過程
-
Alice得到Bob的訊息c,後利用Alice的私鑰 解密。
-
利用以下同餘式將c轉換為
或者
-
得到的 就是 Bob的n,因此就可以按照約定的方式將資訊M復原。
! 接收方私鑰解密 !
RSA演算法大素數選擇問題
RSA演算法中 的選擇原則:
- (D. Coppersmith) p 和q 不能離得太近。如果N 的位數為k,那麼 要同時滿足 以及 。
- (D. Coppersmith) 較短的e 可以提高加密演算法計算ne 的速度,但可能存在計算d 的快速演算法。PKCS#1 建議 。
- (M. Wiener) d 不能太小,否則可以通過快速演算法計算得到d。如果N 的位數為k,那麼d 的值要滿足 。
- (O. Schirokauer) N 的非相鄰形式(Non-Adjacent Form, NAF) 的海明權重(Hamming weight, 非0元總數) 不能太小,否則應用數篩法可能會快速對N 進行質因數分解。一般要求N 的 表述權重大於 。
RSA 演算法中p 和q 的選擇流程:
-
確定RSA 所要求N 的位數k。k = 1024、2048、3072、4096 …
-
隨機選擇一個位數為 的素數p。
即 。
-
選擇一個位數為 的素數q。
-
求|p - q|;如果log|p - q| 過小,則返回(2),重新選取p。
-
計算 ,確認N 的位數為 ;否則返回(2),重新選取p。
-
計算N 的NAF 權重;如果權重過小,則返回(2),重新選取p。
-
計算 (N),選擇公鑰e, 且 。
一般建議選擇素數 。
- 求e 的模 逆元d;如果d 過小,則返回(2),重新選取p。
- 返回RSA 的引數p、q、e、d。或者銷燬p、q,返回N、e、d。
大素數的生成
- 素數的存在性 – 素數理論:在正整數N 附近,每ln(N) 個整數中有一個素數。
- 素數的生成過程:
- 隨機選擇一個奇數n (比如通過偽隨機數發生器);
- 隨機選擇a, 使0<a<n;
- 進行素性測試(例如用Miller-Rabin 演算法),若n 沒有通過測試,拋棄n,轉到(1);
- 如果通過了足夠次數的測試,概率上可以認為n 是素數,演算法結束;否則轉(2)。