セキュリティ

INPUT · スライド

暗号のかけ方は2種類

01 / 11

隠すのは中身、隠さないのは手順

読まれたくない文を、読めない形に変えるのが 暗号化 だよ。元の文を 平文、変えたあとを 暗号文 と呼ぶ。暗号文を元に戻すのが 復号 だ。

変え方を決めているのが 。同じ手順を使っても、鍵が違えば出てくる暗号文は別物になる。

ここで意外なのが、手順そのものは世界中に公開されているということ。AES も RSA も、計算のやり方は誰でも読める。秘密にするのは鍵だけだよ。

手順を隠して守ろうとすると、漏れた時点で作り直しになるし、そもそも安全かどうかを誰にも検証してもらえない。公開して叩かれても破られない手順を使い、鍵だけを隠す。これが暗号の基本の構えだよ。

平文 → [暗号化] → 暗号文暗号文 → [復号] → 平文

02 / 11

同じ鍵で閉めて開ける ― 共通鍵暗号

1つめのやり方が 共通鍵暗号方式 だよ。暗号化と復号に同じ鍵を使う。家の玄関の鍵と同じ感覚で、閉めるのも開けるのも1本で足りる。

代表的な方式が AES。いまいちばん広く使われている共通鍵暗号で、ファイルの暗号化からデータベースの暗号化まで、ここぞという場面はだいたいこれだよ。

いいところは速いこと。同じくらいの強さになるように鍵の長さをそろえて比べても、次に出てくる公開鍵暗号より暗号化も復号もずっと軽い。だから量のあるデータを流すときはこちらが選ばれる。

共通鍵、秘密鍵暗号、対称鍵暗号などいろいろな呼び方があるけれど、指しているものは同じだよ。

共通鍵暗号  鍵A で暗号化  鍵A で復号  → 同じ鍵を2人で持つ

03 / 11

困りごとその1 ― 鍵をどう渡すか

同じ鍵を使うということは、相手にその鍵を持っていてもらわないといけない。ここが共通鍵暗号のいちばんの弱点だよ。

考えてみてほしい。中身を読まれたくないから暗号にしたのに、その鍵をそのままネットワークに流したらどうなるだろう。鍵をのぞかれた人は暗号文も開けてしまう。鍵を平文で送ってはいけないんだ。

だから共通鍵暗号を使うには、通信を始める前に、別の安全な方法で鍵を渡しておく必要がある。手渡しする、別の経路で伝える、といった手間がかかるよ。

この「鍵をどうやって届けるか」という問題を 鍵配送問題 と呼ぶ。共通鍵暗号がひとりでは完結しない理由がこれだよ。

鍵を平文のまま送ると送信 --鍵-- 受信   のぞかれたら終わり

04 / 11

困りごとその2 ― 人数が増えると鍵が増える

もうひとつの弱点が鍵の本数。共通鍵は通信する相手ごとに別のものを用意する必要があるんだ。A さんと B さんが同じ鍵で話しているところに C さんも同じ鍵で入ったら、C さんは A さんと B さんの会話まで読めてしまうからね。

ということは、必要な鍵の数は組の数になる。3人なら A-B、B-C、A-C の3組で3本。4人なら A-B、A-C、A-D、B-C、B-D、C-D の6組で6本だよ。

数え方はこう考える。1人から見ると相手は自分以外の n−1 人。全員ぶんで n(n−1) だけれど、A から見た B と B から見た A は同じ1組を2回数えているので、2で割る

つまり n(n−1)÷2 本。100人なら 100×99÷2 = 4950本にもなる。人数が増えると急に手に負えなくなるよ。

共通鍵 3人 A-B B-C A-C → 3本共通鍵 4人 A-B A-C A-D B-C B-D C-D → 6本

05 / 11

2本で1組の鍵 ― 公開鍵暗号

2つめのやり方が 公開鍵暗号方式。こちらは鍵を2本1組で作るのがみそだよ。

  • 公開鍵 … 誰にでも配ってよい鍵
  • 秘密鍵 … 本人だけが持ち、絶対に外へ出さない鍵

この2本には、片方でかけたものは、もう片方でしか開かないという関係がある。公開鍵で暗号化したものは、その相手の秘密鍵でしか復号できないんだ。

だから鍵を秘密に届ける必要がなくなる。公開鍵は堂々と公開してよい。かけるための鍵をみんなが知っていても、開けるための鍵は本人しか持っていないので困らないよ。

公開してよいのは暗号化する鍵と手順まで。復号する鍵だけは秘密にする。ここが共通鍵暗号との決定的な違いだよ。

公開鍵で閉める秘密鍵でしか開かない

06 / 11

誰の鍵でかけるのか

試験でいちばん問われるのがここ。中身を隠したいときは、受け取る人の公開鍵でかける

X さんが Y さんにメールを送るなら、使うのは Y さんの公開鍵。そうすれば開けられるのは Y さんの秘密鍵を持つ Y さん本人だけになる。

自分の鍵を使ってはいけない。X さんが自分の公開鍵でかけたら、開けられるのは X さん自身だけで、Y さんには読めないよ。

ここから大事な性質がもう1つ出てくる。同じ暗号文を何人に送っても、開けられるのは鍵の持ち主だけ。B さんの公開鍵でかけたメールを B さんと C さんの2人に送っても、C さんは自分の秘密鍵では開けられない。自分の秘密鍵なら開ける、というのは間違いで、対になる公開鍵でかけられたものだけが開くんだ。

X → Y に送るとき暗号化 Y の公開鍵復号   Y の秘密鍵Y 本人しか読めない

