+ 作る
図を読み込んでいます…
1 / 13
図でつながる 認証と暗号の基礎 / 全11章

公開鍵暗号 ― 配ってよい鍵と、手放さない鍵

発行
かえで
版
第2版
改訂
分量
13コマ・4,928字

配っても困らない公開鍵と、持ち主が手放さない秘密鍵。南京錠のたとえから鍵ペア、暗号化と復号、送り主が分からない理由、鍵のすり替えまで、動く図で順に確かめます。

配っても困らない鍵があったら

前の章の共通鍵暗号では、送る人と受け取る人が同じ鍵 K を持っていれば、速く確実に本文を隠せました。残った問題は、その K を最初にどうやって相手へ届けるかです。図のように、アオイとボブのあいだの通り道は、盗み見る人に見られているかもしれません。K をそのまま送れば、盗み見る人も同じ K を手に入れてしまいます。

そこで発想を変えてみます。もし「誰に見られても、誰に配っても困らない鍵」があったらどうでしょう。見られて困らないなら、通り道が危なくても堂々と送れます。

この章で扱う公開鍵暗号は、まさにその考え方でできています。鍵を二つに分けて、一方は配ってよい鍵、もう一方は持ち主が手放さない鍵にするのです。まずは身近な道具のたとえから見ていきます。

  • 配っても困らない鍵があったら
  • 鍵
  • 共通鍵 K
  • 人
  • どう渡す?
  • 人
  • 開いた錠
  • 開いた錠
  • 開いた錠
  • 通り道は見られているかも
  • アオイ
  • ボブ
  • 人
  • 注意
  • 盗み見る人
  • 前の章に残った問題:同じ鍵をどう届けるか

開いた南京錠を、たくさん配る

ボブが、開いた状態の南京錠をたくさん用意したと考えてください。南京錠は、開いたまま掛け金を押し込めばカチッと閉まります。閉めるのに鍵は要りません。ところが、閉まった南京錠を開けるには、ボブが手元に持っている鍵が必要です。

ボブはこの開いた南京錠を、アオイにも、ほかの人たちにも配ります。図の青い南京錠が、ボブのところから散らばっていく様子を見てください。盗み見る人の手に一つ渡ってもかまいません。南京錠でできるのは閉めることだけなので、持っていても何も開けられないからです。

一方、赤い鍵はボブの足もとから動いていません。配るのは南京錠だけで、開けるための鍵は誰にも渡さない。これが、この章の主役になる仕組みの骨組みです。アオイの手もとには、ボブへ送りたい手紙があります。

  • 開いた南京錠を、たくさん配る
  • 人々
  • 開いた錠
  • 人
  • ほかの人たち
  • 開いた錠
  • 人
  • アオイ
  • ボブ
  • 書類
  • 鍵
  • 手紙
  • 開いた錠
  • 人
  • 注意
  • 手元の鍵
  • 盗み見る人
  • 閉めるのに鍵は要らない。開けるにはボブの鍵が要る

閉めるのは誰でも、開けるのはボブだけ

アオイはボブへ手紙を送りたいので、手紙を箱に入れ、もらった南京錠をカチッと閉めます。図では青い南京錠が閉じた形に変わり、手紙と一緒にボブのもとへ運ばれていきます。

途中で盗み見る人が箱を見つけても、開けられません。盗み見る人も同じ形の南京錠を持っていますが、それは閉めるための道具で、開けるための鍵ではないからです。箱が届いたら、ボブは手元の赤い鍵で南京錠を開け、手紙を読みます。

ここで注目したいのは、アオイとボブが前もって何も共有していないことです。前の章では、同じ鍵 K を二人が先に持っている必要がありました。南京錠の方法なら、ボブが開いた南京錠を配っておくだけで、誰でもボブ宛ての箱を閉められます。

  • 閉めるのは誰でも、開けるのはボブだけ
  • 人々
  • 開いた錠
  • 人
  • ほかの人たち
  • 錠
  • 人
  • 書類
  • 手紙
  • アオイ
  • 鍵
  • ボブ
  • ボブの鍵で開く
  • 開いた錠
  • 人
  • 注意
  • 開けられない
  • 盗み見る人
  • アオイとボブは、前もって何も共有していない

本当の鍵は、対応する数の組

南京錠のたとえは分かりやすいのですが、限界もあります。実際の公開鍵暗号に、物としての南京錠はありません。使われるのは、数学的な関係で結ばれた大きな数の組です。図では、青い南京錠が「ボブの公開鍵」に、赤い鍵が「ボブの秘密鍵」に姿を変えました。

