RSA 鍵ペアジェネレーター

RSA 公開鍵・秘密鍵ペアを PEM フォーマット(PKCS#1 / PKCS#8)で生成。JWT 署名鍵・SSH テスト・単発の暗号化用。本番鍵は OpenSSL を推奨。

Loading…

すべての処理はブラウザ内で実行されます — ファイルや入力はサーバへ送信されません。

使い方

鍵長(2048・3072・4096 ビット)と秘密鍵の形式(PKCS#1 — OpenSSH の歴史的既定、または PKCS#8 — 現代の相互運用既定)を選び、Generate をクリックすると公開鍵・秘密鍵・SHA-256 フィンガープリントが表示されます。秘密鍵は「表示」トグルの裏に隠されるため、画面共有中に同僚が肩越しに見ても拾われません。両鍵は PEM エンコードで、`-----BEGIN ... KEY-----` ブロック形式は TLS ツール・SSH クライアント・JWT ライブラリが揃って受け入れます。

非本番の場面で使ってください。JWT を HS256 から RS256 に移行するテスト、テスト用 Webhook の署名、使い捨て VM 用の SSH 鍵、RSA で暗号化したペイロードの往復学習などです。本番鍵は実際に使うマシン上で生成すべきです。単発なら `openssl genrsa -out key.pem 4096`、SSH なら `ssh-keygen -t rsa -b 4096`、価値の高い鍵にはハードウェア HSM / KMS を使ってください。本ツールのブラウザ側は `node-forge` を使い、RSA 鍵生成をローカルで実行します。秘密鍵がサーバに触れることはありません。ただし、ウェブページ内で動く CSPRNG は、ハードニングされたマシン上の OpenSSL より監査が難しい点に留意してください。

既定の 2048 ビット、PKCS#8

入力
size:   2048
format: PKCS#8
出力
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
-----END PUBLIC KEY-----

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSk...
-----END PRIVATE KEY-----

Fingerprint: 9b:3a:...:ef:cd

2048 ビットは NIST が 2030 年まで非機密用途で許容する現行の下限です。PKCS#8 ラッパー(`BEGIN RSA PRIVATE KEY` ではなく `BEGIN PRIVATE KEY`)は、同じ鍵を OpenSSL、Java キーストア、.NET、ほとんどの JWT ライブラリで変換なしに使えるようにします。フィンガープリントは SPKI エンコードされた公開鍵に対する SHA-256 で、どこかにピン留めする前に「これが生成した鍵だ」と帯域外で確認するのに役立ちます。

長期使用の署名鍵用に 4096 ビット

入力
size:   4096
format: PKCS#1
出力
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

本番運用が 5 年以上にわたる鍵(署名用 CA ルート、長期運用の JWT 発行者など)には、4096 ビットが保守的な選択です。NIST は 2048 ビットを対称鍵 112 ビット相当、4096 ビットを 152 ビット相当と推定しており、アルゴリズム改良に対する余裕を数十年単位で確保できます。PKCS#1(`RSA PRIVATE KEY` 形式)は古い OpenSSH や、一部の組み込み TLS スタックが期待する形式です。現代のスタックは両方を受け入れるため、選べるなら PKCS#8 を選んでください。

PKCS#1 ↔ PKCS#8 の変換

入力
# convert PKCS#1 → PKCS#8
openssl pkcs8 -topk8 -nocrypt \
  -in key-pkcs1.pem \
  -out key-pkcs8.pem

# the other direction
openssl rsa \
  -in key-pkcs8.pem \
  -out key-pkcs1.pem -traditional
出力
(same key, different wrapper bytes — fingerprint stays identical)

既に片方の形式の鍵があり、もう片方が必要な場合は、OpenSSL で再生成なしに双方向に変換できます。SPKI エンコードされた公開鍵のフィンガープリントはどちらの形式でも同じで、変わるのは秘密鍵の *ラッピング* のみです。対応する公開鍵(どちらも `BEGIN PUBLIC KEY`)はバイト単位で同一です。

よくある質問

鍵長はどれくらいが必要ですか?

NIST SP 800-57 Part 1 Rev 5(2020 年)は目標有効期間を示しています。**2048 ビット** は 2030 年までの保護に許容(対称鍵 112 ビット相当)、**3072 ビット** は 2030 年以降も使用可(128 ビット相当)、**4096 ビット** は価値の高い鍵や長寿命の鍵向け(152 ビット相当)です。JWT 署名や短命の TLS には 2048 で十分です。10 年単位で持ち歩く SSH 鍵や CA ルートには 3072 か 4096 を選んでください。代償は検証速度です — 4096 ビットの署名検証は 2048 ビットより約 4 倍遅く、API 呼び出しごとに JWT を検証する場面では積み重なります。

RSA・ECDSA・Ed25519 — どれを選ぶべきですか?

両端を自分で制御する新規コードなら、**Ed25519** が既定です。鍵が小さく(32 バイト)、署名と検証が速く、ECDSA を破ってきた実装上の落とし穴(ナンス再利用など)に対しても堅牢です。**ECDSA P-256** は、NIST / FIPS 準拠が要求されて Ed25519 が承認外の場合の第二選択肢です。**RSA** はレガシー互換性で勝ちます — 古い TLS クライアント、ハードウェアトークン、古い OAuth プロバイダが公開する JWT JWK、ほぼすべての TLS 証明書チェーン — 加えて「誰でも扱い方を知っている」運用上の単純さもあります。相互運用性が決め手のときは RSA、選択の自由があるときは Ed25519 を選んでください。

同じ鍵を署名と暗号化の両方に使えますか?

機構的には可能で、RSA は両方をサポートします。しかし暗号学的・運用的にはやめるべきで、ベストプラクティス(NIST SP 800-57 Part 1 §5.6.3)は目的ごとに別の鍵を用意することです。同じ鍵で署名と暗号化を兼ねると攻撃面が広がります — 署名プロトコルの脆弱性が復号鍵の情報を漏らし得るし、その逆もあり得ます。JWT JWK が `use` フィールド(`sig` か `enc`)を明示的に持つのはこのためです。新規鍵では 2 つ生成し、それぞれにラベルを付けてください。

ブラウザで生成した鍵を実運用で使っても安全ですか?

低リスクな場面で使ってください。テスト用 JWT 署名、使い捨て VM の SSH 鍵、CI テスト用の一時 CA などです。`node-forge`(またはブラウザの WebCrypto)が使う CSPRNG は仕様が要求する `crypto.getRandomValues` で暗号学的に健全です。リスクは数学ではなく周辺環境にあります。侵害されたブラウザ拡張、改ざんされたスクリプトを差し込むネットワーク MITM、画面録画されたセッションなどから秘密鍵が漏れる可能性があり、エアギャップやハードニング済みマシン上の `openssl genrsa` ではこれらは起きません。本当に価値のあるものは対象マシンで生成し、秘密バイトを外に出さないでください。

SSH 鍵が必要です — 出力をそのまま `authorized_keys` に貼れますか?

直接は貼れません。`authorized_keys` は OpenSSH 形式(`ssh-rsa AAAAB3NzaC1yc2E... user@host`)を期待し、PEM ではないためです。変換するには、公開鍵 PEM を `key.pem` に保存し、`ssh-keygen -y -f key.pem > key.pub` で秘密鍵から OpenSSH 形式を導出するか、`ssh-keygen -i -m PKCS8 -f key.pem` で PEM 公開鍵から変換します。本当に SSH 用途なら最初から `ssh-keygen -t rsa -b 4096` で生成するのが簡単です。PEM の秘密鍵と OpenSSH の公開鍵を 1 回で得られます。

秘密鍵にパスフレーズを付けるべきですか?

ノート PC 上に置くローカル鍵にはパスフレーズを付けてください。PEM のバイト列が暗号化されるため、ディスクの盗難やファイルシステムバックアップの漏洩で鍵が直接渡ることがなくなります。一方、起動時に自動プロセスがロードするサーバ上のサービス鍵ではパスフレーズを付けないでください。同じプロセスから読める場所にパスフレーズを置く必要があり、本末転倒です。本ツールは暗号化なしの鍵を生成します。パスフレーズが必要ならコピー後に `openssl rsa -aes256 -in plain.pem -out encrypted.pem` を実行してください。

関連する概念

RSA(Rivest–Shamir–Adleman、1977 年、論文公開は 1978 年)は同じ鍵ペアで署名と暗号化を扱える非対称暗号です。安全性は 2 つの大きな素数の積を因数分解する難しさに依拠します。2048 ビット RSA 鍵は約 1024 ビットの素数 2 つの積で、その因数分解は現時点では実行不可能です。公開鍵は `(n, e)`(`e` はほぼ常に 65537)、秘密鍵は `e·d ≡ 1 (mod φ(n))` を満たす `d` を保持します。RSA の演算の大半は剰余冪乗計算で、非対称性は因数分解を知らずに `(n, e)` から `d` を導出することの難しさから生まれます。

同じ RSA 秘密鍵に対して **転送形式** が 2 種類あります。**PKCS#1**(`BEGIN RSA PRIVATE KEY`)は RSA 固有の元来の ASN.1 構造で、`modulus`・`publicExponent`・`privateExponent` などのフィールドを持ちます。**PKCS#8**(`BEGIN PRIVATE KEY`)は PKCS#1(または他のアルゴリズム)の塊をアルゴリズム非依存のエンベロープで包んだものです。PKCS#8 は現代の既定で、RSA・ECDSA・Ed25519 のいずれにも同じ鍵ファイル形式が使え、2010 年代後半以降の OpenSSL の既定出力でもあります。変換は鍵を再生成しません。ラッピングのバイトだけが変わります。

選択肢を形作る 3 つの隣接プリミティブがあります。**ECDSA**(楕円曲線デジタル署名アルゴリズム)は鍵長のごく一部で同等のセキュリティを得ます — 256 ビット ECDSA ≈ 3072 ビット RSA — が、ナンスの再利用で壊れやすく、過去にいくつかの実運用を破ってきました。**Ed25519**(Bernstein の twisted Edwards 曲線、RFC 8032)は両者の良さを兼ねた現代的選択肢で、鍵が小さく、演算が速く、ナンス再利用の地雷もありませんが、新しいぶん一部のレガシー環境では受け付けられません。**ポスト量子** アルゴリズム(KEM の CRYSTALS-Kyber、署名の CRYSTALS-Dilithium)は 2024〜2026 年に実運用へ入り始めています。十分に大規模な量子計算機が RSA・EC を破るためです。RSA は導入実績が膨大なため当面主流ですが、新規システムは Ed25519 を既定とし、次の 10 年で PQ 移行を計画してください。

関連記事

関連ツール