【S2お茶会】わかったつもりになろう、公開鍵暗号

s2お茶会
年が明けてから嫌な夢ばかりみます。

今回は弊社のある社員が「公開鍵暗号」について話しました。

わかったつもりになろう、公開鍵暗号


サーバーにログインする機会がある方にはおなじみの「SSHの公開鍵ちょうだい」というシチュエーションですが、

  1. ググって作った
  2. 2つ渡そうとしたら片方だけ受け取ってもらえた
  3. とりあえずその後ログインできるようになった!よかった!

で完了していることも多いと思います。
今回は一歩踏み込んで、なぜそれで OK になるのかをわかりやすく解説してみようと思います。
通信方式の仕様や理論的な話には踏み込まず、大雑把な理屈を説明するつもりです。

公開鍵とは

暗号化復号に別個の鍵(手順)を用い、暗号化の鍵を公開できるようにした暗号方式である。
暗号は通信の秘匿性を高めるための手段だが、それに必須の鍵もまた情報なので、鍵を受け渡す過程で盗聴されてしまうというリスクがあった。共通鍵を秘匿して受け渡すには(特使が運搬するというような)コストもかかり、一般人が暗号を用いるための障害であった。この問題に対して、暗号化鍵の配送問題を解決したのが公開鍵暗号である。

ウィキペディア日本語版「公開鍵暗号」

  • サーバーにログインする時
  • デジタル署名
  • デジタル認証

こういう時によく聞く名前だと思います。

用語の整理


理解しやすくなるように、公開鍵の周りでよく聞く用語について整理しておきます。


符号化
  • 元データを特定のルールに則って別のデータに置き換える処理
  • 元データを射像する方式なので符号化したデータから元データを復元できる
  • 元データの秘匿にはならない

圧縮
  • 主に元データの容量を削減する処理
  • 復元可能な方式もあるし復元不可能な方式もある
  • 元データの秘匿にはならない

例えば画像データで考えてみると、データのサイズを少なくするものの同じ画像に見えるので元データの秘匿には基本なりません。


暗号化
  • 元データを秘匿するための処理
  • 暗号化したデータは復号化で元データに戻すことができる
  • 復号化の方法を知っている人しか元データを復元できない

元に戻せない場合は暗号化したことにはなりません。


ハッシュ化
  • 元データを特定のルールに則って別のデータに置き換える処理
  • ハッシュデータから元データを推測することはできない
  • ハッシュデータから元データを復元することはできない
  • 元データが同じならハッシュデータも同じになる
  • 別の元データから同じハッシュデータになることはほぼない(衝突耐性)

「別の元データから同じハッシュデータになることはほぼない」と書いたのは、ごく稀にレアなケースで起こるからです。そうならないように日々研究を重ねている人たちが世の中にはいます。そうめったに起こることでもないので、まあ起こらないという前提の元、普段みんな使っています。


元データの容量削減元データの秘匿元データの復元利用例
符号化××文字エンコード、ひらがなカタカナ
圧縮×zip、画像などの軽量化
暗号化×機密データの受け渡し
ハッシュ化×パスワードの確認

公開鍵暗号の特徴


これで大体、公開鍵や暗号化の周りでよく聞く用語についてなんとなくイメージが掴めたかと思います。
それではここからが本題です。公開鍵暗号の特徴について説明していくのですが、まずは鍵の作り方から話をします。

鍵を作る


鍵を作るにはターミナルでコマンドを叩いたりなどの工程がありますが、それさえ知っていれば誰でも簡単に自分用の公開鍵を無料で作成することができます。
鍵を生成すると「秘密鍵」と「公開鍵」がワンセットで作られます。

  • 秘密鍵…自分しか見てはいけない、自分しか使ってはいけない、大切に保管して他人に渡さない
  • 公開鍵…他人に見せてよい、他人に使わせてもよい、他人に渡してもよい

鍵の複製をしたいと思った場合、秘密鍵があればペアになる公開鍵を作り出すことは可能です。ただし、公開鍵から秘密鍵を作ることはできません。また公開鍵から秘密鍵を推測して作ることもできません。

鍵の使い方


それらの鍵には、

  • 秘密鍵で暗号化したデータはペアになる公開鍵でしか復号化できない
  • 公開鍵で暗号化したデータはペアになる秘密鍵でしか復号化できない

というルールがあります。
暗号化は「鍵付きの箱にデータをしまって鍵をかける」行為にあたり、復号化は「鍵を開けて箱のデータを取り出す」行為だと考えてください。
つまり、ペアになっている反対側の鍵を持っている人でないとデータは開けられないことが保証されているのです。
これが公開鍵暗号の一番の特徴です。

秘密鍵は大事に保管しておかないといけないのですが、万一盗まれてしまった場合の保険として、パスフレーズという名前の合言葉がついています。秘密鍵を使うときは、持ち主でもパスフレーズが合っていないと使うことができません。
鍵を作成する時に設定を求められるので、そこで決めたパスフレーズは忘れないようにしてください。忘れると鍵を最初から作り直すことになります。

公開鍵暗号を使うとできること


最大の特徴である「秘密鍵で暗号化したデータは対の公開鍵でしか復号化できない」「公開鍵で暗号化したデータは対の秘密鍵でしか復号化できない」というルールを用いて、デジタルの世界では色々な証明を安全に行うために公開鍵暗号は使われています。