公開鍵は配ってよい鍵、秘密鍵は持ち主だけが守る鍵です。ボブは専用の計算で、この二つを一緒に作ります。片方だけを後から作ることはできず、二つで一組の「鍵ペア」になります。NIST の用語集でも、公開鍵暗号は二つの別々の鍵を使う暗号(非対称暗号)と説明されています。

二つの鍵は対応していますが、同じ値のコピーではありません。共通鍵暗号の K は二人がまったく同じ値を持ちましたが、公開鍵と秘密鍵は値も役割も違います。暗号化に使う方式なら、公開鍵で閉じたものを、対応する秘密鍵だけが開けられる、という関係で結ばれています。

  • 本当の鍵は、対応する数の組
  • 鍵
  • ボブの公開鍵
  • たとえ:南京錠と鍵
  • 人
  • 人
  • アオイ
  • 実際:対応する大きな数の組
  • 数学的に対応
  • ボブ
  • 鍵
  • ボブの秘密鍵
  • 二つは対応するが、同じ値のコピーではない

公開鍵から秘密鍵は求められない

公開鍵は誰にでも配ります。それなら、公開鍵をじっくり調べて、秘密鍵を計算で割り出せないのでしょうか。公開鍵暗号が成り立つのは、それが現実的な時間ではできないように作られているからです。

代表的な方式の RSA を例にします。RSA では、二つの大きな素数 p と q を掛け合わせた数 n が公開鍵に含まれます。掛け算は一瞬で終わりますが、n だけを見て元の p と q を探す「素因数分解」はとても難しい作業です。15 なら 3 × 5 とすぐ分かりますが、よく使われる 2048 ビットの RSA では n は10進数でおよそ617桁になり、今のコンピュータでは現実的な時間で分解できません。秘密鍵は p と q を知っていれば計算できるので、それを作れるのは鍵ペアを作ったボブだけです。

図の赤い矢印は、公開鍵から秘密鍵へは計算で戻れないことを表しています。方式によって頼っている数学は違いますが、「一方向には簡単、逆向きは現実的に無理」という性質を使う点は共通しています。

  • 公開鍵から秘密鍵は求められない
  • かけ算 p × q → n
  • 鍵
  • ボブの公開鍵
  • 一瞬で終わる
  • 人
  • 人
  • 素因数分解 n → p × q
  • NG
  • アオイ
  • 617桁では現実的に無理
  • 求められない
  • ボブ
  • 書類
  • 平文
  • 鍵
  • ボブの秘密鍵
  • RSA は、大きな数の素因数分解の難しさに頼っている

受け取る人の公開鍵で閉じる

ここからは、実際の暗号化の流れを図で追います。アオイがボブへ、秘密の短いデータを送りたいとします。まずボブは、自分の公開鍵をアオイに渡します。図では、青い公開鍵がボブの側からアオイの横へ移動しました。公開鍵は見られても困らないので、通り道が安全でなくてもかまいません。

アオイは受け取ったボブの公開鍵を使って、データを暗号化します。暗号化とは、鍵を使ってデータを第三者には読めない形(暗号文)に変えることでした。図の白い紙が、灰色の暗号文に変わったところです。自分の鍵ではなく、受け取る人の公開鍵で閉じる、という順番を押さえておいてください。

そして赤い秘密鍵は、ボブを囲む赤い枠の中から一歩も出ていません。暗号化のどの段階でも、秘密鍵が通り道を通ることはありません。

  • 受け取る人の公開鍵で閉じる
  • 鍵
  • ボブの公開鍵
  • 人
  • 人
  • 閉じる
  • アオイ
  • ボブ
  • 鍵
  • ボブの秘密鍵
  • 書類
  • 暗号文
  • 人
  • 注意
  • 秘密鍵は手元から出ない
  • 盗み見る人
  • 閉じるのに使うのは、受け取る人(ボブ)の公開鍵

開けるのは、ボブの秘密鍵だけ

暗号文がアオイからボブへ届きました。図で動いたのは灰色の暗号文で、秘密鍵ではありません。ボブは手元の秘密鍵を使って、暗号文を元のデータに戻します。これを復号と呼びます。図では、暗号文が白い平文に戻りました。

途中で盗み見る人が暗号文を写し取ったとしても、読むことはできません。盗み見る人がボブの公開鍵を持っていても同じです。公開鍵は閉じるための鍵で、閉じたものを開けられるのは、対応する秘密鍵だけだからです。

