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

共通鍵暗号 ― 同じ鍵で閉じて開く、その鍵をどう渡す?

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

同じ鍵で閉じて開く共通鍵暗号を、動く図で追います。鍵だけを秘密にする理由、AES とモード・nonce、改ざんを見抜くタグと認証付き暗号、そして最初の鍵をどう渡すかという難所まで。

覗かれうる通信路でメモを送る

前の章では、ハッシュ関数が文書から「戻せない指紋」を作るのを見ました。指紋から元の文書は復元できないので、改ざんの確認には役立ちますが、中身を相手に届ける用途には使えません。この章で扱う 暗号化 は、正しい鍵を持つ人だけが元に戻せる変換です。ハッシュは戻せない、暗号化は鍵があれば戻せる。ここが出発点です。

場面はこうです。アオイは「会議は10時」というメモをボブに送りたいと考えています。ただ、二人をつなぐ通信路はインターネットのように途中で誰かが覗けるかもしれない道です。図の上にいる盗み見る人は、流れてくるデータをすべて写し取れるものとします。

アオイの望みは、ボブには読めて、盗み見る人には読めない形で送ることです。そのための一番基本的な道具が、この章の主役の共通鍵暗号です。

  • 覗かれうる通信路でメモを送る
  • 人
  • 注意
  • 盗み見る人
  • 人
  • 人
  • 会議は10時
  • アオイ
  • 覗かれうる通信路
  • ボブ
  • ボブには読めて、盗み見る人には読めない形で送りたい

同じ鍵 K で閉じて暗号文にする

アオイとボブは、前もって同じ秘密の値を持っておきます。これを 鍵 と呼び、図では緑の「鍵 K」のカードで表します。二人のカードは形が似ているだけの別物ではなく、まったく同じ値の写しです。

アオイは、元のメモ(平文)と鍵 K を 暗号化 の処理に入れます。出てくるのは、鍵を知らない人には意味の取れないデータで、これを 暗号文 といいます。図では白いメモが箱の中で灰色のデータに変わりました。反対に、暗号文を平文に戻す処理は 復号 と呼びます。

このように閉じる鍵と開ける鍵が同じ方式を 共通鍵暗号、または対称鍵暗号といいます。文献によっては「秘密鍵暗号」と呼ぶこともありますが、次の章で出てくる公開鍵暗号の「秘密鍵」と紛らわしいので、本書では共通鍵と呼びます。

なお、図の「7f 3a c9 1e」は説明用の飾りで、実際の計算結果ではありません。

  • 同じ鍵 K で閉じて暗号文にする
  • 人
  • 注意
  • 暗号化
  • 盗み見る人
  • 人
  • 人
  • 7f 3a c9 1e
  • アオイ
  • 覗かれうる通信路
  • ボブ
  • 鍵 K
  • 鍵
  • 同じ値の鍵
  • 鍵 K
  • 鍵
  • 平文 + 鍵 K → 暗号文(共通鍵暗号)

暗号文だけが通信路を渡る

アオイが通信路に出すのは暗号文だけです。図では灰色の暗号文が真ん中まで進み、盗み見る人の目の前を通っています。盗み見る人はこのデータをそっくり写し取れますが、鍵 K を持っていないので、中身の「会議は10時」は分かりません。

ここで見てほしいのは、緑の鍵が二人の手元から動いていないことです。鍵は暗号文と一緒に旅をせず、それぞれの手元で秘密に保たれます。南京錠にたとえるなら、箱に錠をかけて送り、開ける鍵は受け取る人が前から持っている状態です。

たとえには限界もあります。本物の箱は壊せば開きますが、よく調べられた暗号では、鍵を知らずに暗号文から平文を取り出す現実的な方法が見つかっていません。暗号文が人目にさらされても困らないのは、そのためです。

  • 暗号文だけが通信路を渡る
  • 人
  • 注意
  • 中身が読めない
  • 暗号化
  • 盗み見る人
  • 人
  • 人
  • 7f 3a c9 1e
  • アオイ
  • 覗かれうる通信路
  • ボブ
  • 鍵 K
  • 鍵
  • 鍵 K
  • 鍵
  • 鍵は手元に残し、暗号文だけを送る

ボブは同じ鍵で開く

暗号文がボブに届きました。ボブは自分の鍵 K を使って復号し、図のように灰色の暗号文が白いメモ「会議は10時」に戻ります。アオイが閉じたのと同じ鍵で開くので、ボブはほかに何も受け取らなくても読めます。

