公開鍵による RSA 暗号化
RSA 公開鍵(PEM)で短いメッセージを RSA-OAEP SHA-256、OAEP SHA-1、PKCS#1 v1.5 で暗号化。テスト用の鍵ペアもワンクリックで生成できます。処理はローカルのみです。
推奨されるパディングは OAEP です。MGF1 には同じハッシュを使います(Web Crypto や openssl pkeyutl -pkeyopt rsa_oaep_md と同じ)。
RSA で暗号化できるのは短いデータだけです。2048 ビット鍵なら最大 190 バイト(OAEP SHA-256)、214 バイト(OAEP SHA-1)、245 バイト(PKCS#1 v1.5)。長いデータは AES で暗号化し、AES 鍵だけを RSA で暗号化してください。
RSA 暗号化はランダム化されています。同じテキストを 2 回暗号化すると異なる暗号文になりますが、どちらも正しく復号できます。
すべてブラウザ内で実行されます。データがアップロードされることはありません。
RSA 暗号化とは?
PEM 形式の RSA 公開鍵(SPKI の BEGIN PUBLIC KEY、PKCS#1 の BEGIN RSA PUBLIC KEY、X.509 証明書、または公開部分を取り出す秘密鍵)で、短いメッセージや共通鍵を暗号化します。結果を復号できるのは、対応する秘密鍵の持ち主だけです。
RSA 暗号化の使い方
- 受信者の 公開鍵 (PEM) を貼り付けるか、テスト用の鍵ペアを生成(2048 ビット) をクリックして試します。
- パディング を選びます。RSA-OAEP (SHA-256) が推奨で、受信側のコードが想定するものに合わせてください。
- 平文 を入力します(AES 鍵のような生のバイト列を暗号化するなら、入力のエンコーディングを Hex に切り替えます)。
- 暗号化 をクリックし、Base64 または Hex の暗号文をコピーします。
例
"Hello RSA" with a 2048-bit public key, RSA-OAEP (SHA-256), Base64 output
A 344-character Base64 string (256 bytes) that changes on every run
RSA-OAEP はランダム化されるため固定の出力はありません。秘密鍵で復号すると「Hello RSA」が得られます。
RSA 暗号化を使うべき場面
公開鍵を持っている相手に向けて、パスワード、トークン、ランダムに生成した AES 鍵のような小さな秘密を暗号化するときに使います。大きなデータには使わないでください。データは AES で暗号化し、AES 鍵だけを RSA で暗号化する(ハイブリッド暗号)か、PGP を使いましょう。OAEP を推奨します。PKCS#1 v1.5 は、レガシーシステムが要求する場合だけにしてください。
RSA 暗号化の仕組み
RSA 暗号化は、パディング済みのメッセージに対して c = mᵉ mod n を計算します。OAEP(PKCS#1 v2.2)は、SHA-256 または SHA-1 の MGF1 とランダムなシードバイトでメッセージをマスクし、PKCS#1 v1.5 はランダムな非ゼロのパディングを前に付けます。パディングはランダム化されているため、同じテキストを 2 回暗号化しても暗号文は異なります。暗号文の長さはモジュラスと同じです(2048 ビット鍵なら 256 バイト)。メッセージの最大サイズは、OAEP で k − 2·hLen − 2 バイト、v1.5 で k − 11 バイトです(2048 ビット鍵ならそれぞれ 190・214・245 バイト)。鍵の解析と暗号化には node-forge を使い、結果は OpenSSL、Web Crypto、Node.js と相互運用できます。
一般的な使用例
- ハイブリッド暗号のテスト用に AES のセッション鍵を暗号化する
- ブラウザからの OAEP-SHA256 暗号文をバックエンドが復号できるか確認する
- 公開鍵をくれた相手に短い秘密を送る
- レガシーな API 向けに PKCS#1 v1.5 のテストデータを作成する
- RSA のメッセージサイズ上限が鍵長とパディングでどう変わるかを学ぶ
セキュリティ注意事項
鍵とメッセージはブラウザ内でのみ処理されます。自分で管理していないウェブサイトに本番の秘密鍵を貼り付けないでください。代わりにテスト用の鍵ペアを生成してください。
よくある質問
メッセージが長すぎると言われるのはなぜですか?
RSA で暗号化できるのは数百バイトまでです。2048 ビット鍵の OAEP SHA-256 では 190 バイトです。長いデータは AES で暗号化し、RSA は AES 鍵だけに使ってください。
どのパディングを選べばよいですか?
新しいシステムでは SHA-256 の RSA-OAEP です(Web Crypto の RSA-OAEP で hash: 'SHA-256'、OpenSSL なら pkeyutl -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256)。OAEP SHA-1 は多くの古いライブラリの既定です(Java の RSA/ECB/OAEPWithSHA-1AndMGF1Padding)。PKCS#1 v1.5 はレガシー互換のためだけに使います。
暗号文が毎回変わるのはなぜですか?
どちらのパディングも暗号化の前にランダムなバイトを加えます。これにより、攻撃者が候補を自分で暗号化して短いメッセージを推測することを防ぎます。
秘密鍵で暗号化できますか?
秘密鍵を貼り付けることはでき、その公開部分が暗号化に使われます。署名の意味での「秘密鍵による暗号化」は別の操作で、ここでは提供していません。