RSA 暗号化・復号化ツール
オンラインRSA非対称暗号化 - 鍵ペア生成、公開鍵暗号化、秘密鍵復号化
鍵管理
RSA暗号化とは?
RSA(Rivest-Shamir-Adleman)は、1977年にMITの3人の数学者Ron Rivest、Adi Shamir、Leonard Adlemanによって発明された、世界初の広く使用された非対称暗号化アルゴリズムです。AESなどの対称暗号化アルゴリズムとは異なり、RSAは鍵ペアを使用します:公開鍵で暗号化し、秘密鍵で復号化します。公開鍵は公開できますが、秘密鍵は厳重に管理する必要があり、この仕組みにより鍵配布の問題を根本的に解決します。 RSAの安全性は、大きな整数の素因数分解の数学的困難性に基づいています。2つの大きな素数の掛け算は簡単ですが、その結果を元の2つの素数に分解することは極めて困難です。現在2048ビット以上の鍵長が推奨されており、1024ビット鍵は安全ではないとされています。量子コンピュータの発展はRSAに潜在的な脅威を与えますが、実用的な量子コンピュータはまだ存在しません。 RSAの応用场景には、HTTPS/TLSハンドシェイク時の鍵交換、デジタル署名と認証(SSH、コード署名)、メール暗号化(PGP/GPG)、ブロックチェーンのトランザクション署名などがあります。本ツールはブラウザネイティブのWeb Crypto APIを使用してRSA暗号化を実装し、すべての操作はローカルで完結します。
使い方
使い方
- 鍵サイズを選択します(2048ビット以上を推奨)
- パディング方式を選択してください(セキュリティ向上のためOAEPを推奨)
- ハッシュアルゴリズムを選択します(SHA-256を推奨)
- 「鍵ペアを生成」をクリックして公開鍵と秘密鍵を作成します
- 暗号化の場合:公開鍵を公開鍵エリアに貼り付け、平文を入力すると、暗号文が自動的に生成されます
- 復号化の場合:秘密鍵を秘密鍵エリアに貼り付け、暗号文を入力すると、平文が自動的に生成されます
- 結果をコピーするか、「スワップ」をクリックして入力と出力を交換します
パラメータガイド
- 新しい暗号化テストにはSHA-256以上を組み合わせたRSA-OAEPを使用してください。PKCS#1 v1.5は旧バージョンとの互換性が必要な場合のみ使用してください。
- RSAは小さなペイロードしか暗号化できません。大きなデータを扱う場合は、ランダムなAES鍵をRSAで暗号化し、実データをAESで暗号化する方法を使用してください。
- 秘密鍵はチャット・チケット・スクリーンショット・共有ログに掲載しないでください。公開鍵は共有可能ですが、秘密鍵は必ず厳重に管理してください。
利用シーン
仕組み
RSAは1977年のRivest-Shamir-Adleman公開鍵暗号方式です。鍵生成では2つの大きなランダム素数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の十分な大きさでの素因数分解の困難な推定に基づきます。 生のRSAは決定的で可塑性があるため、実際のすべてのデプロイメントではメッセージをパディングスキームで包みます。RFC 8017(PKCS#1 v2.2)で定義されたRSA-OAEPはMGF1によるマスク生成関数をSHA-256(またはSHA-1/384/512)で使用し、セマンティックセキュリティを提供します。同じ平文は毎回異なる暗号文に暗号化され、パディング整合性チェックにより選択暗号文攻撃を防ぎます。旧式のPKCS#1 v1.5パディングは後方互換性でまだ一般的ですが、Bleichenbacherの百万メッセージオラクル攻撃に対して脆弱です。署名については、同じ理由からPKCS#1 v1.5署名よりRSASSA-PSSが推奨されます。 鍵サイズの選択はパフォーマンスと最新の因数分解記録の両方に制約されます。NIST SP 800-57は現在2048ビット以上、2030年以降3072ビット以上を義務付けています。楕円曲線暗号はRSA 3072と同等の強度をわずか256ビット(NIST P-256、Curve25519)で実現するため、ほとんどの新しいTLSデプロイメントではECDHE + ECDSAが選好されます。2048ビット鍵のRSA-OAEPは最大⌊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 はポリシー上廃止扱いで、新規生成すべきではありません。
公開鍵と秘密鍵 - どちらが暗号化/復号しますか?
機密性目的では、公開鍵で暗号化し、秘密鍵で復号します。誰でもあなた宛てのメッセージを暗号化できますが、秘密鍵を持つ本人だけが読めます。署名はその逆で、秘密鍵で署名し、公開鍵で検証します。
同じテキストを 2 回暗号化すると暗号文が異なるのはなぜですか?
RSA-OAEP(推奨パディング方式)はランダム性を加えるため、同じ平文でも異なる暗号文が生成されます。これは選択暗号文攻撃を防ぐための仕様です。パディングなしの RSA(教科書的 RSA)は決定的で安全ではないため、使用しないでください。
なぜ RSA は AES よりはるかに遅いのですか?
RSA は大きな整数のべき剰余演算を行うのに対し、AES は小さなブロックに対する固定サイズのビット演算です。2048 ビット RSA の暗号化は AES-128 暗号化の数千倍遅くなります。実運用では RSA は小さな AES セッション鍵を包むためだけに使い、実データは AES で暗号化します。
1 つの RSA 鍵で暗号化できる最大データサイズは?
SHA-256 を用いた RSA-OAEP では、暗号化あたり (鍵長(ビット) / 8 - 66) バイト程度しか使えません:2048 ビット鍵で 190 バイト、3072 で 318 バイト、4096 で 446 バイトです。それより大きなデータを暗号化するには、AES 鍵を RSA で暗号化し、データは AES で暗号化してください。
鍵生成はランダムでローカルですか?
はい。鍵生成には Web Crypto API の crypto.subtle.generateKey を使い、OS の CSPRNG をシードにしています。鍵がブラウザの外に出ることはありません。鍵を破棄するにはページを再読み込みしてください。本番用の秘密鍵をいかなる Web ページにも貼り付けないでください。
RSA は耐量子安全ですか?
いいえ。十分な規模の量子コンピュータが Shor のアルゴリズムを実行すれば、実用的な鍵長の RSA はすべて破られます。NIST は耐量子代替(2024 年に ML-KEM、ML-DSA)を標準化しました。数十年先まで秘匿が必要なデータは移行を計画してください。短命な TLS セッションでは RSA は今のところ問題ありません。