前の章のハッシュ関数との違いが、ここではっきりします。ハッシュ値は誰にも戻せませんが、暗号文は鍵を持つ人なら確実に元へ戻せます。一方で鍵を持たない人には、暗号文はハッシュ値と同じように手がかりのないデータに見えます。

共通鍵暗号の処理はとても速く、動画やファイルのような大きなデータもそのまま暗号化できます。インターネットを流れる大量の通信を実際に守っているのは、多くの場合この共通鍵暗号です。

  • ボブは同じ鍵で開く
  • 人
  • 注意
  • 暗号化
  • 盗み見る人
  • 復号
  • 人
  • 人
  • 会議は10時
  • アオイ
  • 覗かれうる通信路
  • ボブ
  • 鍵 K
  • 鍵
  • 鍵 K
  • 鍵
  • 同じ鍵 K で、元の平文に戻る

隠すのは方式ではなく鍵

暗号化の手順そのものを秘密にすれば安全だ、と考えたくなるかもしれません。現代の暗号は反対の考え方をとります。手順(方式)は世界に公開して多くの専門家に調べてもらい、秘密にするのは鍵だけにするのです。19世紀にケルクホフスが示したこの考え方は「ケルクホフスの原理」と呼ばれます。図の盗み見る人は方式を知っていますが、鍵を持たないので開けられません。

方式を隠す作戦は、プログラムを解析されたり設計書が漏れたりした時点で崩れ、作り直すのも大変です。鍵なら、漏れても新しいものに取り替えれば済みます。

鍵が秘密である以上、残る攻め方はすべての鍵を順に試す 総当たり です。鍵が128ビットなら候補は 2^{128} 通り、およそ 3.4 \times 10^{38} 個あります。1秒に1兆個試せたとしても、全部を試すには1000京年以上かかり、宇宙の年齢(約138億年)をはるかに超えます。鍵の長さが安全の土台になるのはこのためです。

  • 隠すのは方式ではなく鍵
  • 人
  • 注意
  • 方式は知っている 鍵だけが分からない
  • 暗号化(公開)
  • 盗み見る人
  • 復号(公開)
  • 人
  • 人
  • アオイ
  • 覗かれうる通信路
  • ボブ
  • 鍵 K
  • 鍵
  • 128 ビットの鍵の候補の数
  • 鍵 K
  • 鍵
  • 秘密に保つ
  • 2^{128} \approx 3.4 \times 10^{38}
  • 秘密に保つ
  • 方式は公開し、鍵だけを秘密にする

AES という名前だけでは足りない

共通鍵暗号の代表は AES です。米国の標準 FIPS 197 で定められ、データを128ビット(16バイト)ずつの ブロック に区切って変換します。鍵の長さは128・192・256ビットから選べます。

ただし AES そのものは「16バイトを16バイトに変える部品」です。長いデータを区切って、ブロックごとに同じ鍵でそのまま変換すると(ECB と呼ばれる使い方)、図の上の段のように同じ中身のブロックは同じ暗号文になります。中身は読めなくても「1つ目と2つ目は同じ」という模様が漏れてしまいます。画像をこの方法で暗号化すると、元の絵の輪郭が浮かんで見えるほどです。

そこで実際には、ブロックのつなぎ方を決める 暗号利用モード と、メッセージごとに変える値 nonce(ノンス)を組み合わせます。図の下の段のように、同じ中身でも毎回違う暗号文になります。「AES を使った」だけでは安全かどうかは決まらず、どのモードでどう使うかまで含めて一つの方式です。

  • AES という名前だけでは足りない
  • ブロックごとに同じ変換をすると(ECB)
  • 出席
  • 出席
  • 欠席
  • 鍵 K
  • 3a9f
  • 3a9f
  • c71e
  • 同じ中身 → 同じ暗号文
  • モードと nonce で毎回変えると(例:GCM)
  • 出席
  • 出席
  • 欠席
  • 鍵 K+nonce
  • 8d21
  • f40b
  • 5e7c
  • 同じ中身でも毎回違う暗号文
  • AES:ブロック 128 ビット/鍵 128・192・256 ビット
  • AES は部品。モードと nonce まで決めて、はじめて使える

読めなくても、書き換えはできる

暗号化で手に入るのは「読めなくする」ことです。データを書き換えられたら気づく、という働きは含まれていません。この二つは別々の性質です。

図では、盗み見る人が通信路の暗号文の一部をこっそり書き換えました。よく使われる暗号化の方法の中には、暗号文の1ビットを反転させると、復号した平文の同じ位置の1ビットが反転するものがあります。盗み見る人は中身を読めなくても、「10」が書かれている位置さえ見当がつけば、それを「11」に変えられるのです。

