RSA 通常與對稱加密方案搭配使用:用 RSA 加密一把對稱金鑰,再用該金鑰以 AES 這類密碼加密訊息。

但用 RSA 加密一則訊息或一把對稱金鑰,比「把目標轉成數 x 再算 x^e mod n」複雜得多。

教科書 RSA 加密為何不安全#

教科書 RSA 加密(textbook RSA encryption)指的是那種過度簡化的方案——明文只含你想加密的訊息本身。

例如要加密字串 RSA,我們先把它轉成數字:把三個字母的 ASCII 編碼各當一個位元組串接起來——R(位元組 52)、S(53)、A(41)。所得的位元組字串 525341 轉成十進位是 5395265,接著計算 5395265^e mod n

問題一:確定性#

教科書 RSA 加密是確定性的:同一段明文加密兩次會得到同樣的密文。

問題二:可鍛造性#

這是更大的問題。給定兩段教科書 RSA 密文 y₁ = x₁^e mod ny₂ = x₂^e mod n,你只要把這兩段密文相乘,就能導出 x₁ × x₂ 的密文:

y₁ × y₂ mod n = x₁^e × x₂^e mod n = (x₁ × x₂)^e mod n

結果正是訊息 x₁ × x₂ mod n 的密文。

攻擊者因此能從兩段 RSA 密文造出一段新的有效密文,藉此推導出關於原始訊息的資訊,危及你的加密安全性。我們說這個弱點讓教科書 RSA 加密具有可鍛造性(malleable)。

當然,若你知道 x₁x₂,你本來就能算出 (x₁ × x₂)^e mod n。問題在於:只知道 y₁y₂ 時,你不該能把密文相乘而得到「明文相乘」的密文。

強 RSA 加密:OAEP#

要讓 RSA 密文不可鍛造,密文就該由訊息資料加上一些額外資料(稱為填充,padding)組成。

標準做法是使用 OAEP(Optimal Asymmetric Encryption Padding,最佳非對稱加密填充),通常稱為 RSA-OAEP:在套用 RSA 函式之前,先用額外資料與隨機性把訊息填充成與模數等長的位元字串。

圖 10-1:以 (n, e) 為公鑰、用 RSA 加密對稱金鑰 K

在 RSA 公司的 PKCS#1 標準與 NIST SP 800-56B 這類官方文件中,OAEP 被稱為 RSAES-OAEP

OAEP 改良自現稱 PKCS#1 v1.5 的較早方法——那是 RSA 建立的公鑰密碼學標準(PKCS)系列中最早的方法之一。它明顯不如 OAEP 安全,卻仍被許多系統使用。

OAEP 的安全性#

OAEP 使用一個偽隨機數產生器(PRNG)把加密機率化,從而確保密文的不可區分性不可鍛造性

只要 RSA 函式與 PRNG 是安全的(以及在較次要的程度上,只要雜湊函式不太弱),OAEP 就已被證明安全。

只要你需要用 RSA 加密,就該使用 OAEP。

OAEP 加密如何運作#

要以 OAEP 模式用 RSA 加密,你需要:一則訊息(通常是對稱金鑰 K)、一個 PRNG,以及兩個雜湊函式

設模數 nm 位元組(也就是 8m 位元,因此 n < 2^8m)。步驟如下:

  1. 形成編碼訊息

    M = H ‖ 00...00 ‖ 01 ‖ K

    其中 H 是 OAEP 方案定義的 h 位元組常數,後面接上所需數量的 00 位元組與一個 01 位元組。

  2. 產生 h 位元組的隨機字串 R,並設 M = M ⊕ Hash1(R)Hash1(R)M 等長)。

  3. R = R ⊕ Hash2(M)Hash2(M)R 等長)。

  4. 用新的 MR 形成 m 位元組字串

    P = 00 ‖ M ‖ R

    它與模數 n 等長,可轉換成一個小於 n 的整數 x

  5. 計算 RSA 函式 x^e mod n 得到密文。

圖 10-2:用 RSA-OAEP 加密對稱金鑰 K:H 為固定參數、R 為隨機位元

解密#

要解密密文 y

  1. 計算 x = y^d mod n,從中還原 MR 的最終值。
  2. 計算 M ⊕ Hash1(R ⊕ Hash2(M)) 取回 M 的初始值。
  3. 驗證 M 具有 H ‖ 00...00 ‖ 01 ‖ K 的形式——h 位元組的 H、若干 00 位元組、然後一個 01 位元組。

實務參數#

參數典型值
m(模數長度)256 位元組(2048 位元 RSA)
h(Hash2 輸出長度)32 位元組(用 SHA-256)
M 可用長度m − h − 1 = 223 位元組
K 可用長度至多 m − 2h − 2 = 190 位元組
Hash1 輸出長度m − h − 1 = 223 位元組

Hash1 的 223 位元組輸出比任何常見雜湊函式的雜湊值都長。為了建構出這種不尋常輸出長度的雜湊,RSA 標準文件規定使用遮罩產生函式(mask generating function)技巧,從任何雜湊函式建構出能回傳任意大雜湊值的雜湊函式。