例えば、、、

ケースA:機密データの受け渡し


機密データを受け渡す際に、パスワードを受け渡す必要がない、あるいは経路の安全性に神経質になる必要なくデータの受け渡しができます。

  1. 渡したいデータを渡したい相手の公開鍵で暗号化し送る。
  2. 受け取った人は自分の秘密鍵でそれを復号化する。そのためパスワードを送る必要がなく、もし送信先を間違えても正しい受取人以外はデータを復号化することができないので安全。

これを使えば、例えばデータをメールで送信したい場合、

「zipファイルをメールで送信します」

「鍵がかけてありますが、別のメールでパスワードを送るのでそれを使って解凍してください」

というやりとりをしなくても良くなったりするのだろうと思うのですが、公開鍵暗号の方式が世間一般にはまだそこまで広く普及していないので、もう少し時間がかかりそうです。

ケースB:SSH公開鍵認証


サーバーにログインする時、パスワードを使うより安全にログインすることができます。

  1. ログインしたいサーバーにあらかじめ自分の公開鍵を預けておく。公開鍵は他人に見られても大丈夫なものなので受け渡しに神経質になる必要がない。
  2. ログインしたい時に、作法に則ったデータを作り、自分の秘密鍵を使って暗号化する。
  3. 暗号化したデータをログイン先サーバーに送る。暗号化されているので覗き見されても大丈夫。
  4. ログイン先のサーバーは預かっている公開鍵で復号化する。作法に則ったデータが問題なく復号化できたら、送り主は対になっている秘密鍵の持ち主なので信用してよい。

途中パスワードを盗聴される心配もありませんし、パスワードが流出した時に変更しないといけないといった騒動も起こりません。

ケースC:デジタル署名


デジタルデータに対する署名者の証明と署名時のデータから改変されていないことを証明することができます。

  1. 署名したいデータを用意する。
  2. 自分の秘密鍵を使って暗号化したデータを、署名前のデータに付ける。
  3. 第三者が署名データを対の公開鍵で復号化する。
  4. 復号化に成功すると署名者が公開鍵と対になる秘密鍵の持ち主だと確認できる。
  5. 復号化したデータが署名したデータと同じものであれば署名後に改変されていないことが確認できる。



ケースD:デジタル認証


他者からの信頼を得たい場合に、権威ある第三者のお墨付きをもらいスムーズに信頼を獲得する手法です。

  1. 信頼して欲しい情報をお作法に則り自分の秘密鍵を使ってデジタル署名をし、権威ある第三者へ申請します。
  2. 権威ある第三者は受け取った情報を申請者の公開鍵を使い信頼性を検証する。検証ができたら自分の秘密鍵を使って申請データに署名し、認証した証明書とする。
  3. 認証された証明書は誰でも申請者と権威ある第三者それぞれの公開鍵を使い復号化し、正当性を確認することができる。

ちなみに権威ある第三者とは、いわゆるデジタル認証局に当たります。SSLの証明書の発行・管理を行っている機関です。

よくある質問


Q. SSH ログインはパスワード認証ではいけないの?

パスワード認証は、パスワードを知っていれば誰でもログイン可能になってしまうため本人確認が難しいです。パスワードを送る通信経路自体も盗聴されないように気を配る必要があります。

一方、公開鍵認証を使うと秘密鍵もパスワードも送る必要がないため通信経路に神経質になる必要が少なくなります。また暗号化したデータを盗聴されても秘密鍵とパスフレーズ両方を用意できない限り復号化できないため、なりすましてログインすることは難しいです。

秘密鍵もパスフレーズも漏洩している場合の安全は保証はできませんが、少なくともパスワード認証よりはセキュアな運用が可能です。


Q. 公開鍵と秘密鍵を作る時に RSA とか DSA とかあるけど、あれは何ですか?

簡単にいうと公開鍵暗号の種類です。どの暗号方式を使うかによって検証パフォーマンスやセキュリティ、サーバーやデジタル機器のサポート状況が異なります。

暗号方式特徴
RSA歴史ある暗号方式。その分、サポートされている機器が多い。
DSARSAより新しい暗号化方式。セキュリティに問題が見つかっている。
ECDSA鍵のデータ量が小さめで済む。
EdDSA比較的新しい暗号方式。パフォーマンスもセキュリティも高め
新しい分、サポートされていない機器もある。将来性◎。
現在は迷ったら RSA (またはECDSA) を選んでおけば大丈夫ですが、徐々に EdDSA へ移行が進んでいくはずです。

まとめ


冒頭にあげた「SSHの公開鍵ちょうだい」と言われた時のシチュエーションのやりとりについて納得できるようになったでしょうか。

  • 本人確認に使える
  • パスワードの受け渡しが不要でデータを安全に受け渡しできる
  • 署名が本人のものであることを第三者が確認できる
  • 署名されたデータが署名時の内容と同一であることを第三者が確認できる

このような用途として使える技術なので、書類の電子化が進むとエンジニアだけでなく広く誰でも利用する社会になるかもしれません。

マイナンバーカードにも公開鍵暗号の技術が使われていて、その話がこちらのお茶会記事に書かれているので、よかったら読んでみてください。