ボブが復号すると、右の箱から「会議は11時」が出てきます。エラーは出ず、ボブには本物のメモと区別がつきません。秘密を守る仕組みと、改ざんを見抜く仕組みは、別に用意する必要があります。

  • 読めなくても、書き換えはできる
  • 人
  • 注意
  • 1 ビットだけ反転
  • 暗号化
  • 盗み見る人
  • 復号
  • 人
  • 人
  • 7f 3b c9 1e
  • 会議は11時
  • アオイ
  • 覗かれうる通信路
  • エラーは出ない
  • ボブ
  • 鍵 K
  • 鍵
  • 鍵 K
  • 鍵
  • 暗号化だけでは、書き換えに気づけない

鍵で付けるタグ、MAC

改ざんに気づくために、アオイは送る前に暗号文と鍵 K から短い値を計算して、暗号文に添えます。この値を タグ と呼び、タグを作る仕組みを MAC(メッセージ認証コード)といいます。ボブは届いた暗号文から自分の鍵 K で同じ計算をし、添えられたタグと比べます。

図の暗号文は途中で書き換えられているので、ボブが計算したタグは添えられたタグと一致しません。ボブは「NG」と判断して、このデータを受け取りません。

前の章のハッシュ値も、データが1ビット変わるだけで全く違う値になる指紋でした。ただ、ハッシュ関数は誰でも計算できるので、盗み見る人は書き換えた暗号文のハッシュ値を作り直して添え替えられます。MAC のタグは鍵 K がないと正しく作れません。ここがハッシュとの決定的な違いです。

  • 鍵で付けるタグ、MAC
  • 人
  • 注意
  • タグは作り直せない
  • 暗号化+タグ
  • 盗み見る人
  • タグを照合
  • 人
  • 人
  • 7f 3b c9 1e
  • タグ
  • 不一致 → NG
  • アオイ
  • 覗かれうる通信路
  • ボブ
  • 鍵 K
  • 鍵
  • 鍵 K
  • 鍵
  • 鍵 K がないと、正しいタグは作れない

認証付き暗号(AEAD)でまとめる

暗号化とタグ付けを別々の部品で組み合わせると、順番や比べ方を誤って穴ができがちです。そこで今は、この二つを一つの手順にまとめた 認証付き暗号(AEAD)を使うのが基本です。AEAD の使い方の決まりは RFC 5116 にまとめられています。

代表は、AES を使う AES-GCM(NIST SP 800-38D)と、AES 専用の回路がない端末でも速い ChaCha20-Poly1305(RFC 8439)です。どちらも暗号化すると暗号文とタグが一緒に出てきます。図のように、nonce・暗号文・タグをひと組にして送ります。

ボブ側の復号は、まずタグを確かめ、合ったときだけ平文を返します。合わなければ平文を返さずにエラーにします。プログラムを書くときは、このエラーを握りつぶさず、そのデータを捨てるようにします。

  • 認証付き暗号(AEAD)でまとめる
  • 人
  • 注意
  • 盗み見る人
  • 人
  • 人
  • nonce
  • 7f 3a c9 1e
  • タグ
  • アオイ
  • 覗かれうる通信路
  • ボブ
  • OK → 平文
  • 鍵 K
  • 鍵
  • 鍵 K
  • 鍵
  • 例:AES-GCM / ChaCha20-Poly1305
  • 暗号化とタグを一度に。合わなければ受け取らない

nonce は一度きり

nonce は「number used once(一度だけ使う数)」から来た言葉で、メッセージごとに違う使い捨ての値です。秘密にする必要はなく、前のページの図のように暗号文と一緒にそのまま送ってかまいません。役目は、同じ鍵で何通送っても毎回違う暗号文になるようにすることです。

守る約束はひとつで、同じ鍵のもとで同じ nonce を二度使わないことです。図の1通目と2通目は、鍵は同じ K でも nonce が N1 と N2 で違うので問題ありません。下の段のように N1 を使い回すと、AES-GCM では二つの平文の関係が漏れるうえ、タグを作るための内部の値まで割り出され、偽のメッセージを作られるおそれがあります。安全性が少し下がる、では済まない壊れ方です。

