構造一個公鑰密碼系統的要求

  1. 產生一對金鑰是計算可行的
  2. 傳送方利用公鑰和明文,產生密文是計算可行的
  3. 接收方利用私鑰和密文,產生明文是計算可行的
  4. 對於攻擊者,利用公鑰來推斷私鑰是計算不可行的
  5. 已知公鑰和密文,恢復明文是計算不可行的
  6. (可選) 加密和解密的順序可交換

RSA 演算法的起源

  1. RSA 演算法在1977年由MIT 的Ron Rivest、Adi Shamir 和Leonard Adleman 一起提出,並以他們三人姓氏開頭字母命名,是一種獲得廣泛使用的非對稱加密演算法。
  2. 1983年麻省理工學院在美國為RSA 演算法申請了專利。這個專利2000年9月21日失效。由於該演算法在申請專利前就已經發表,在世界上大多數其它地區這個專利權不被承認。

RSA 演算法的安全性概述

  1. 對極大整數進行因數分解的難度(The Factoring Problem) 決定了RSA 演算法的可靠性。換言之,對一個極大整數做因數分解愈困難,RSA 演算法就愈可靠。假如有人找到一種快速因數分解的演算法的話,那麼用RSA 加密的資訊的可靠性就肯定會極度下降。目前看來找到這樣的演算法的可能性非常小。

  2. 目前還沒有可靠的攻擊RSA 演算法的方式。短的RSA 鑰匙可能被強力方式解破(比如768-bit,即232個十進位制位以下的整數)。只要其鑰匙的長度足夠長(比如1024-15360-bit),用RSA 加密的資訊看來很難被破解。

  3. 在分散式計算技術和量子計算理論日趨成熟的今天,RSA 加密的安全性受到了挑戰。

RSA公鑰和金鑰的生成

  1. 挑選兩個不同的大素數 p q p,q ,令 N = p q N= p*q。

  2. 利用尤拉 ϕ \phi 函式來計算$\phi (N) $。 有 ϕ ( N ) = ϕ ( q ) ϕ ( p ) = ( p 1 ) ( q 1 ) \phi(N) = \phi(q)\phi(p) = (p - 1)(q - 1)

  3. 挑選一個整數 e e ,滿足條件:小於 ϕ ( N ) \phi(N) 並與之互素。

  4. 通過式子 d e 1 ( m o d   ϕ ( N ) ) de \equiv 1 (mod \, \phi(N)) 計算得到 d d , 也就是說 d d e e 的模 ϕ ( N ) \phi(N) 逆元。

  5. 銷燬 p , q p,q , 當 N N 足夠大時,幾乎不可能反向推匯出 p , q p,q

  6. ( e , N ) (e,N) 作為公鑰, ( d , N ) (d, N) 作為私鑰。

RSA加密過程

  • 假設Bob傳送明文M給Alice,Bob有Alice的公鑰 ( e , N ) (e,N)

  • 要加密,Bob首先需要使用與Alice約定好的方式將明文M轉換成 一個整數n, 整數n小於N。(如果資訊N較大,可能需要分段加密)

  • Bob引用公鑰 ( e , N ) (e,N) 利用以下同餘式,將n加密為c:

    n e = c ( m o d   N ) n^e = c(mod \, N) c = n e m o d   N c = n^e mod \,N

  • Bob算出c之後可以公開傳播。

    !接收方公鑰加密 !

RSA解密過程

  • Alice得到Bob的訊息c,後利用Alice的私鑰 ( d , N ) (d, N) 解密。

  • 利用以下同餘式將c轉換為 n n'

    c d = n ( m o d   N ) c^d = n' (mod \, N) 或者 n = c d m o d   N n' = c^d mod\,N

  • 得到的 n n' 就是 Bob的n,因此就可以按照約定的方式將資訊M復原。

    ! 接收方私鑰解密 !

RSA演算法大素數選擇問題

RSA演算法中 p , q p, q 的選擇原則

  1. (D. Coppersmith) p 和q 不能離得太近。如果N 的位數為k,那麼 p q |p - q| 要同時滿足 l o g p q > k / 2 100 log|p - q|> k/2-100 以及 l o g p q > k / 3 log|p - q|> k/3
  2. (D. Coppersmith) 較短的e 可以提高加密演算法計算ne 的速度,但可能存在計算d 的快速演算法。PKCS#1 建議 e = 2 16 + 1 = 65537 e = 2^{16}+1 = 65537
  3. (M. Wiener) d 不能太小,否則可以通過快速演算法計算得到d。如果N 的位數為k,那麼d 的值要滿足 d > 2 k / 2 d > 2^{k/2}
  4. (O. Schirokauer) N 的非相鄰形式(Non-Adjacent Form, NAF) 的海明權重(Hamming weight, 非0元總數) 不能太小,否則應用數篩法可能會快速對N 進行質因數分解。一般要求N 的 N A F NAF 表述權重大於 N / 4 N/4

RSA 演算法中p 和q 的選擇流程:

  1. 確定RSA 所要求N 的位數k。k = 1024、2048、3072、4096 …

  2. 隨機選擇一個位數為 ( k + 1 ) / 2 (k + 1)/2 的素數p。

    p [ 2 ( k + 1 ) / 2 1 , 2 ( k + 1 ) / 2 1 ] p∈[2(k + 1)/2 - 1, 2(k + 1)/2 - 1]

  3. 選擇一個位數為 k ( k + 1 ) / 2 = ( k 1 ) / 2 k - (k + 1)/2 = (k - 1)/2 的素數q。

  4. 求|p - q|;如果log|p - q| 過小,則返回(2),重新選取p。

  5. 計算 N = p q N = pq ,確認N 的位數為 k ( N [ 2 k 1 , 2 k 1 ] ) k (N∈[2^{k-1}, 2^k - 1]) ;否則返回(2),重新選取p。

  6. 計算N 的NAF 權重;如果權重過小,則返回(2),重新選取p。

  7. 計算 ϕ \phi (N),選擇公鑰e, 2 16 < e < ϕ ( N ) 2^{16} < e <\phi(N) g c d ( e , ϕ ( N ) ) = 1 gcd(e, \phi(N)) =1

​ 一般建議選擇素數 e = 2 16 + 1 = 65537 e = 2^{16}+1 = 65537

  1. 求e 的模 ϕ ( N ) \phi(N) 逆元d;如果d 過小,則返回(2),重新選取p。
  2. 返回RSA 的引數p、q、e、d。或者銷燬p、q,返回N、e、d。

大素數的生成

  • 素數的存在性 – 素數理論:在正整數N 附近,每ln(N) 個整數中有一個素數。
  • 素數的生成過程:
    1. 隨機選擇一個奇數n (比如通過偽隨機數發生器);
    2. 隨機選擇a, 使0<a<n;
    3. 進行素性測試(例如用Miller-Rabin 演算法),若n 沒有通過測試,拋棄n,轉到(1);
    4. 如果通過了足夠次數的測試,概率上可以認為n 是素數,演算法結束;否則轉(2)。