RSA 加密與簽章

最後更新: 2025-05-10 18:23:26 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

RSA 定義複合數模運算上的陷門操作。安全系統只會透過標準化的加密或簽章方案使用這些操作,因為教科書式 RSA 具有確定性、可塑性,且結構上不安全。

金鑰產生 #

RSA 金鑰產生器取得互異且獨立產生的可能質數 p 與 q,然後計算:

text
n      = p * q
phi(n) = (p - 1) * (q - 1)
lambda = lcm(p - 1, q - 1)

模數 n 決定金鑰大小。產生標準對質數大小、差異、質數測試與隨機位元產生施加額外條件;僅選取兩個通過小質數試除的值並不足夠。應用程式應呼叫核准的函式庫金鑰產生器,而不要自行產生質數。

選擇滿足 gcd(e, lambda) = 1 的公開指數 e。慣例選擇是 65537。私密指數是其模反元素:

text
e * d = 1 (mod lambda)

在 PKCS #1 條件下,使用 phi(n) 而不是 Carmichael 值 lambda 也能產生正確反元素。公開金鑰包含 (n, e)。私密金鑰通常保留 p、q、d 與中國剩餘定理(CRT)值。

私密操作與 CRT #

公開代表值 m 與密文代表值 c 透過 RSA 基本操作關聯:

text
c = m^e mod n
m = c^d mod n

私密操作可以分別對 p 與 q 取模計算,然後使用 CRT 重組結果。該最佳化大幅提升速度,但其中一個分支的故障可能暴露 n 的因數。因此密碼學函式庫會將 CRT 防護與 RSA 盲化、結果驗證等實作對策結合。

只要攻擊者能向裝置提交選定密文或簽章,時序、快取、功率與故障行為都屬於威脅模型。固定時間與側通道抵抗力是實作屬性,不是 RSA 方程式的結果。

安全性假設與金鑰大小 #

知道 p 與 q 就能直接恢復私密操作,因此分解模數足以破壞安全性。沒有證明表明,破解每個以 RSA 為基礎的方案恰好等價於分解。安全性論證也取決於 RSA 問題、編碼方案、雜湊函式、隨機性與攻擊模型。

目前 NIST 過渡指引接受至少 2,048 位元的 RSA 模數,以提供 112 位元古典安全強度。3,072 位元模數約對應 128 位元強度。協定或合規要求可能需要更大尺寸,或禁止新用途使用 RSA。較大金鑰會增加 CPU、頻寬與憑證大小;它們無法修復薄弱的填充方案或遭入侵的實作。

RSA 本身不提供前向保密。TLS 1.3 移除了 RSA 金鑰傳輸,並使用短暫的 (EC)DHE 建立流量祕密。允許的 RSA-PSS 簽章仍可讓 RSA 憑證驗證 TLS 1.3 端點。

OAEP 加密 #

RSAES-OAEP 會在套用公開 RSA 操作前,以雜湊、遮罩產生函式、標籤與隨機種子編碼訊息。對於以 k 個八位元組表示的模數,以及輸出 hLen 個八位元組的雜湊,明文上限為:

text
mLen <= k - 2*hLen - 2

因此 OAEP 用於隨機產生的對稱金鑰等短值,而不是大量資料。混合協定會封裝或傳輸內容加密金鑰,並使用已驗證加密保護實際承載資料。完整混合建構必須來自協定標準;單獨的 RSAES-OAEP 不會驗證應用程式資料。

OAEP 參數是演算法識別碼的一部分。兩端必須對雜湊、遮罩產生雜湊與標籤達成一致。某個 API 的函式庫預設值可能與另一個 API 不同,因此協定必須指定它們。

PSS 簽章 #

RSASSA-PSS 會雜湊訊息、加入鹽值、套用遮罩產生函式,並在私密 RSA 操作前將結果編碼至模數寬度。驗證會反向執行公開操作並驗證每個欄位。鹽值長度、訊息雜湊與遮罩產生雜湊都是明確參數。

新協定需要 RSA 簽章時應使用 PSS。PKCS #1 v1.5 加密與簽章編碼在某些舊式協定中仍然必要,但相容性不是新設計選用它們的理由。驗證器必須實作協定識別的精確方案,並拒絕格式錯誤或超出範圍的代表值。

整數、ASN.1 與 PEM 編碼 #

PKCS #1 定義 I2OSP 與 OS2IP,在非負整數與固定長度的大端序八位元組字串間轉換。方案要求精確 k 個八位元組時,前導零八位元組具有意義。ASN.1 DER INTEGER 值具有正負號,因此高位元為 1 的正 RSA 整數會加入前導 00 八位元組。混淆這些規則會造成截斷、負值或寬度錯誤的值。

常見容器具有不同結構:

容器內容
PKCS #1 RSAPublicKey模數與公開指數
X.509 SubjectPublicKeyInfo演算法識別碼與編碼公開金鑰
PKCS #1 RSAPrivateKey模數、指數、質數與 CRT 參數
PKCS #8 PrivateKeyInfo 或 OneAsymmetricKey以演算法標記的私密金鑰
X.509 憑證主體身分、簽發者簽章、擴充功能與 SubjectPublicKeyInfo

PEM 在 DER 值外加入文字標籤與 Base64 裝甲。因此 PUBLIC KEY 與 RSA PUBLIC KEY 等標籤識別不同 ASN.1 結構。請使用維護中的函式庫剖析預期容器,而不要用臨時的 Base64 與位元組切片擷取整數。

拒絕教科書式 RSA 與填充預言機 #

教科書式 RSA 直接套用模次方運算。它會洩漏明文相等性、允許代數修改,且沒有完整性檢查。絕不要將它用於加密或簽章,包括被宣傳為「以私密金鑰加密雜湊來簽章」的範例。

解密不得揭露失敗來自密文範圍、OAEP 結構、標籤雜湊、分隔符或後續明文剖析。攻擊者可見的不同錯誤、回應時間、重試行為或記錄可能形成填充預言機。使用具備抗預言機解碼的函式庫,保持外部可觀察的失敗行為一致,並驗證外層協定。任何失敗後都不要回傳部分解碼的明文。

參考資料 #

評論

在 GitHub 上閱讀或評論(發表評論需要登入)