こうして公開鍵暗号では、鍵を配りながら、読める人をボブ一人に絞れます。前の章で困っていた「最初に同じ鍵をこっそり渡す」手間が、ここにはありません。

  • 開けるのは、ボブの秘密鍵だけ
  • 鍵
  • ボブの公開鍵
  • 人
  • 人
  • 書類
  • 平文
  • アオイ
  • ボブ
  • 鍵
  • ボブの秘密鍵
  • 人
  • 注意
  • 秘密鍵は手元から出ない
  • 暗号文の写し
  • 盗み見る人
  • 読めない

読む人は限れても、送り主は分からない

ここで一つ注意があります。ボブの公開鍵は誰にでも配っているので、誰でもボブ宛ての暗号文を作れます。図では、なりすます人もボブの公開鍵を持ち、「アオイです」と書いたデータを暗号化してボブへ送りました。

ボブは二つの暗号文を、どちらも自分の秘密鍵で問題なく開けます。開けられたということは「自分宛てに正しく閉じられていた」という意味で、「アオイが閉じた」という意味ではありません。中身に「アオイです」と書いてあっても、それは誰にでも書ける文字です。

つまり、公開鍵による暗号化が保証するのは、読める人がボブだけだということまでです。送り主が本当にアオイかを確かめるには、別の仕組みが必要になります。その代表が、第6章で扱う電子署名です。

  • 読む人は限れても、送り主は分からない
  • 鍵
  • ボブの公開鍵
  • どっちが本物?
  • 人
  • 人
  • 書類
  • アオイです
  • アオイ
  • ボブ
  • 書類
  • アオイです
  • 鍵
  • ボブの秘密鍵
  • 人
  • 注意
  • ボブの公開鍵
  • なりすます人
  • 送り主の確認は、電子署名(第6章)の仕事

計算は重く、一度に運べる量も小さい

公開鍵暗号はとても便利ですが、弱点が二つあります。一つは計算が重いことです。大きな数どうしの計算を行うため、同じ量のデータを扱うなら、共通鍵暗号のほうがはるかに速く処理できます。

もう一つは、一度に暗号化できるデータが小さいことです。たとえば 2048 ビットの RSA を、暗号化用の方式 OAEP とハッシュ関数 SHA-256 の組み合わせで使うと、一度に入れられるのは最大190バイトです。RSA の規格 RFC 8017 でも、入れられる長さは鍵の大きさで決まると定められています。数 MB の本文は、図のとおり青い公開鍵の箱には入りません。

一方、緑の矢印のように、共通鍵 K のような短い値ならすっぽり入ります。そこで実際の通信では、大きな本文は速い共通鍵暗号に任せ、公開鍵暗号はその鍵を安全に届けるような短い仕事に使います。この組み合わせ方が、次の章の主題です。

  • 計算は重く、一度に運べる量も小さい
  • 書類
  • 入らない
  • 入る
  • 大きな本文 (数 MB)
  • 鍵
  • ボブの公開鍵
  • 鍵
  • 共通鍵 K
  • 一度に190バイトまで 計算も重い
  • 例:RSA-2048 を OAEP(SHA-256)で使う場合

方式ごとに、得意な仕事が違う

「公開鍵暗号」は一つの方式の名前ではなく、鍵ペアを使う技術全体を指す言葉です。そして方式によって、できる仕事が違います。RSA-OAEP は、RSA の規格で定められた暗号化の方式です。Ed25519 は電子署名の方式で、データを暗号化する機能はありません。X25519 は、二人が通り道で値を交換して、同じ秘密の値を作る「鍵共有」の方式です。

ここまで見てきた「公開鍵で閉じて、秘密鍵で開く」は、暗号化の場面の話です。電子署名では、鍵の使い方が逆向きに見えます。

場面作る側が使う鍵受け取る側が使う鍵
暗号化受け取る人の公開鍵で閉じる受け取る人の秘密鍵で開く
電子署名署名する人の秘密鍵で署名値を作る署名する人の公開鍵で確かめる

このため、署名を「秘密鍵で暗号化すること」と覚えている人がいますが、正確ではありません。署名値は中身を隠すためのものではなく、正しい持ち主が作ったかを確かめるための値です。暗号化の機能を持たない Ed25519 でも署名ができることからも分かります。詳しくは第6章で扱います。

  • 方式ごとに、得意な仕事が違う
  • RSA-OAEP
  • 暗号化
  • Ed25519
  • 電子署名
  • X25519
  • 鍵共有
  • 「公開鍵で閉じ、秘密鍵で開く」は暗号化の話 署名は「秘密鍵で暗号化」ではない