nonce を自前の連番で管理すると、サーバーが複数台あるときに重なりやすくなります。使うライブラリや規格が勧める作り方に従いましょう。

  • nonce は一度きり
  • 鍵
  • nonce
  • 1通目
  • 鍵 K
  • 鍵
  • N1
  • OK
  • 2通目
  • 鍵 K
  • 鍵
  • N2
  • OK
  • 2通目で N1 を再利用
  • 鍵 K
  • 鍵
  • N1
  • NG:安全性が崩れる
  • nonce は秘密でなくてよい。同じ鍵で同じ値を重ねない

最初の鍵をどう渡す?

ここまでは、アオイとボブが前もって同じ鍵を持っていることを前提にしてきました。では、まだ安全な通信路がない二人は、最初の鍵をどうやって共有するのでしょうか。図のボブの鍵は、まだ「?」のままです。

いちばん手軽に思えるのは、鍵も暗号文と一緒に送ることです。けれども図のように、通信路を渡る緑の鍵は盗み見る人にも写し取られ、暗号文はそのまま開けられてしまいます。錠をかけた箱に、開ける鍵を貼り付けて送るようなものです。直接会って渡す、別の安全な経路で届けるといった方法はありますが、ネットで初めてつながる相手には向きません。

人数が増えると、問題はさらに大きくなります。どの二人のあいだでも別の鍵を使うなら、n 人では n(n-1)/2 組の鍵が要り、100人なら4950組です。これを全部、安全に配って管理しなければなりません。

  • 最初の鍵をどう渡す?
  • 人
  • 注意
  • 鍵ごと写せば開ける
  • 盗み見る人
  • 人
  • 人
  • 7f 3a c9 1e
  • 鍵 K
  • 鍵
  • アオイ
  • 覗かれうる通信路
  • ボブ
  • 鍵 K
  • 鍵
  • 鍵 ?
  • 鍵
  • n 人なら n(n−1)/2 組。100 人で 4950 組
  • 鍵を暗号文と一緒に送れば、誰でも開けてしまう

同じ鍵では「どちらが作ったか」を示せない

共通鍵暗号には、もうひとつ限界があります。MAC のタグは、鍵 K を持つ人なら誰でも作れます。そして鍵 K を持っているのは、アオイとボブの二人です。

ボブにとっては、これで十分です。自分が作っていないタグ付きのメッセージが届けば、作ったのはアオイだと分かります。けれども、このメッセージを第三者に見せて「アオイが書いた」と示そうとしても、第三者には区別がつきません。図の緑の矢印のように、ボブも同じ鍵で同じタグを作れるからです。

「誰が作ったか」を外の人にも示すには、作る人だけが持つ鍵と、誰でも確かめられる鍵を分ける必要があります。これが後の章で出てくる電子署名の考え方です。

  • 同じ鍵では「どちらが作ったか」を示せない
  • 天秤
  • どちらが作った? 区別できない
  • 第三者
  • 人
  • 人
  • 会議は10時
  • タグ
  • アオイ
  • 作れる
  • 作れる
  • ボブ
  • 鍵 K
  • 鍵
  • 鍵 K
  • 鍵
  • MAC は二人の間の確認。第三者への証明は電子署名で

まとめ:鍵も暗号文と一緒に送ればよい?

この章では、共通鍵暗号が同じ鍵 K で閉じて開く仕組みであることを見ました。安全さは方式を隠すことではなく鍵を秘密に保つことに支えられ、128ビットの鍵なら総当たりは現実的ではありません。ただし AES のような部品だけでは足りず、モードと nonce、そして改ざんに気づくためのタグが要ります。今はそれらをまとめた認証付き暗号を使い、nonce は同じ鍵で二度使いません。

では、「鍵も暗号文と一緒に送ればよいのでは?」という問いに答えましょう。答えは「いいえ」です。通信路を通る鍵は盗み見る人にも届くので、暗号文と鍵がそろえば誰でも開けてしまいます。鍵は暗号文とは別に、安全な方法で共有しておく必要があります。そして、まだ安全な通信路がない相手とどう共有するかは、共通鍵暗号だけでは解けません。

次の章では、この難所に答える方法として、誰に配ってもかまわない鍵を使う公開鍵暗号を見ていきます。

  • まとめ:鍵も暗号文と一緒に送ればよい?
  • 人
  • 注意
  • 盗み見る人
  • 人
  • 人
  • nonce
  • 7f 3a c9 1e
  • タグ
  • アオイ
  • 覗かれうる通信路
  • ボブ
  • 鍵 K
  • 鍵
  • 鍵 ?
  • 鍵
  • 次の章:配ってよい鍵
  • 鍵
  • 鍵は暗号文と別に、安全に共有する

0 件のコメント

読み込み中…

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