07 / 11

公開鍵なら鍵は 2n 本

公開鍵暗号にすると、鍵の本数の悩みも消える。1人が1組(公開鍵と秘密鍵)を持てば、相手が何人でもそれで足りるからだよ。

なぜ足りるのか。誰に送るときも使うのは相手が公開している鍵で、その鍵は相手が1組しか持っていない。相手ごとに新しい鍵を作る必要はないよね。

だから n 人なら 1人あたり2本 × n 人 = 2n 本。100人でも 200本で済む。共通鍵の 4950本と比べてみてほしい。

しかも、増えた鍵を安全に配る手間もない。公開鍵は公開してよいのだから、置いておくだけでいいんだ。

100人が通信するなら共通鍵 100×99÷2     = 4950 本公開鍵 100×2     = 200 本

08 / 11

いいところを両方取る ― ハイブリッド方式

ここまで読むと、公開鍵暗号だけ使えばいいように思える。でも公開鍵暗号には弱点があって、計算が重いんだ。長い本文を丸ごと処理させると時間がかかりすぎる。

そこで実際の暗号化通信は、2つを組み合わせて使う。これを ハイブリッド方式 と呼ぶよ。

  • 本文は共通鍵暗号で暗号化する(速いから)
  • そのとき使った共通鍵を、相手の公開鍵で暗号化する(安全に渡せるから)
  • 暗号文と、暗号化した共通鍵の2つを送る

受け取った側は、自分の秘密鍵で共通鍵を取り出し、その共通鍵で本文を復号する。

うまいのは、重い公開鍵暗号を短い鍵1個にだけ使っているところ。速さは共通鍵暗号のまま、鍵配送問題は公開鍵暗号が解決してくれる。https:// の通信も中はこの形だよ。

そして押さえておきたいのは、これで実現できるのは中身を読まれないことだけということ。改ざんされていないかや、送ってきたのが本人かは、これだけでは分からないよ。

本文  → 共通鍵で暗号化共通鍵 → 相手の公開鍵で         暗号化2つを送る

09 / 11

名前と持ち場を結びつける

選択肢には方式の名前が並ぶだけの問題も出る。どちらの仲間かを言えるようにしておこう。

  • AES … 共通鍵暗号。いまの標準
  • RSA … 公開鍵暗号。非常に大きな数の素因数分解が難しいことを土台にしている
  • 楕円曲線暗号 … 公開鍵暗号。RSA より短い鍵長で同じくらいの安全性が出せるので、スマートフォンのような非力な機械に向く
  • SHA-256 … これは暗号ではなく、次に出てくるハッシュ関数

紛らわしいものも並べておくね。DSA は署名のための方式、PKI は証明書を扱う仕組みの名前で、どちらも「データを暗号化する方式」ではないよ。

IDEAKCipher-2 のように見慣れない名前が混ざることもある。全部覚えるのは無理なので、確実に分かるものから消していくのが実戦的だよ。

AES    共通鍵RSA    公開鍵 素因数分解楕円曲線 公開鍵 短い鍵長SHA-256 ハッシュ

10 / 11

鍵の長さが強さになる理由

鍵を知らない人が暗号文を開けようとするなら、いちばん素朴な手は鍵を片っぱしから試すこと。これを ブルートフォース攻撃(総当たり攻撃)と呼ぶよ。

平文と暗号文の組が1つ手に入れば、鍵の候補を1つずつ当てはめて、その平文になる鍵を探せばいい。だから守る側の勝負どころは、候補の数を試しきれないほど多くすることになる。

ここで効いてくるのが 鍵長。鍵が n ビットなら候補は 2 の n 乗 通り。1ビット増えるだけで候補は2倍になるので、長くするほど一気に強くなるんだ。

名前に長さが入っている方式もあるよ。AES-256 は鍵が256ビットという意味で、最大 2 の256乗回試せばいつか当たる。当たるとはいえ、それは現実の時間では終わらない数だよ。

総当たり以外の攻め方もあって、統計的な偏りを手がかりにするもの、平文を少し変えたときの暗号文の変化を見るものなどがある。総当たりは「全部試す」だけのもの、と区別しておこう。

鍵が n ビットなら候補は 2 の n 乗 通りAES-256 → 2 の 256 乗

11 / 11

戻せない計算 ― ハッシュ関数

最後に、暗号とは少し毛色の違う道具を1つ。ハッシュ関数 だよ。データを通すと短い値が出てくる計算で、出てきた値を ハッシュ値メッセージダイジェスト と呼ぶ。

性質は3つある。

  • 長さがいつも同じ … 元が10文字でも10万文字でも、出てくる値の長さは変わらない
  • 1文字違えば別の値 … わずかな違いでまるで違う値になる
  • 元に戻せない … 値から元のデータを復元することはできない。これを 一方向性 という

3つめが暗号との決定的な違い。暗号は鍵があれば戻せるけれど、ハッシュ値は誰にも戻せないよ。

もう1つ大事なのが 衝突。違うデータから同じハッシュ値が出てしまうことで、これが簡単に作れてはいけない。もし現実的な時間で衝突を作る方法が見つかってしまったら、その関数はもう安全とは言えなくなる。時間の経過や技術の進歩で暗号やハッシュ関数の安全性が落ちることを 危殆化 と呼ぶよ。

この短い値をどう使って改ざんや本人を確かめるのかは、次のレッスンで扱うね。

ハッシュ関数・長さはいつも同じ・1文字違えば別の値・値から元に戻せない