その公開鍵は、本当にボブのもの?

公開鍵暗号には、暗号の強さとは別の弱点があります。アオイが受け取った「ボブの公開鍵」が、途中ですり替えられていたらどうなるでしょう。図では、通り道の真ん中に入り込んだ人(中間者)がボブの本物の公開鍵を受け取り、代わりに自分の公開鍵を「ボブの公開鍵」としてアオイに渡しています。

公開鍵は、見た目では誰のものか分かりません。アオイはすり替えに気づかず、中間者の公開鍵で暗号化してしまいます。すると、その暗号文を開けられるのは中間者の秘密鍵です。中間者は中身を読んだうえで、本物のボブの公開鍵で閉じ直してボブへ送ることもできます。アオイもボブも、何も気づきません。このような攻撃を「中間者攻撃」と呼びます。

このとき、暗号の計算はすべて正しく動いています。間違っていたのは「この公開鍵は誰のものか」という結び付きです。そのため、公開鍵と持ち主を信頼できる形で結び付ける仕組みが必要になります。それが第7章で扱う証明書です。

  • その公開鍵は、本当にボブのもの?
  • 鍵
  • ボブの公開鍵?
  • 鍵
  • ボブの公開鍵
  • 中身は中間者の鍵
  • 人
  • 人
  • 注意
  • 人
  • すり替え
  • 本物の公開鍵
  • アオイ
  • 中間者
  • ボブ
  • 中間者が中身を読める
  • 書類
  • 暗号文
  • 暗号は正しく動く。違うのは鍵の持ち主

量子コンピュータと耐量子暗号

将来の心配ごとにも触れておきます。量子力学の性質を使って計算する「量子コンピュータ」が十分に大きくなると、素因数分解などを効率よく解く手順(ショアのアルゴリズム)が実行できるようになります。そうなると、RSA や、楕円曲線という数学を使う今の公開鍵暗号(X25519 や Ed25519 もこの仲間です)が破られうると考えられています。今はまだそれほど大きな量子コンピュータはありませんが、今日の暗号文を保存しておいて将来解読する、という心配もあります。

そこで、量子コンピュータでも解きにくいと考えられている問題を使う「耐量子暗号」の標準化が進んでいます。NIST は2024年に、鍵を安全に共有するための ML-KEM(FIPS 203)を標準として公開しました。署名のためには ML-DSA(FIPS 204)なども用意されています。

鍵ペアを作り、公開鍵を配り、秘密鍵を守るという考え方そのものは変わりません。変わるのは、その裏で頼っている数学の問題です。

  • 量子コンピュータと耐量子暗号
  • CPU
  • 破られうる
  • RSA・楕円曲線
  • 注意
  • 量子コンピュータ (将来)
  • 移行
  • ML-KEM(FIPS 203)
  • 守られている
  • 署名には ML-DSA(FIPS 204)なども

まとめ:秘密鍵を相手に渡す必要はある?

この章では、鍵を「配ってよい公開鍵」と「手放さない秘密鍵」の二つに分ける公開鍵暗号を見てきました。二つは一緒に作られる、対応した数の組です。公開鍵から秘密鍵を計算で求めることは、現実的にはできません。暗号化では、送る人が受け取る人の公開鍵で閉じ、受け取る人が自分の秘密鍵で開きます。

では、秘密のやりとりをするために、ボブは秘密鍵をアオイへ渡す必要があるでしょうか。答えは「渡さない」です。アオイに渡したのはボブの公開鍵だけで、秘密鍵は最初から最後までボブの手元にありました。秘密鍵を誰かに渡せば、その人もボブ宛ての暗号文を読めてしまいます。秘密鍵を手放さないことが、この仕組みの安全の土台です。

一方で、公開鍵暗号は計算が重く、一度に運べる量も小さく、送り主の証明にもなりません。公開鍵が本当にその人のものかを確かめる必要もあります。次の章では、重さと小ささの問題を解くために、公開鍵暗号と共通鍵暗号を組み合わせる「ハイブリッド暗号」と「鍵共有」を見ていきます。

  • まとめ:秘密鍵を相手に渡す必要はある?
  • 鍵
  • ボブの公開鍵
  • 公開鍵だけを配る
  • 人
  • 人
  • 秘密鍵は渡さない
  • アオイ
  • ボブ
  • 鍵
  • ボブの秘密鍵
  • 秘密鍵は手元から出ない
  • 次章:公開鍵暗号と共通鍵暗号を組み合わせる

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]