読者です 読者をやめる 読者になる 読者になる

Re: チャットとかでパスワードを教えるとき暗号化すると良い

programming

この記事。3ヶ月以上前のやつなんだけどちょうどいい題材なので今更これに反応してというか勝手に乗っかって秘密鍵と公開鍵のことについて書く。

この記事では同じキーを使って暗号化と復号化を行っているけれど、これだと「じゃあそのキーをどうやって共有するの」っていう問題がある。ネットワーク越しにデータのやりとりをしているけど、結局キーをやり取りするためには電話とか口頭とかでそのキーを伝える必要があり、それならばパスワードを電話や口頭で伝えるのとあまり変わらなくなってしまう。あるいは、件のブログに書いてあるとおり「事前にキーを共有」しておく必要がある。

人間同士のやり取りならば例えば「キーは俺の電話番号ね〜」とかなんとかで一応キーを伏せたままやりとりできるけど、たとえば機械と機械の間で暗号化と複号化を安全に行うためには、事前に安全な形でキーをお互いに持っておかないといけない。

そんなわけで、じつはこのやり方は「突発的に誰かと暗号で情報を交換しなければいけない」というときには現実的ではない(同じ会社の同じフロアのひと同士でやるとかならまあ現実的な範囲だと思う)。

そこで、この「暗号化/複号化のためのキーをどうやって交換するか問題」に対するソリューーーーショッンのひとつが、「秘密鍵」と「公開鍵」である。

秘密鍵と公開鍵は、かならず対になっている。公開鍵で暗号化したメッセージは、対になる秘密鍵で複号化することができる。謎の技術!って感じなんだけど、この技術の裏には素数と素数の積である合成数をうまく使うという数学者の叡智が隠されており、めっちゃ面白いので興味があると調べてみるといいかもしれない。

話がそれたので話を戻すと、秘密鍵と公開鍵はペアになっていて、ある公開鍵で暗号化した情報はそのペアとなっている秘密鍵で のみ 復号化ができる。この特徴を使うと、以下の手順で安全に鍵を受け渡しながら暗号化/複号化を行うことができる。

今、A さんが B さんに yabai information を送りたいとする。

  • A さんは B さんから「公開鍵」をもらう。ここは平文でOK。
  • A さんはその公開鍵を使って yabai information を暗号化し、Bさんに送る
  • B さんは「秘密鍵」を使って yabai information を複号化する。

さて、ここで重要なのは、「公開鍵」は平文で送られているということだ。なので、この公開鍵は誰かに盗聴されている可能性がある。まずい!!!! とおもうけど、よく考えてみるとぜんぜんまずくないのです。公開鍵でできることは、「暗号化」であり、「復号化」ではない。公開鍵が悪いひとにバレても、悪いひとは「暗号化」しかできず、「複号化」はできない。

そんなわけで、公開鍵がいくらあっても、暗号化されている yabai information を複号化することはできないわけです。これが、公開鍵を平文で送りつけてもいい理由です。

さて、こうして、「暗号化のためのキー」と「復号化のためのキー」を分けることによって、「キーをどうやって受け渡すの問題」は解決しました。「渡しても問題ないキー」を渡せばよいわけですね。賢い!

まとめ

  • 同じキーで暗号化/復号化を行うためには、キーを事前になんらかの安全な方法で共有しておく必要がある。
  • 突発的な情報交換や不特定の相手との情報交換においては現実的ではない
  • そういうときには秘密鍵と公開鍵を使った暗号化をすると良い
  • 公開鍵は暗号化のために使い、秘密鍵は復号化に使う
  • 公開鍵では復号化できないからバレても大丈夫
  • 秘密鍵使うと復号化できるからバレると大変