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 n與y₂ = 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,以及兩個雜湊函式。
設模數 n 長 m 位元組(也就是 8m 位元,因此 n < 2^8m)。步驟如下:
形成編碼訊息:
M = H ‖ 00...00 ‖ 01 ‖ K其中
H是 OAEP 方案定義的h位元組常數,後面接上所需數量的00位元組與一個01位元組。產生
h位元組的隨機字串R,並設M = M ⊕ Hash1(R)(Hash1(R)與M等長)。設
R = R ⊕ Hash2(M)(Hash2(M)與R等長)。用新的
M與R形成m位元組字串:P = 00 ‖ M ‖ R它與模數
n等長,可轉換成一個小於n的整數x。計算 RSA 函式
x^e mod n得到密文。

圖 10-2:用 RSA-OAEP 加密對稱金鑰 K:H 為固定參數、R 為隨機位元
解密#
要解密密文 y:
- 計算
x = y^d mod n,從中還原M與R的最終值。 - 計算
M ⊕ Hash1(R ⊕ Hash2(M))取回M的初始值。 - 驗證
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)技巧,從任何雜湊函式建構出能回傳任意大雜湊值的雜湊函式。