RSA 暗号化 / 復号

ブラウザーで RSA 鍵ペアを生成し、RSA-OAEP で暗号化・復号し、RSA-PSS または PKCS#1 v1.5 で署名し、SPKI、PKCS#8、PKCS#1 の PEM 形式間で鍵を変換します。すべて WebCrypto エンジンでローカル実行 — 鍵もメッセージもこのページから出ることはありません。
RSA の用途:小さなメッセージと署名であり、大量データではありません。RSA は 1 回の呼び出しで最大 k−2·hashLen−2 バイトまでしか暗号化できず(SHA-256 付き 2048 ビット鍵で 190 バイト)、AES より約 1000 倍遅い。実際のシステムはハイブリッド暗号化を使います:RSA がランダムな AES 鍵を包み、AES がデータを暗号化します(AES ツール参照)。このページは学習、テスト、相互運用チェックのために存在します。
法の長さ:
ハッシュ: ラベル:
PKCS#1 v1.5 の暗号化は意図的に実装していません:暗文の完全性がなく、パディングオラクル攻撃(Bleichenbacher)に落ちます。新しい設計が使うべき暗号化モードは OAEP のみです。
方式: ハッシュ:
方式: ハッシュ:
1 回の RSA 呼び出しで運べる量は? OAEP のメッセージ上限 = 鍵バイト数 − 2×ハッシュバイト数 − 2:
法SHA-256SHA-384SHA-512
1024 ビット62 バイト30 バイト0 バイト
2048 ビット190 バイト126 バイト62 バイト
3072 ビット318 バイト254 バイト190 バイト
4096 ビット446 バイト382 バイト318 バイト
署名にメッセージの上限はありません — メッセージは先にハッシュされ、署名自体は常にちょうど鍵のサイズです(2048 ビットなら 256 バイト)。
鍵強度と寿命 (NIST SP 800-57 Part 1 Rev. 5):1024 ビットは 2013 年以降新しい用途に禁止されました。2048 ビットが現行の最小値で 2030 年まで許容。3072 ビット以上が 2031 年以降の安心な選択です。8192 ビットはここでも動作しますが、ブラウザーでの生成に 1 分以上かかることがあり、現在一緒にも必要とされないセキュリティを買うことになります — 3072/4096 を推奨します。
OpenSSL 相互運用 — このページが生成する PEM はコマンドラインで往復できます:
openssl pkeyutl -encrypt -pubin -inkey pub.pem -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256
openssl pkeyutl -decrypt -inkey priv.pem -pkeyopt rsa_padding_mode:oaep ...
openssl dgst -sha256 -sign priv.pem -out msg.sig msg.txt(PKCS#1 v1.5) /  openssl dgst -sha256 -verify pub.pem -signature msg.sig msg.txt
PSS:両方の dgst 呼び出しに -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 を追加。鍵形式の変換:openssl rsa -in key.pem -RSAPublicKey -out pubkey.pem がディスク上で SPKI ↔ PKCS#1 を行い、このページはブラウザー内で行います。
セルフテスト
独立したアンカーに対してページのエンジンを実行します:3 つの法長での鍵生成、OAEP 暗号化/復号ラウンドトリップ、複数ハッシュにわたる PSS と PKCS#1 v1.5 の署名/検証、バイト単位の決定論的 v1.5 署名ベクトル(独立したネイティブ実装で生成)、このページが復号/検証しなければならない OpenSSL が生成した固定の OAEP 暗文と PSS 署名(相互実装の相互運用)、PEM 形式変換のラウンドトリップ、そして陰性テスト(改ざんされた署名、間違った鍵は失敗しなければならない)。どこにも送信されません。
RSA 暗号化と署名をゼロから解説
一言で言えば:RSA は公開鍵暗号です — 誰でも公開鍵であなたに暗号化したり署名を検証できますが、復号や署名ができるのは秘密鍵だけ — そしてその安全性は、2048 ビットの数を 2 つの素数に素因数分解することが現存するどのコンピューターにも不可能だという事実の上に成り立っています。
RSA が実際に計算するもの

2 つの素数とトラップドア。RSA の鍵は 2 つの大きなランダム素数 p と q から始まります。その積 n(法、「2048 ビット鍵」の由来)は指数 e(ほぼ常に 65537)と一緒に公開鍵として公開されます。秘密鍵は d — p と q から計算される e のモジュラー逆数 — のペアに、秘密鍵操作を 4 倍速くする素数由来のショートカットを加えたものです。

暗号化と署名は同じべき乗です。メッセージブロック m の暗号化は me mod n の計算、復号は cd mod n。秘密指数で事前整形されたブロックに署名し、公開指数で検証するのは、逆方向の同じ操作です。このページの他のすべて — OAEP、PSS、PKCS#1 — は、生のべき乗が露出しないようそのブロックを安全に整形することに関わっています。

なぜ遅いのか。2048 ビット鍵での 1 回の RSA 操作は、AES で 1 ブロック暗号化するよりおよそ 100 万倍の CPU を消費します。だからこそ TLS は RSA(または ECC)をランダムな AES 鍵の合意だけに使い、その後切り替えます。あなたが何をbuildしても同じ規則です:鍵には RSA、データには AES。

鍵のサイズ。法の長さがセキュリティのダイヤルです:1024 ビットはポリシー上破られた(素因数分解が国家規模の手の届く範囲)、2048 ビット ≈ 112 ビットの対称強度、3072 ビット ≈ 128 ビット、15360 ビットなら 256 ビットの対称鍵に匹敵します。ポスト量子の注記:Shor のアルゴリズムは大きな量子コンピューターで RSA をまるごと破ります — 鍵の寿命を有限に保つもう 1 つの理由です。

OAEP:使うべき唯一の暗号化パディング

生の RSA の問題。教科書 RSA(生メッセージへの me mod n)は決定論的で可鍛です:同一メッセージは同一に暗号化され、攻撃者は暗文に 2 の暗号化を掛けて平文を 2 倍にでき、短いメッセージは中間者攻撃に落ちます。直接使ってはいけません。

OAEP の仕事。OAEP(PKCS#1 v2、RFC 8017)はべき乗の前に、メッセージをランダムシードとハッシュベースの Feistel ネットワークで混ぜます。結果:暗号化はランダム化され(同じ平文でも毎回違う暗文になる — OAEP のサンプルを 2 回実行して比べてください)、改ざんは復号時に検出され、メッセージはハッシュ分の余裕を持って法の中に収まらなければなりません — 上に表にした k−2·hashLen−2 の上限です。

ラベル。パディングに結び付けられる任意の公開文字列です。両側が同一のラベルを渡さなければ復号は失敗します — AES-GCM の AAD のように、暗文を文脈(ファイル名、アルゴリズム ID)に結び付けられます。空が普通です。

PKCS#1 v1.5 暗号化は意図的に存在しません。1993 年代のパディングは完全性がなく、復号エラーの挙動を通じて情報を漏らします(Bleichenbacher の 1998 年の攻撃はパディングオラクルを数百万の細工した暗文で完全な復号に変えました。2017 年の ROBOT として今も実システムを破っています)。WebCrypto は実装を拒否し、このページもそうです。

PSS 対 PKCS#1 v1.5 署名

署名 = ハッシュ、パディング、べき乗。両方式ともメッセージをハッシュし(ここでは SHA-256/384/512)、ダイジェストをブロックに整形し、秘密指数を適用します。検証は公開鍵でブロックを再整形して比較します。違いは整形の方法です:

方式ブロックの内容性質
RSASSA-PKCS1-v1_5ダイジェスト + digest-info ヘッダー、決定論的同じメッセージの署名は毎回バイト同一です(セルフテストを確認:v1.5 ベクトルは固定)。レガシー対応は普遍的:X.509 証明書、JWT RS*、TLS 1.3 未満。検証が正しく実装されていれば既知の偽造はありません。
RSA-PSSダイジェスト + ハッシュ長のランダムソルト、MGF1 マスキングランダム化 — 署名は毎回異なります。ランダムオラクルモデルで証明可能な安全性。TLS 1.3 以降の証明書と新しいプロトコルで必須。検証者はソルト長を知っている必要があります(このページは一般的な既定値であるハッシュ長を使います)。

どちらを選ぶか。新しい設計:PSS。既存の証明書、JWT(RS256)、古い相手との相互運用:v1.5。署名方式としてはどちらも安全です — v1.5 の災害物語は*暗号化*パディングの話で、名前は似ていますが別の構造です。

PKCS#1 対 PKCS#8 対 SPKI:同じ鍵に 4 つの PEM がある理由

PEM は単に DER を base64 で包んだものです。PEM ファイルはラベル + DER(バイナリ ASN.1)構造の base64。ラベルがどの構造かを告げます — それがこのページが生成する 4 形式の違いのすべてです:

PEM ラベルDER 構造内容
-----BEGIN PUBLIC KEY-----SubjectPublicKeyInfo(SPKI)アルゴリズム OID + 公開鍵(n、e)。どこでも既定の「公開鍵」。
-----BEGIN RSA PUBLIC KEY-----PKCS#1 RSAPublicKey素の(n、e)。古い OpenSSL と一部の組み込みスタック。
-----BEGIN PRIVATE KEY-----PKCS#8 PrivateKeyInfoアルゴリズム OID + 秘密鍵。アルゴリズム非依存のコンテナ、現代の既定。
-----BEGIN RSA PRIVATE KEY-----PKCS#1 RSAPrivateKeyn、e、d、p、q、…。古典的な OpenSSL の genrsa 出力。

同じ鍵、別の包み。生成後の上の 4 つのボックスはすべて同じ鍵ペアを保持します — SPKI と PKCS#1 公開鍵は同一の n、e を含み、PKCS#8 と PKCS#1 秘密鍵は同一の秘密値を含みます。このページはブラウザー内で損失なく相互変換します(セルフテストが変換をラウンドトリップします)。形式の混同は、ツール間で鍵を貼り付けるときの「無効な鍵」エラーの単一最大の原因です。

暗号化された PEM(-----BEGIN ENCRYPTED PRIVATE KEY-----)はパスワードベースの暗号化層付きの PKCS#8 です。このページは受け付けません — 先にオフラインで復号してください(openssl pkcs8 -in enc.pem -out plain.pem)。

よくある間違い
  • 大量データを RSA で暗号化する。OAEP のサイズ上限を超えた途端に、ばかげて遅くなります。パターンはこうです:ランダムな AES 鍵を生成し、AES 鍵を RSA-OAEP で暗号化し、データを AES-GCM で暗号化し、両方の部品を送る。
  • 「テストだから」と秘密鍵を配布する。このページのベクトルに埋め込まれたサンプル鍵は意図的に公開されています — テストデータにしか署名できません。あなたの鍵はそうではありません。
  • 秘密鍵で検証する。数学的にはたいてい「動き」、許すツールもありますが、検証者に秘密鍵を配るのはモデル全体を台無しにします。公開鍵で検証してください(このページは強制します)。
  • コードのチェックに署名をバイト比較する。PSS(と OAEP)はランダム化されています:2 回の正しい実行は異なる出力を生成します。等しさではなく検証で比較してください。決定論的なのは v1.5 署名だけです。
  • 「速いから」と 1024 ビット鍵を使う。資金力のある素因数分解の手の届く範囲でもあります。速度の議論はハイブリッド暗号化で死にました:RSA はバイトごとではなくセッションごとに 1 回しか走りません。
  • PSS のソルト長をハッシュ長以外にハードコードする。検証者が同意する必要があります。ハッシュ長(このページの選択と OpenSSL の -sigopt rsa_pss_saltlen:32)が相互運用可能な既定です。
よくある質問

「鍵違い、ハッシュ違い、または暗文の破損」で復号に失敗したのはなぜ?OAEP の復号は、一致する秘密鍵でない、ハッシュが暗号化側と異なる、ラベルが異なる、暗文の 1 バイトが変わった、のいずれかで失敗します。エラーはすべてのケースで意図的に同一です — どのチェックが失敗したかを明かすこと自体がパディングオラクルの漏洩です。

秘密鍵から公開鍵を取り出せますか?はい — 秘密鍵の形式にも n と e が含まれます。このページは生成後に両方を表示します。OpenSSL なら openssl pkey -in priv.pem -pubout です。

なぜ指数が 65537 なのですか?素数で、1 のビットが 2 つだけ(高速べき乗)、e=3 を襲う低指数攻撃を避けられる十分な大きさです。1990 年代以来の標準的な選択で、「奇妙な」指数はたいてい弱い鍵か非標準の鍵を意味します。

量子コンピューターで RSA は死にましたか?まだです — 2048 ビットの法で Shor のアルゴリズムを実行できるマシンは存在しません。しかし 2030 年代以降も秘密であり続けるべきデータは既に移行が始まっています。PQC ハイブリッド方式がエンジニアリングの答えです。

openssl rsautl は?pkeyutl の非推奨の祖先です。既定で v1.5 暗号化パディングを使う — 廃止されたもう 1 つの理由です。