RSA 定義複合數模運算上的陷門操作。安全系統只會透過標準化的加密或簽章方案使用這些操作,因為教科書式 RSA 具有確定性、可塑性,且結構上不安全。
金鑰產生 #
RSA 金鑰產生器取得互異且獨立產生的可能質數 p 與 q,然後計算:
n = p * q
phi(n) = (p - 1) * (q - 1)
lambda = lcm(p - 1, q - 1)模數 n 決定金鑰大小。產生標準對質數大小、差異、質數測試與隨機位元產生施加額外條件;僅選取兩個通過小質數試除的值並不足夠。應用程式應呼叫核准的函式庫金鑰產生器,而不要自行產生質數。
選擇滿足 gcd(e, lambda) = 1 的公開指數 e。慣例選擇是 65537。私密指數是其模反元素:
e * d = 1 (mod lambda)在 PKCS #1 條件下,使用 phi(n) 而不是 Carmichael 值 lambda 也能產生正確反元素。公開金鑰包含 (n, e)。私密金鑰通常保留 p、q、d 與中國剩餘定理(CRT)值。
私密操作與 CRT #
公開代表值 m 與密文代表值 c 透過 RSA 基本操作關聯:
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 個八位元組的雜湊,明文上限為:
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 結構、標籤雜湊、分隔符或後續明文剖析。攻擊者可見的不同錯誤、回應時間、重試行為或記錄可能形成填充預言機。使用具備抗預言機解碼的函式庫,保持外部可觀察的失敗行為一致,並驗證外層協定。任何失敗後都不要回傳部分解碼的明文。
參考資料 #
- RFC 8017: PKCS #1 v2.2
- FIPS 186-5: Digital Signature Standard
- NIST SP 800-56B Rev. 2: Pair-Wise Key-Establishment Schemes Using Integer Factorization Cryptography
- NIST SP 800-131A Rev. 2: Transitioning the Use of Cryptographic Algorithms and Key Lengths
- RFC 8446: TLS 1.3
- RFC 7468: Textual Encodings of PKIX, PKCS, and CMS Structures
評論
在 GitHub 上閱讀或評論(發表評論需要登入)