共通鍵暗号と公開鍵暗号の解説とSSHでの認証手順

広告

SSHではパスワード認証ではなくより安全な公開鍵認証を使う仕組みが用意されています。具体的な手順は次のページで解説しますが、ここでは公開鍵暗号や共通鍵暗号とはどういったものか、そしてSSHで公開鍵認証を行う時にどのようなことを具体的に行っているのかを解説します。

※ 仕組み自体をご存知の方や仕組みは知らなくてもいいという方は次のページへ進んで下さい。

1.暗号化の必要性
2.共通鍵暗号
3.共通鍵暗号方式の問題点
4.公開鍵暗号方式
5.公開鍵暗号方式のデジタル署名への適用
6.SSHで公開鍵認証を使った認証手順

そもそも暗号化は何故必要なのでしょうか。それはインターネットを経由して情報のやり取りを行う場合、悪意のある第三者に情報を盗み見される危険性があるためです。

p4-1

そこで重要なデータについては送信する前に暗号化を行います。もし途中で悪意のある第三者にデータを盗み見されたとしてもデータは暗号化されているため悪意のある第三者はデータの内容を見ることは出来ません。

p4-2

このようにインターネットを経由してデータを安全にやり取りしたい場合にはデータの暗号化が1つの解決策となります。暗号化と復号化をどのように行うのかは色々な方法がありますが、主に使われている共通鍵暗号と公開鍵暗号の2つの方法について説明します。

共通鍵暗号は暗号化と復号化に同じ鍵を使う方式です。例えば受信側で暗号化・復号化用の鍵を作成し、同じ鍵のうちの1つの鍵を送信者側に送信しておきます。そして自分宛にデータを送信する場合は、渡した鍵で暗号化して送信して欲しいと依頼します。

p4-3

そしてデータを送信する時にはまず送信側で鍵を使ってデータを暗号化します。

p4-4

暗号化したデータをインターネットを経由して送信します。データは暗号化されているので悪意のある第三者に盗み見られても安心です。

p4-5

受信側で受けとったデータを鍵を使って復号化します。

p4-6

これでデータを受け渡すことができました。

このように安全にデータを受け渡しすることができたように見えますが、共通鍵暗号方式の場合は実は2つの問題点があります。

まず一つ目は鍵をどのようにして相手に渡すのかです。同じ鍵を使用していますのでどちらかで作成した鍵を相手に渡す必要があります。ところが鍵をインターネット経由で渡した場合、鍵は暗号化されておらず鍵を悪意のある第三者に見られてしまう可能性があります。

p4-7

悪意のある第三者に鍵を持たれてしまっては、いくらデータを暗号化して送信しても意味がありません。悪意のある第三者が鍵を持っているので暗号化したデータを復号化できてしまうためです。

p4-8

よって共通鍵暗号方式だけを使う場合は、鍵の受け渡しをインターネット以外の例えば郵送といった手段で行う必要があります。

もう一つの問題点は複数の相手から暗号化したデータを受け取る場合、相手毎に鍵を別に用意する必要があるということです。

もし同じ鍵を共通して使った場合を考えてみます。

p4-9

誰かから送信されたデータは暗号化されていますが、他の人も同じ鍵を持っていますのでもしデータが盗み見られてしまうとデータが復号化されて中身が見られてしまいます。

その為、データのやり取りをする相手ごとに別々の鍵を用意する必要があります。実用上はそれほど大きな問題ではありませんが、送信先が増加した場合は鍵の管理が煩雑になります。

p4-10

このように共通鍵暗号方式は1つの鍵を使うというシンプルな方式ながら、実際の運用上は問題となる点があります。そこで現在では公開鍵暗号方式が主に使われるようになりました。

公開鍵暗号方式は公開鍵と秘密鍵という2つの鍵を使って暗号化と復号化を行います。暗号化を行うのが公開鍵で復号化を行うのが秘密鍵、といった感じで用途が分かれているわけではありません。どちらの鍵も暗号化にも復号化にも使用します。

公開鍵暗号方式で暗号化と復号化を行う場合、次のような特徴があります。

・公開鍵で暗号化したデータは秘密鍵でしか復号できない
・秘密鍵で暗号化したデータは公開鍵でしか復号できない

それでは実際の利用方法を見ていきます。まずデータを受信する側で公開鍵と秘密鍵を作成します。

p4-11

秘密鍵は誰にも見せません。それに対して公開鍵は外部に公開し誰でも見ることができるようにします。

送信側は公開されている公開鍵を取得します。

p4-12

送信側は取得した公開鍵を使ってデータを暗号化します。

p4-13

暗号化したデータをインターネットを経由して送信します。(盗み見された場合にどうなるのかは後でご説明します)。

p4-14

受信側で受けとったデータを秘密鍵を使って復号化します。最初にご説明した通り、公開鍵を使って暗号化されたデータは秘密鍵を使ってのみ復号化することができます。

p4-15

このようにデータを安全に送信することができました。

ただこの方式ですとデータを暗号化するための公開鍵は公開されてしまっているので鍵を盗み見するまでもなく悪意のある第三者に鍵を知られてしまうということが大丈夫なのかと思われるかと思います。

p4-16

公開されている鍵は公開鍵ですのでデータの送信者も悪意のある第三者も取得できる鍵は公開鍵だけです。そして公開鍵暗号方式の特徴として最初に記載した通り公開鍵で暗号化したデータは秘密鍵でしか復号化できません。その為、公開鍵を使って暗号化されたデータを悪意のある第三者が盗み見したとしても、持っている公開鍵では復号化することができません。

