ToolActToolAct

RSA 暗号化・復号化ツール

オンラインRSA非対称暗号化 - 鍵ペア生成、公開鍵暗号化、秘密鍵復号化

鍵管理

公開鍵
秘密鍵
入力内容
文字数: 0
バイト数: 0
変換結果
文字数: 0
バイト数: 0

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暗号化を実装し、すべての操作はローカルで完結します。

使い方

使い方

  1. 鍵サイズを選択します(2048ビット以上を推奨)
  2. パディング方式を選択してください(セキュリティ向上のためOAEPを推奨)
  3. ハッシュアルゴリズムを選択します(SHA-256を推奨)
  4. 「鍵ペアを生成」をクリックして公開鍵と秘密鍵を作成します
  5. 暗号化の場合:公開鍵を公開鍵エリアに貼り付け、平文を入力すると、暗号文が自動的に生成されます
  6. 復号化の場合:秘密鍵を秘密鍵エリアに貼り付け、暗号文を入力すると、平文が自動的に生成されます
  7. 結果をコピーするか、「スワップ」をクリックして入力と出力を交換します

パラメータガイド

  • 新しい暗号化テストにはSHA-256以上を組み合わせたRSA-OAEPを使用してください。PKCS#1 v1.5は旧バージョンとの互換性が必要な場合のみ使用してください。
  • RSAは小さなペイロードしか暗号化できません。大きなデータを扱う場合は、ランダムなAES鍵をRSAで暗号化し、実データをAESで暗号化する方法を使用してください。
  • 秘密鍵はチャット・チケット・スクリーンショット・共有ログに掲載しないでください。公開鍵は共有可能ですが、秘密鍵は必ず厳重に管理してください。

利用シーン

ブラウザ上でRSA-OAEP鍵ペアを生成する512、1024、2048、3072、4096ビットのモジュラス長とSHA-1、SHA-256、SHA-384、SHA-512のハッシュを選択し、Web Cryptoでエクスポート可能なPEM形式の公開鍵と秘密鍵を生成します。鍵ペアはブラウザタブ内に保持され、SPKI(公開鍵)とPKCS#8(秘密鍵)のPEMブロックとしてエクスポートされます。鍵サーバーを用意せずに相互運用テストを設計するのに便利です。
短いテキストペイロードを暗号化・復号化する公開鍵を貼り付けて平文をBase64またはhexに暗号化するか、秘密鍵を貼り付けて選択した形式の暗号文を復号化します。入出力のバイト数がペイロードのサイズ問題を明らかにしてくれます。2048ビット鍵のRSA-OAEP(SHA-256)では約190バイトの平文しかラップできないためです。秘密鍵とメッセージは操作中ずっとローカルタブ内に留まります。
外部ツールなしで鍵の取り扱いをテストする公開鍵または秘密鍵のPEMブロックをコピーし、パネルを入れ替えて実験し、暗号化/復号化モードを1ページ内で切り替えられます。RSA-OAEPのセマンティクス学習、opensslとの相互運用チェック、鍵材料をマシンから出したくないローカルプロトタイプに便利です。
相互運用チェックのためにOAEPハッシュを選択するOAEP設定でSHA-1、SHA-256、SHA-384、SHA-512を切り替えて、ピアアプリケーションが使用するハッシュに合わせます。ハッシュの不一致はWeb Cryptoからの汎用「OperationError」で復号化失敗となるため、ここでペアリングを検証すればNodeのcrypto、Pythonのcryptography、Javaのjavax.cryptoサービス間で鍵を接続する際のデバッグ時間を節約できます。
暗号化前にペイロードサイズの制限を把握するRSA-OAEPは鍵のモジュラスから2*hashLen-2バイトのパディングオーバーヘッドを引いた長さより短いメッセージしか暗号化できないため、数キロバイトの塊に対して試みるとInvalidAccessErrorがスローされます。入力バイトカウンターと暗号文出力長(OAEPでは鍵のモジュラスと同じバイト数)を使ってテストが制限内に収まっていることを確認し、大きなデータは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 は今のところ問題ありません。