SSHを理解するために暗号化技術の基本を知る〜共通鍵暗号と公開鍵暗号

SSHは、Secure Shellの略称で、コンピュータからネットワークを介して安全に離れた場所にある別のコンピュータへ接続するための技術です。こうしたコンピュータ接続のことをリモートログインとも言います。

便宜上、アクセス元のコンピュータをクライアント、別のコンピュータはサーバと呼ぶことにします。クライアントから見て、地理的また物理的に離れた場所にサーバがあることはもはや珍しいことではありません。

クラウドでシステムを構築する事例が当たり前になってきた現在、ネットワークを介したリモートログインが利用できないと仕事ができません。

一方で問題になるのがセキュリティです。ネットワークを介した通信には常に盗聴の危険が潜んでいます。法律で盗聴は禁止されていても、盗聴行為自体の排除はできません。

かつては、コンピュータ間通信に、TELNETというプロトコルが使われてきましたが、データを素のままで送る平文(ひらぶん)通信だったことから、情報が盗聴される危険性がありました。

安全な通信の実現には、

  • データが盗聴されてもそのままでは使用できないこと
  • 接続するユーザや接続先のサーバが本人・本物であることの認証

という要件が必要となります。

SSHは、離れた場所からのアクセス、つまりリモートログインを安全に、かつ安心して使用するために、通信の暗号化と認証のしくみを提供する技術です。

この技術をソフトウェアとして実装したのがOpenSSHです。OpenSSHをコンピュータに導入して利用することで安全な暗号化通信が可能になります。

今回はセキュリティの観点でSSHの認証などで使われている代表的な暗号化技術、共通鍵暗号と公開鍵暗号のしくみを簡単に解説します。この仕組みが理解できればSSHの認証手順についても理解が深まると思います。

暗号化とは

ところで、暗号化とは具体的に何をするのでしょうか。

私たちは誰でも他人に知られたくない秘密を持っています。現代社会において、多くの秘密情報がネットワークを介してやりとりされています。

第三者に重要な秘密情報を取得され、書き換えられたり、プライバシーに関わる情報が世界中に公開されてしまったら大変です。

ITが進展した社会において、ネットワークを流れる情報は常に盗聴の脅威にさらされていると言えます。

こうした状況を改善するために、これまでにもさまざまな暗号化技術が開発され利用されてきました。

シーザー暗号とは

簡単な例ですが、歴史上で実際に使われてきた暗号として「シーザー暗号」があります。

シーザー暗号は、平文アルファベットを一定の文字数だけ「ずらす」ことによって暗号化を行います。

ここではわかりやすく小文字で平文のアルファベットを、大文字で暗号文のアルファベットを表記します。

例えば、アルファベットを3文字分「ずらす」ことにすると、aがDに、bがEに、cがFに暗号化されます。

秘密にしたい情報を「linux」という文字列にする場合、シーザー暗号では「IFKRU」という暗号文に変換できます。

受信者は「IFKRU」という暗号文を受け取りますが、そのままでは意味がわからないので複合して平文に戻します。

シーザー暗号の復号には暗号化と同じ鍵を使い逆方向にずらす操作を行います。つまり3文字逆にずらします。

このように、シーザー暗号は元の情報を一定の文字数「ずらす」という仕組みです。

この仕組みのことを「アルゴリズム」と言います。そして、ずらす文字数がこの暗号の「鍵」となります。このアルゴリズムと鍵の関係がとても重要になります。

鍵の値を変更することで、アルゴリズムを変更せずに繰り返し使えるわけです。 アルゴリズムと鍵を分ける意味もここにあります。

共通鍵暗号とは

シーザー暗号には鍵の内容が変更できるということ以外にも特徴があります。

暗号用と復号用の鍵が共通であるということです。

こうした暗号方式を「共通鍵暗号(秘密鍵暗号)」といいます。

名前の通り、暗号化する鍵と復号する鍵が共通なので鍵の管理が一つで済むメリットがあります。

共通鍵暗号の特徴

  • 暗号化する鍵と復号する鍵が同じ
  • 鍵は一つ

ただ、この共通鍵暗号方式の場合、データを送信する相手に何らかの方法で鍵を送る必要があります。鍵が無いと復号できないためです。

アリスがボブに秘密のメッセージを送りたい場合を想定して説明します。

アリスはメッセージを他人に見られたくありません。なので、盗聴されてもいいように共通鍵暗号で暗号化しようと考えました。

当然、暗号文の復号には暗号化に使用した鍵が必要になります。この場合、鍵の暗号化はできないので平文で送ることになります。

暗号文は盗聴されても何が書かれているかはわかりませんが、平文の鍵情報が盗聴されれば結果的に暗号文が解読されてしまいます。

鍵を送らなければボブはメッセージが読めません。とはいえ、鍵を送ると鍵情報が盗聴される可能性があります。

これが共通鍵暗号の「鍵配送問題」です。

鍵問題を解決する最も簡単な方法は、安全な方法で鍵を事前に渡しておくことですが、それにも限界があります。離れた場所にいる人同士が安全に鍵のやりとりする方法はそうそうありません。郵送で鍵を送ろうにも郵送の途中で紛失したり盗まれる可能性は存在します。

この鍵配送問題を解決する方法がSSHの認証にも使われる公開鍵暗号方式です。

公開鍵暗号とは

共通鍵では暗号と復号に同じ鍵を使いますが、公開鍵暗号では暗号化の鍵と復号用の鍵は別のものになります。

暗号化の鍵は暗号化だけに使うので持っていても復号はできません。復号にはあくまで復号用の鍵が必要です。これが公開鍵の性質です。

ちなみに、暗号化用の鍵を「公開鍵」復号用の鍵を「秘密鍵」と言います。

公開鍵暗号の特徴

  • ・暗号化する鍵と復号する鍵は別
  • ・公開鍵:送信者に必要
  • ・秘密鍵:受信者に必要

それでは再びアリスとボブの例で説明します。

① ボブはあらかじめ公開鍵暗号を使い、公開鍵と秘密鍵のペアを作成しておきます。

② ボブは公開鍵をメールなどでアリスに送ります。公開鍵は誰に見せても良い内容なので暗号化の必要はありません。

③ アリスはボブの公開鍵を使ってボブに送るメッセージを暗号化して送信します。アリスのメッセージは暗号化されているので盗聴されたとしても復号用の鍵が無ければ解読ができません。

④ ボブはアリスからの暗号文を自分の秘密鍵を使って復号することでメッセージを確認します。めでたしめでたし。

このように、公開鍵暗号を使うことにより、復号用の鍵をやりとりすることなくメッセージの送受信ができました。鍵配送問題も解決です。

ちなみに、公開鍵暗号で最も重要なことは秘密鍵の管理です。ボブはペアとなる秘密鍵を厳重に管理する必要があります。これが他人の手に渡ってしまえば暗号文が簡単に復号されてしまいます。

エスパくん

共通鍵暗号と公開鍵暗号のしくみを知ることで、LinuCの試験範囲に含まれるSSHにおける各種認証の理解も進みます。IPAの情報処理試験や民間のセキュリティ関連資格試験でも頻繁に取りあげられるのでエンジニアだけでなくセキュリティに関わる人にとっても必須の知識と言えそうです。

参考書籍