p4-17

このように公開鍵は誰に知られても問題ないので、送信側に公開鍵を渡す時に誰かに盗み見られる心配をする必要が無く単に公開しておけばいいだけです。

また送信側が複数になった場合でも公開鍵は1つだけで構いません。

p4-18

なぜならば先ほどの悪意のある第三者の場合と同じく公開鍵を使って暗号化されたデータは公開鍵では復号化することができないためです。

このようにいいことばかりのように見える公開鍵暗号方式ですが、基本的に一方通行の使い方しかできません。送信側に対して今度は受信側から暗号化したデータを送信しようとする場合、送信側で秘密鍵と公開鍵を作成し、公開鍵を公開しておく必要があります。また共通鍵を使用する場合と比較して処理が複雑になるため処理速度が遅くなる傾向があるようです。

そこで処理速度が速い共通鍵暗号を基本的には使うけれど、共通鍵で使用する鍵を送信元から送信先へ送るときにだけ鍵を公開鍵暗号方式で暗号して送るという方式もよく使われています。共通鍵暗号の欠点である鍵の交換だけを公開鍵暗号方式を使って安全にインターネット経由で行うことができます。

データをインターネットなどを経由してやり取りする場合に、データの漏洩の他に問題となるのがデータの改ざんやなりすましです。データの中身が悪意を持って書き換えられてしまうとビジネス上大きな問題となることもあります。またあたかも本人であるかのように装って誤ったデータを送信されることも問題となります。

そこで送信するデータを自分の秘密鍵で暗号化しデータを送信します。データを受け取った人は送信者の公開されている公開鍵で復号化し、復号ができれば間違いなく送信者が送信したデータであることが確認できます。(秘密鍵で暗号化したものは対になっている公開鍵でしか復号できないため)。

p4-19

今回は秘密鍵で暗号化していることに注意して下さい。復号化は公開鍵を使って行われますので誰でもデータの中身を確認することができます。ただ今回はデータの内容を隠したいわけではなく、データが間違いなく送信者が送信したものだと分かることが目的なので問題ありません。また複数の人へデータを送信した場合でも、それぞれデータを受け取った人が公開鍵を使って確認することができます。

ただこのやり方の場合、送信するデータのサイズが大きい場合、秘密鍵を使って暗号化する時に非常に時間がかかってしまう場合があります。そこで実際にはハッシュ値と呼ばれるものを使います。

ハッシュ値とは対象となるデータを表す小さな値を計算式を使って計算したものです。同じデータを対象に計算すれば必ず同じハッシュ値を取得できます。またデータをほんの少しでも変更されると計算されるハッシュ値は大きく異なる値になるようになっています。

p4-20

ハッシュ値は元のデータのサイズに関係無く一定サイズの値となります。そこでデータ全体を秘密鍵で暗号化するのではなく、対象のデータからハッシュ値を計算し、そのハッシュ値を秘密鍵で暗号化したものを元のデータと一緒に送信します。データ全体を暗号化した場合に比べハッシュ値は極めて小さな値なので暗号化にかかる時間は短く済みます。

p4-21

データを受けとった人は、まずデータからハッシュ値を計算します。また一緒に送信されてきた暗号化されたハッシュ値を送信者の公開されている公開鍵を使って復号化します。この二つのハッシュ値が一致すればデータは途中で改ざんされていないことが確認できます。

もし途中でデータが改ざんされていたら、そのデータから計算したハッシュ値と一緒に送信されてきた暗号化されたハッシュ値は一致しなくなります。また暗号化されたハッシュ値も改ざんし改めて悪意の第三者の秘密鍵で圧縮して送信したとしても、その暗号化されたハッシュ値は本来の送信元の公開鍵で復号化することは出来ません。その為、受信したデータが改ざんされたか、成りすました他の誰かからデータが送られてきたことが分かります。

このように公開鍵暗号を用いることで、データの暗号復号だけでなくデータの改ざんのチェックやなりすましの確認などに使うことが可能です。

ではSSHで公開鍵認証を使った場合、どのように認証が行われるのかを簡単に確認しておきます。まず事前準備として秘密鍵と公開鍵を作成し、秘密鍵はクライアント側に、公開鍵はサーバ側に設置しておきます。

p4-22

クライアント側の秘密鍵は別途指定したパスフレーズを鍵として暗号化します。

p4-23

※ パスフレーズによる秘密鍵の暗号化は省略可能な場合もあるようです。ただ特別な事情が無いのであれば設定されることをお勧めします。

準備は以上で終了です。

実際にクライアントから公開鍵認証によるSSH接続をするとサーバ側に設置した公開鍵の確認が行われた上で入力されたパスフレーズによって秘密鍵が復号化されます。

p4-24

そして(1)サーバ側で適当なデータを公開鍵で暗号化、(2)暗号化されたデータをクライアントへ送信、(3)データを秘密鍵で復号化、(4)復号化したデータをサーバへ送信、(5)受け取ったデータと元のデータを比較、といった流れで認証が行われます。(ここで記載した手順は厳密には異なる可能性がありますので予めご了承下さい。概ねこのような手順で認証が行われるという参考程度にご覧下さい)。

p4-25

サーバ側に事前に登録された公開鍵で暗号化されたデータを復号できるのは対になる秘密鍵を持つクライアントだけなので、送信元のデータと送り返されてきたデータが一致すれば正しいクライアントであると認証できます。

では次のページで実際に公開鍵認証を行うための公開鍵や秘密鍵を作成する方法などを確認します。

( Written by Tatsuo Ikura )