線上 RSA 加密指的是直接在瀏覽器中產生一組公開金鑰與私密金鑰,讓一方能以公開金鑰加密資料,而只有持有對應私密金鑰的一方能解密。所產生的非對稱金鑰對由兩個大質數組成,組合成一個長度為 2048 或 3072 位元的模數,並搭配一個固定為 65537 的公開指數,最終產生的金鑰會匯出為標準的 PEM 封套——公開金鑰採用 SubjectPublicKeyInfo (SPKI) 格式,私密金鑰則採用 PKCS#8 格式——兩者皆依據 RFC 7468 進行編碼。使用基於瀏覽器的 RSA 金鑰產生器時,所有的數學運算與 PEM 編碼都透過平台內建的 Web 加密 API (Web Cryptography) 在分頁中本機完成,因此絕不會有任何金鑰位元被傳送到遠端服務。輸出結果可直接餵入任何期望使用 SHA-256 搭配 RSA-OAEP 加密的應用程式、服務或程式庫。
大多數搜尋「RSA encryption online」的讀者,都希望取得一組能直接貼到其他系統中使用的金鑰對——例如正在串接 API 的開發人員、向合作夥伴分發金鑰的安全工程師,或是想驗證非對稱加密流程的學習者。本文接下來的內容會逐步說明瀏覽器實際產生了什麼、如何在 2048 與 3072 位元之間抉擇、如何執行產生步驟,以及在實際依賴該金鑰之前,如何驗證其結果。

