RSA 加密解密工具
線上 RSA 非對稱加密,支援金鑰對生成、公鑰加密、私鑰解密
金鑰管理
什麼是 RSA 加密?
RSA(Rivest-Shamir-Adleman)是世界上第一個廣泛使用的非對稱加密演算法,由三位 MIT 數學家 Ron Rivest、Adi Shamir 和 Leonard Adleman 於 1977 年發明。與 AES 等對稱加密演算法不同,RSA 使用一對金鑰:公鑰用於加密,私鑰用於解密。公鑰可以公開分享,而私鑰必須嚴格保密,這種機制從根本上解決了金鑰分發的難題。 RSA 的安全性基於大整數質因數分解的數學難題——將兩個大素數相乘非常容易,但將結果分解回原來的兩個素數卻極其困難。目前推薦使用 2048 位元或更長的金鑰,因為 1024 位元金鑰已被認為不夠安全。量子電腦的發展對 RSA 構成潛在威脅,但目前實用的量子電腦尚未出現。 RSA 的應用場景包括:HTTPS/TLS 交握階段的金鑰交換、數位簽章和身份驗證(如 SSH、程式碼簽章)、電子郵件加密(PGP/GPG)、區塊鏈和加密貨幣的交易簽章等。本工具使用瀏覽器原生 Web Crypto API 實現 RSA 加密解密,所有操作在本地完成。
使用方法
使用方法
- 選擇金鑰大小(建議 2048 位元或以上)
- 選擇填充方案(建議使用OAEP以獲得更好的安全性)
- 選擇雜湊演算法(建議使用SHA-256)
- 點選「生成金鑰對」建立公鑰和私鑰
- 加密時:將公鑰貼入公鑰區域,輸入明文,密文將自動生成
- 解密時:將私鑰貼入私鑰區域,輸入密文,明文將自動生成
- 複製結果或點選「交換」以交換輸入和輸出
參數指南
- 對於新的加密測試,建議使用RSA-OAEP配合SHA-256或更強的演算法;PKCS#1 v1.5僅應用於舊版相容性。
- RSA只能加密較小的負載。對於較大的資料,請使用RSA加密一個隨機的AES金鑰,然後使用AES來加密實際內容。
- 請勿在聊天記錄、工單、截圖和共用日誌中洩露私鑰。公鑰可以共用,但私鑰必須保持機密。
使用場景
技術原理
RSA 是 1977 年由 Rivest、Shamir 和 Adleman 提出的公鑰密碼系統。金鑰生成時選取兩個大的隨機質數 p 和 q,設定模數 n = p · q,計算歐拉函數 φ(n) = (p-1)(q-1),選擇與 φ(n) 互質的公鑰指數 e(e = 65537 = 2^16 + 1 是事實上的預設值,因為其低漢明權重加速了模冪運算),並透過擴展歐幾里得演算法推導私鑰指數 d ≡ e^-1 (mod φ(n))。加密為 c = m^e mod n;解密為 m = c^d mod n。安全性基於在 n 足夠大時將 n 分解為 p 和 q 的推測困難性。 原始 RSA 是確定性的且具有延展性,因此每個實際部署都會用填充方案包裹訊息。RSA-OAEP 定義在 RFC 8017(PKCS#1 v2.2)中,使用基於 SHA-256(或 SHA-1/384/512)的遮罩生成函數 MGF1,提供語意安全性:相同的明文每次加密都會產生不同的密文,填充完整性檢查可阻止選擇密文攻擊。較舊的 PKCS#1 v1.5 填充因向後相容仍很常見,但容易受到 Bleichenbacher 百萬訊息預言機攻擊。對於簽章,出於相同原因 RSASSA-PSS 優於 PKCS#1 v1.5 簽章。 金鑰大小的選擇受效能和最新分解記錄的雙重約束。NIST SP 800-57 規定目前至少 2048 位元,2030 年後至少 3072 位元。橢圓曲線密碼學在僅 256 位元(NIST P-256、Curve25519)時即可達到 RSA 3072 的安全強度,這就是為什麼大多數新的 TLS 部署偏好 ECDHE + ECDSA。RSA-OAEP 在 2048 位元金鑰上最多可封裝 ⌊keysize/8⌋ − 2·hashLen − 2 位元組的明文(SHA-256 約 190 位元組),因此生產系統僅使用 RSA 封裝新的對稱會話金鑰,再由 AES-GCM 承載實際資料——這是每次 TLS 交握中的混合模式。在瀏覽器中,Web Crypto API(window.crypto.subtle)處理金鑰生成、匯入、加密和解密,支援 PEM/DER(SPKI 用於公鑰、PKCS#8 用於私鑰)或 JWK 作為傳輸格式。
- 數學原理:選取質數 p、q;n = p·q;φ(n) = (p-1)(q-1);選取 e(通常為 65537 = 2^16+1);計算 d = e^-1 mod φ(n);加密 c = m^e mod n;解密 m = c^d mod n。
- 填充方案:新程式碼應使用 RFC 8017(PKCS#1 v2.2)的 RSA-OAEP 搭配 MGF1+SHA-256;PKCS#1 v1.5 僅用於舊版相容,受 Bleichenbacher(CVE-2017-13099 等)影響。
- 金鑰大小:NIST SP 800-57 規定目前至少 2048 位元,2030 年起至少 3072 位元;1024 位元 RSA 已被視為不安全,4096 位元的 CPU 開銷顯著增加。
- 承載上限:RSA-OAEP 最多可封裝 ⌊k/8⌋ − 2·hashLen − 2 位元組(2048 位元 + SHA-256 約 190 位元組);更大的資料使用 RSA 封裝 AES-GCM 會話金鑰。
- 等效強度:RSA 3072 ≈ ECC 256(NIST P-256 或 Curve25519),約 128 位元對稱安全性;ECC 在金鑰大小和簽章速度上勝出,RSA 在驗證速度上勝出。
- 瀏覽器 API 與格式:window.crypto.subtle.generateKey('RSA-OAEP');匯出為 SPKI PEM(公鑰)和 PKCS#8 PEM(私鑰)或 JWK;私鑰絕不能以明文形式離開本機環境。
範例
基本加密
1. 產生 2048 位元金鑰對
2. 複製公鑰
3. 輸入明文: Hello, RSA!
4. 選擇 OAEP + SHA-256
5. 輸出: Base64 編碼的密文
RFC: RFC 8017 (PKCS#1 v2.2) 定義了 RSAES-OAEP 加密方案典型流程
傳送方:
1. 取得接收方的公鑰
2. 使用公鑰加密訊息
3. 傳送密文
接收方:
1. 使用私鑰解密
2. 讀取原始訊息
說明:RSA 加密提供機密性;若要驗證真實性,需搭配 RSA 簽章(RFC 8017 中的 RSASSA-PSS)混合加密 (RSA + AES)
RSA 適用於少量資料(如工作階段金鑰)
大量資料則使用混合加密:
1. 產生隨機 AES-256 金鑰
2. 以 RSA 加密 AES 金鑰(OAEP-SHA256 上限約 190 位元組)
3. 以 AES-GCM 加密實際資料
4. 傳送 RSA 加密金鑰 + AES 密文 + IV + 驗證標籤
此方式結合 RSA 的金鑰分發與 AES 的速度,是 TLS、PGP 與 S/MIME 的標準模式。
RFC: RFC 8017 第 7.1 節討論用於金鑰封裝的 RSAES-OAEP常見問題
應該產生多大的金鑰?
RSA-2048 是目前的實務最低標準,TLS 憑證已使用多年。RSA-3072 是依 NIST SP 800-57 建議的保守值。RSA-4096 多數情境下太過頭(速度慢很多),但長期使用的簽章金鑰可考慮。RSA-1024 已被政策列為不安全,新的場合不應再產生。
公鑰與私鑰,哪一個用來加密、哪一個用來解密?
保密用途:公鑰加密、私鑰解密。任何人都能加密訊息給你,只有持有私鑰的人能讀。簽章正好相反:用私鑰簽、用公鑰驗證。
為什麼同一段文字加密兩次得到的密文會不一樣?
RSA-OAEP(建議的填充方式)會加入隨機量,使相同明文產生不同密文。這是刻意設計,可防止選擇密文攻擊。沒有填充的「教科書 RSA」是確定性的而且不安全,不應使用。
為什麼 RSA 比 AES 慢這麼多?
RSA 做的是大整數模冪運算;AES 做的則是小區塊上的固定位元運算。一次 2048 位元的 RSA 加密比 AES-128 慢上千倍。實務上只用 RSA 包裹一個小的 AES 會話金鑰,再用 AES 加密實際資料。
一把 RSA 金鑰最多能加密多少資料?
使用 SHA-256 的 RSA-OAEP 每次可用容量大約是(金鑰位數/8 - 66)位元組:2048 位元金鑰約 190 byte,3072 位元約 318 byte,4096 位元約 446 byte。要加密更多就用 RSA 加密 AES 金鑰、再用 AES 加密資料。
金鑰產生是隨機且本機進行的嗎?
是。產生使用 Web Crypto API 的 crypto.subtle.generateKey,種子來自作業系統的 CSPRNG。金鑰絕不會離開瀏覽器。重新整理頁面就會丟掉並重生新金鑰;正式環境的私鑰絕對不要貼到任何網頁上。
RSA 能抵抗量子攻擊嗎?
不能。足夠大的量子電腦只要跑 Shor 演算法,就能破解任何實務金鑰長度的 RSA。NIST 已在 2024 年標準化後量子替代方案(ML-KEM、ML-DSA)。需要保密數十年的資料應規劃遷移;短期 TLS 連線目前用 RSA 仍可接受。