RSAキーペア解説: 公開鍵、秘密鍵、そしてそれぞれの役割

RSA鍵の公開鍵側と秘密鍵側が実際に何をするのか、暗号化と署名の違い、鍵長が重要な理由、そしていつ代わりにEdDSAを選ぶべきかを解説します。

ssh-keygenを実行したり、JWT用の署名鍵を生成したりすると、2つの かたまりが得られます。自由に配ってよいと言われる公開鍵と、命がけで 守れと言われる秘密鍵です。この非対称性こそがRSAの要点ですが、 どちらが何をするのかを明確に把握しないまま、何年も鍵を使い続けて しまいがちです。ルールは単純で、これを正確に押さえておけば、実際に 痛い目を見る間違いを防げます。

2つの鍵、1つの数学の問題

対称暗号は1つの共有された秘密を使います。同じ鍵が施錠と解錠を 行います。RSAは非対称です。数学的に結びついたペアを生成し、 一方の鍵が行ったことは、もう一方の鍵だけが元に戻せます。両者は 大きな数(モジュラス)から作られ、この数は2つの大きな素数の積です。 安全性は労力の単純な非対称性に依拠します。素数を掛け合わせるのは ごく簡単ですが、モジュラスを再び素数へ素因数分解するのは、適切な 大きさでは事実上不可能です。公開鍵は共有できます。それを知っても 素数は明らかにならないからです。秘密鍵は、その素数を秘密裏に知って いる側です。

暗号化署名ハッシュという言葉が互いに置き換え可能なように 感じられるなら、そうではありません。 ハッシュ化、暗号化、エンコーディング の区別は、次の部分へ進む前にしっかり押さえておく価値があります。 RSAはこの3つのうち2つを行い、人々はしばしばそれらを混同するからです。

2つの演算、そしてどの鍵がどこに使われるか

RSAは2つの異なる演算をサポートし、それらは鍵を逆方向に使います。 ここが最も混同されやすい点なので、率直に述べておく価値があります。

  • 暗号化 — 誰でも公開鍵で暗号化でき、秘密鍵を持つ人だけが 復号できます。これが誰か秘密を送る方法です。相手の公開鍵が それを施錠し、相手の秘密鍵がそれを開きます。
  • 署名 — 所有者が秘密鍵で署名し、誰でも公開鍵で検証します。 これはメッセージが鍵の所有者から来たもので、改ざんされていない ことを証明します。メッセージを隠すことはしません。署名は 真正性であって、機密性ではありません。

この鏡写しが人々を惑わせます。暗号化は公開鍵を使い、署名は秘密鍵を 使います。覚えておくのに役立つ方法があります。秘密鍵はあなただけが 持つ鍵なので、あなただけが行えるべき演算、つまりあなた宛のメッセージを 復号することと、あなたとして署名することが、秘密鍵の演算です。

鍵長、そして2048が下限である理由

RSAの安全性は、ビットで測られるモジュラスの大きさとともに増します。 今日の実用的な基準は2048ビットです。3072や4096はより多くの余裕を 与えますが、演算が遅くなり鍵が大きくなる代償を伴います。1024以下は 破られたものと見なされ、置き換えるべきです。増加は線形ではありません。 3072ビットのRSA鍵は強度の面でおおよそ128ビットの対称鍵に相当し、これが 鍵が与える保護に比べてこれほど大きく感じられる理由の一つです。

そのかさばりがRSAの主な欠点であり、下記の代替手段の理由でもあります。

RSAが登場する場所

RSAキーペアは、日常のいくつかの場面で出会います。

  • TLS — 歴史的にはサーバーのRSA鍵がハンドシェイクを認証していました (現代のTLSは交換そのものにますます楕円曲線鍵を使います)。
  • SSHssh-keygen -t rsaは、その公開鍵側をauthorized_keysに 貼り付けることになるペアを生成します。
  • JWTRS256アルゴリズムはRSA秘密鍵でトークンに署名し、公開鍵を 持つ誰もがそれを検証できるようにします。この方式は JWT署名アルゴリズムで代替手段と 比較されています。

RSA対楕円曲線の選択肢

署名に関して、RSAはもはや当然の既定ではありません。EdDSA(Ed25519)と ECDSAは、はるかに小さい鍵で同等の安全性に達し(Ed25519鍵は32バイトで あるのに対し、相当するRSA鍵は数百バイトです)、より速く署名します。 今日のRSAの利点は、ほとんどが互換性です。一部の古いシステムはRSAしか 話さず、RSAは直接暗号化できる一方、EC方式は署名専用です(そこでの 暗号化は鍵交換のステップを経ます)。レガシー制約のない新しい署名鍵 であれば、通常はEd25519がより良い選択です。スタックの何かがRSAを 要求するときにRSAを選んでください。

実際に目にするPEM形式

鍵はPEMとして保存されます。-----BEGIN ... -----マーカーで包まれた base64です。ヘッダーがそのレイアウトを教えてくれます。BEGIN PUBLIC KEYBEGIN PRIVATE KEYは、アルゴリズム識別子を鍵とともに保持する現代的な PKCS#8/SPKIエンコーディングです。BEGIN RSA PRIVATE KEYは、RSAに特化した より古いPKCS#1形式です。これらは同じ鍵を異なる封筒に入れており、だから ツールが時々それらの間の変換を求めるのです。base64そのものは単なる エンコーディングであり、誰でも読めて保護はありません。したがって秘密鍵 PEMは、それを取り巻くファイル権限とパスフレーズの分だけしか安全では ありません。

注意すべき点

ここでは、ほとんどのツールよりも正直な限界のほうが重要です。

  • RSAを自分で実装しないでください。 正しいパディング(暗号化には OAEP、署名にはPSS)のない教科書的なRSAは攻撃可能です。検証済みの ライブラリと正しいパディングモードを使ってください。
  • 公開鍵はTLSを省略してよい許可証ではありません。 誰かの公開鍵に ペイロードを暗号化すると、そのペイロードは保護されますが、接続の 残りは保護されません。
  • 秘密鍵を守り、ローテーションしてください。 秘密鍵の唯一の保護は 秘匿性です。ひとたび漏洩すれば、それがこれまで守ってきたすべての 署名と復号が危険にさらされ、数学を撤回する方法はありません。

何もインストールせずに本物のペアの2つの側を見るには、当サイトの RSAキーペアジェネレーターがブラウザ内でペアを 1つ作成するので、上で説明したPEM構造を確認できます。使い捨ての ペアを生成し、PUBLIC/PRIVATEマーカーがどこに落ちるかを見れば、 この記事の残りはもはや抽象的ではなくなります。