瀏覽器中的 RSA 金鑰對是如何產生的
產生器會呼叫 Web Crypto API 的 generateKey 方法,使用 RSA-OAEP 演算法、雜湊函式 SHA-256、由你自選的模數長度(2048 或 3072),以及公開指數 65537。Web Crypto 接著會在內部產生兩個隨機的大質數,衍生出模數並運算相關的私密指數,然後回傳一個可匯出的金鑰對物件。除非你自行複製,否則這些質數與產生的私密位元組永遠不會離開瀏覽器分頁;同時,由於此操作是非同步的,因此緩慢的 3072 位元產生作業不會被後續以較小設定點擊的動作所覆蓋。
由於 RSA 的安全性取決於質數的不可預測性,平台每產生一個質數時都會取用其密碼學安全隨機來源。這就是為什麼即使設定完全相同,每次點擊「Generate」的輸出結果都不一樣——若私密金鑰的值是固定的,就代表該金鑰不再具備私密性。如果你重新產生時發現輸出與先前某次結果完全相同,請將其視為嚴重錯誤並立即停止使用此工具。
金鑰產生完成後,產生器會將公開金鑰匯出為 SubjectPublicKeyInfo 格式的 DER 位元組,將私密金鑰匯出為 PKCS#8 格式的 DER 位元組,接著依照 RFC 7468 中的規範,將兩者各自包裝成每行 64 個字元的 Base64 編碼,並加上標準的 BEGIN PUBLIC KEY 與 BEGIN PRIVATE KEY 標頭。你會得到兩段可直接貼入任何接受 PEM 格式之處的文字區塊。
在 2048 位元與 3072 位元模數之間抉擇
RSA 的安全性會隨著模數長度提升,但運算成本也同樣增加。產生器刻意僅提供兩個值——2048 與 3072——因為它們幾乎涵蓋所有實際的加密使用情境,而又能避免意外部署 1024 位元的版本。下表整理了在產生當下的實際權衡。
| 面向 | 2048 位元模數 | 3072 位元模數 |
|---|---|---|
| 模數長度 | 2048 位元 (256 位元組) | 3072 位元 (384 位元組) |
| 產生時間 | 較快 | 明顯較慢——瀏覽器必須找出兩個較大的質數 |
| 加密與解密成本 | 每次操作的 CPU 負載較低 | 每次操作的 CPU 負載較高 |
| 互通性 | 所有現代 RSA-OAEP 架構皆廣泛支援 | 現代架構支援;部分舊系統可能拒絕接受 |
| 相對安全餘裕 | 標準 | 較大 |
| 最佳選擇時機 | 需要最大相容性,或需要大量產生金鑰時 | 資料必須維持機密更長時間,且你能負擔較慢的產生流程時 |
對大多數「RSA encryption online」工作流程而言——例如加密小量資料、封裝對稱金鑰,或串接應用程式整合——2048 位元是正確的預設選擇。只有在確認接收端系統能接受 3072 位元,且你明確需要更大的安全餘裕時,才選擇 3072 位元。
為線上加密產生一組 RSA 金鑰對
在點擊任何按鈕之前,請先確認你打算入金鑰的應用程式或程式庫確實預期使用 SHA-256 搭配 RSA-OAEP,並接受 SPKI 公開金鑰或 PKCS#8 私密金鑰的 PEM 格式。此處的不一致是其他方面都正確的金鑰,在下游匯入失敗的最常見原因。一旦確認無誤,實際產生步驟本身並不複雜。
- 在已修補且你信任的裝置上的瀏覽器中開啟 RSA 金鑰產生器。
- 選擇 2048 位元以獲得最大相容性,或在確認接收端支援,並明確需要更強的模數時選擇 3072 位元。
- 點擊 Generate 並等待操作完成;3072 位元的產生時間會明顯較長,因為瀏覽器必須找出兩個較大的質數。
- 複製公開金鑰 PEM 區塊(以 BEGIN PUBLIC KEY 開頭),並且僅傳送給會為你加密資料的系統。
- 將私密金鑰 PEM 區塊(以 BEGIN PRIVATE KEY 開頭)直接複製到受保護的金鑰儲存區或密碼管理工具中——請勿將其貼到聊天室、版本控制系統、螢幕截圖或筆記中。
- 私密金鑰 PEM 安全儲存後,關閉分頁並清除剪貼簿紀錄。
- 使用一筆已知的明文與接收端系統進行端對端加密測試,確認解密後的結果逐位元組相符。
PEM 輸出:公開金鑰採 SPKI,私密金鑰採 PKCS#8
之所以涉及兩種 PEM 封套,是因為它們服務的對象不同。公開金鑰會被包裝為 SubjectPublicKeyInfo,其中將 RSA-OAEP 的演算法識別符、模數與指數嵌入單一 ASN.1 結構中。任何了解 RSA-OAEP 的使用者都能在沒有額外提示的情況下直接解析。私密金鑰則會被包裝為 PKCS#8,其中嵌入相同的演算法識別符,以及解密所需的私密指數與相關參數。
兩種封套都會將演算法參數宣告為 SHA-256 搭配 RSA-OAEP,因此謹慎的使用者可以直接從 PEM 中讀出演算法。此宣告並非裝飾性質:若另一端的系統預設使用 PKCS#1 v1.5 填補或 SHA-1,它仍可能接受這些金鑰進行匯入,但在實際加密呼叫時會失敗。匯入成功並不代表相容性已驗證通過——你需要執行下方所述的來回測試(round-trip test)來加以確認。
分發公開金鑰並妥善保護私密金鑰
公開金鑰的設計目的就是要被分享。任何持有公開金鑰的人,都能加密只有你的私密金鑰能解密的資料,但若沒有私密金鑰,他們就無法從過去或未來的密文中還原任何內容。將公開金鑰想像成一把鎖——任何人都能把訊息放進這個箱子,但只有你擁有開箱的鑰匙。
私密金鑰的情況則恰好相反。任何取得私密金鑰的人,在你更換金鑰之前,都能解密所有傳送給它的密文,無論是過去或未來的。產生器會將其匯出為未加密的 PKCS#8 格式——瀏覽器並不會額外套用密碼保護層。這是刻意的設計:Web Crypto 將原始位元組交由你自行處理,保護措施則落實於儲存層。請立即將其移入由硬體支援的金鑰儲存區、雲端密碼管理工具,或具有嚴格存取控制與備份機制的本機加密儲存區。請勿將其提交至版本控制、貼到工單或聊天室,或留在瀏覽器同步紀錄中。
若私密金鑰曾經遭到洩漏——即使是短暫的——請立即更換:產生新的金鑰對,分發新的公開金鑰,並停止接受以舊公開金鑰加密的密文。
在實際信任金鑰之前進行端對端加密測試
「我的 RSA 金鑰無法使用」這類抱怨的最大單一來源,是 PEM 雖然匯入成功,但其中一端的演算法參數錯誤。產生器本身透過以下方式驗證正確性:使用公開金鑰加密一筆已知的 UTF-8 訊息,並以私密金鑰確認能完整還原,接著將兩個 PEM 重新匯入 Web Crypto,確認匯入後回報的演算法模數長度符合預期。你應對接收端系統執行同樣的測試。
在接收端使用公開金鑰加密一筆小型的固定明文(例如字串 RSA encryption online round trip),將密文送回後以私密金鑰解密。若還原的位元組完全相符,並能解碼回原本的 UTF-8 字串,則代表雙方對 RSA-OAEP、SHA-256、標籤 (label) 與遮罩產生方式達成共識。若有任何差異,請在將該金鑰用於實際生產流量之前先修正參數。
RSA 線上加密無法做到的事
RSA 只能加密相對於模數而言較小的訊息。RSA-OAEP 的最大明文大小為模數長度(以位元組為單位)減去兩倍雜湊輸出長度再減二,此定義載於 RFC 8017。對 2048 位元搭配 SHA-256 來說,代入計算為 256 − (2 × 32) − 2 = 190 位元組;對 3072 位元搭配 SHA-256 則為 384 − (2 × 32) − 2 = 318 位元組。因此真正的系統會先用 RSA-OAEP 加密一把小的隨機對稱金鑰,再用經過認證的對稱加密來保護實際資料,這種模式你可以搭配此產生器,使用 AES 線上加密 頁面來實作。請勿將大型檔案分割成原始的 RSA 區塊;本工具刻意不自行發明混合檔案格式,而手寫的分割器正是填充預言攻擊(padding-oracle attack)開始發生的地方。
此產生器也不是憑證授權單位(CA)。它只產生 RSA-OAEP 加密金鑰 — 不包含 X.509 憑證、CSR、簽章(RSA-PSS)、SSH 金鑰,也沒有 JSON Web Keys。如果你需要身分識別或 TLS,請改用所屬平台提供的金鑰產生流程,或使用硬體安全模組(HSM)。
下表整理了本工具所提供與未提供的能力,讓你在實際依賴某把金鑰處理真實流量之前,能先確認其限制。
| 能力 | 本工具是否提供 |
|---|---|
| RSA-OAEP 加密金鑰對產生 | 是 |
| 2048 位元與 3072 位元模數 | 是 |
| 僅使用公開指數 65537 | 設計上固定 |
| SHA-256 雜湊,RSA-OAEP 填充 | 設計上固定 |
| SPKI PEM 公開金鑰、PKCS#8 PEM 私密金鑰 | 是 |
| 產生時的往返加解密驗證 | 是 |
| 1024 位元模數或自訂公開指數 | 否 |
| RSA-PKCS#1 v1.5 填充或原始 RSA | 否 |
| 以密碼加密的私密金鑰封套 | 否 — 請將位元組移至你自己的金鑰儲存庫 |
| RSA-PSS 簽章、X.509、CSR、SSH 金鑰、JWK | 否 |
| 大型檔案分割器或混合檔案容器 | 否 — 加密的是金鑰,而非檔案本身 |
實作上採用固定的安全預設值,其理由相同:不提供 1024 位元金鑰、不提供自訂公開指數、不提供原始 RSA、不提供 PKCS#1 v1.5 加密,也不使用 SHA-1。限制這些選項可以降低產生出「現在能用、明天卻外洩」的金鑰的機率,同時也讓驗證測試保持簡明。
如果你正在權衡各種選項,Android 瀏覽器上的 AES 線上加密:逐步操作指南 有詳細說明。