📕

暗号化の入門 - Cyber Security Roadmap

に公開

暗号化

はじめに

インターネット上で安全にデータをやり取りできるのは、「暗号化」のおかげです。通信プロトコルを使ってユーザー同士が意図的に通信できたとしても、暗号化がなければ第三者にその通信を傍受されたり、不正に利用されたりするリスクが高まります。暗号化の技術があるおかげで、データのやり取りに伴うセキュリティリスクを大幅に軽減することが可能になっています。

個人的に暗号化は一見難しそうに感じる分野なのですが、仕組みを少しずつ理解すれば、その重要性と使いどころが見えてくるはずです。入門するためにこの投稿では、まず暗号化の根幹となりそうな部分を押さえていきます。

  • 基本的な用語理解(暗号化・ハッシュ化)
  • 暗号化の種類
  • 暗号化の重要性
  • プレーンなデータを暗号化する流れ
  • 暗号化と数学の関係
  • 暗号化とハッシュ化の観察

暗号化(Encryption)とは?

暗号化とは、データをそのままでは読めない形に変換する技術です。これにより、悪意のある第三者がデータを傍受しても内容を理解できないようにします。

  • 平文(Plaintext): 暗号化されていないそのままのデータ(例:HelloWorld
  • 暗号文(Ciphertext): 暗号化されたデータ(例:Xk32@fA9#

例えば、平文を暗号文に変換して通信することで、盗み見されても解読が難しい状態にします。この変換には、暗号化アルゴリズム(例:AESRSAなど)という一定の規則が使われます。これらのアルゴリズムはデータを保護する強力な仕組みです。

また、暗号文を元の平文に戻す作業は「復号化(Decryption)」と呼ばれます。復号化を行うには、送信者と受信者が共有する鍵(Key) が必要です。鍵は暗号化の中心的な役割を果たし、正しい鍵を持っている場合にのみ暗号文を平文に戻すことができます。

暗号化には大きく分けて以下の2種類があります(後の項でまた解説します):

  • 共通鍵暗号: 同じ鍵を使って暗号化と復号化を行います。
  • 公開鍵暗号: 暗号化に公開鍵、復号化に秘密鍵という異なる鍵を使用します。

一見複雑に思える暗号化ですが、鍵とアルゴリズムをおさえる事で仕組みを少しずつ理解していくことできます。

ハッシュ化(Hashing)とは?

ハッシュ化とは、データを特定のアルゴリズムを使って固定長のハッシュ値に変換する技術です。暗号化と異なり、ハッシュ化は一方向の変換であり、元のデータに戻す(復号化)ことはできません。

  • 入力データ(平文): HelloWorld
  • ハッシュ値(SHA256と呼ばれるハッシュ関数で変換):
    872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4

ハッシュ化は、元のデータに戻すことができないので「元のデータを知る必要がない」場合に安全で適切です。
具体的な用途としては以下です。

  1. パスワード管理

    • サービスのデータベースにパスワードを保存する際、平文のままデータベースに保存するのは危険です。代わりにハッシュ化された値を保存することで、データ漏洩時のリスクを軽減します。
    • 実際のサービスログイン時には、入力したパスワードをハッシュ化し、保存されたハッシュ値と比較する事で認証を行います。
  2. データの整合性チェック

    • ファイルを送信したり保存する際、改ざんや破損が発生していないかを確認するためにハッシュ値を使います。
    • 例:ファイルのダウンロード後に提供されたハッシュ値と計算したハッシュ値を比較して、一致すれば改ざんなしと判断できます。
  3. デジタル署名

    • メッセージや電子文書をハッシュ化し、署名を付加することで、送信元の正当性や改ざんの有無を証明します。

ハッシュ化は、暗号化と混同されやすいものですが用途に応じて使い分ける必要があります。
以下はその違いを示す表です:

項目 ハッシュ化 暗号化
目的 データの整合性チェックや改ざん検知 データを安全に送受信すること
一方向性 元に戻せない 鍵を使えば元に戻せる
鍵の必要性 不要 必要(暗号化と復号化に鍵を使用)
用途 パスワード管理、改ざん検知 通信データの保護(例:HTTPS、SSH)

暗号化の種類

暗号化には主に2つの種類があり、それぞれの特徴があります。

1. 共通鍵暗号化(Symmetric-key Encryption)

送信者と受信者が同じ鍵を使って暗号化と復号化を行う方式です。

  • 特徴:
    • データを送信する前に、鍵を安全に共有する方法を考える必要があります。
    • 処理が高速なため、大量のデータを扱う場合に適しています。
    • : AES(Advanced Encryption Standard)

イメージ:
1つの金庫を共有する場面を想像してください。その金庫を開ける鍵を、両者が事前に持つ必要があります。ただし、その鍵を他人(泥棒やストーカー)に盗まれないよう、渡す方法に工夫が必要です。

2. 公開鍵暗号化(Asymmetric Encryption)

送信者と受信者が異なる鍵を使う方式です。

  • 鍵の種類と仕組み:

    • 公開鍵: 誰でも使用可能な鍵で、データの暗号化に使います。
    • 秘密鍵: 受信者だけが持つ鍵で、暗号化されたデータを復号化します。
  • 特徴:

    • 鍵を事前に共有する必要がないため、安全に通信を始められます。
    • 共通鍵暗号化より処理速度は遅いですが、非常に高い安全性を持っています。
    • : RSA(Rivest-Shamir-Adleman)

イメージ:
郵便BOXを想像してください。誰でもそのBOXに手紙を投函(暗号化)できますが、中身を取り出す(復号化)には受信者だけが持つ鍵が必要です。公開鍵は郵便BOXの投入口、秘密鍵は鍵付きの開閉口のようなものです。

3. ハイブリッド暗号化(Hybrid Encryption)

実は現代はこのハイブリッド暗号化が主流となっていますが、使用しているのは共通鍵暗号化と公開鍵暗号化の技術です。
共通鍵暗号化と公開鍵暗号化を組み合わせいいとこ取りをした暗号化と言えます。この暗号化は、トランスポート層で用いられるTLS(Transport Layer Security)でも採用されています。

  • 仕組み:

    1. 公開鍵暗号化を利用して、安全に共通鍵を交換します。
    2. その後のデータ通信では、処理が高速な共通鍵暗号化を使用します。
  • 利点:

    • 公開鍵暗号化の安全性を利用し、鍵共有のリスクを低減。
    • 共通鍵暗号化の高速性を活かし、大量データの効率的な暗号化を実現。

実例:
HTTPS通信(TLSを使用)では、最初に公開鍵暗号化で共通鍵を交換し、その後のデータ通信に共通鍵暗号化(AESなど)が使われています。これにより、安全かつ効率的な暗号化通信が可能になります。

プレーンなデータを暗号化する流れ

ここで一旦、暗号化の基本的なプロセスを整理してみます。

1. 暗号化するデータ(平文)を用意

最初に、暗号化する対象となるデータ(平文)を用意します。これは、メール本文、パスワード、機密情報など、あらゆる形式のデータが該当します。

  • :
    平文: HelloWorld

2. 暗号化アルゴリズムを選択

次に、データを暗号化するためのアルゴリズムを決定します。アルゴリズムは、データを変換するためのルールや手順を定義します。

  • 共通鍵暗号化(対称暗号): AES(高速で大量データに適する)
  • 公開鍵暗号化(非対称暗号): RSA(安全な鍵交換に適する)

3. 鍵を生成または取得

暗号化の鍵を用意します。この鍵がないと、データの復号化ができません。

  • 共通鍵暗号化:

    • 送信者と受信者が事前に共有した同じ鍵を使用します。
    • : 123456789abcdef
  • 公開鍵暗号化:

    • 暗号化には受信者の公開鍵を使用し、復号化には受信者だけが持つ秘密鍵を使用します。

4. 暗号化の実行

平文と鍵をアルゴリズムに入力し、暗号化を実行します。これにより、読解不能な暗号文が生成されます。

  • :
    • 平文: HelloWorld
    • 鍵: 123456789abcdef
    • アルゴリズム: AES
    • 暗号文: Xk32@fA9#

5. 暗号文を送信

生成された暗号文を相手に送信します。この暗号文は正しい鍵がなければ解読できないため、盗聴されても安全です。

6. 復号化して平文を取得

受信者は暗号文を復号化し、元の平文を再現します。この作業では、正しい鍵とアルゴリズムが必要です。

  • 共通鍵暗号化: 送信者と同じ鍵を使用。
  • 公開鍵暗号化: 受信者が自分の秘密鍵を使用。

この流れを押さえておくと、暗号化がどのようにデータの安全性を守るか理解しやすくなります。また、アルゴリズムや鍵の役割がセキュリティの要であることがわかります。第三者にデータが傍受され、かつアルゴリズムや鍵がわかっている場合、簡単に復号化されてしまいます。

公開鍵暗号とSSH

SSH(Secure Shell)は、リモートコンピュータに安全にアクセスするためのプロトコルで、通信を暗号化することで盗聴や改ざんを防ぎます。主にリモートサーバーの管理やファイル転送に使用され、一般的に OpenSSH などのソフトウェアを利用して実現されます。

SSHの認証方式にはいくつかの種類がありますが、特に公開鍵暗号を用いた認証が一般的に広く利用されています。少しSSHを深掘りして公開鍵暗号への理解を深めてみます。

安全にアクセスするとは?

SSHで「安全」とは、主に以下の2つのリスクを防ぐことを意味します。

  1. 通信データの盗聴や改ざんの防止(暗号化)

    • SSHは通信を暗号化することで、第三者がデータを盗み見たり改ざんしたりすることを防ぎます。
    • これを実現する技術の一つが 公開鍵暗号方式 です。
  2. 成りすましや誤ったリモートコンピュータへのアクセスの防止(認証)

    • SSHでは、クライアントとサーバーの両方が相互に認証し、正しい相手と通信していることを確認します。
    • これには 公開鍵認証方式ホスト鍵の確認(known_hosts への書き込み) が用いられます。

公開鍵暗号の仕組み

公開鍵暗号とは、「暗号化」と「復号」に異なる鍵を使用する暗号方式 です。
これには 公開鍵(Public Key)秘密鍵(Private Key) のペアがあり、それぞれ次のような役割を持ちます。

  • 公開鍵(サーバーや相手に渡しても問題ない鍵)

    • メッセージの暗号化に使用される。
    • 誰でもアクセス可能。
  • 秘密鍵(所有者のみが保持する鍵)

    • メッセージの復号に使用される。
    • これを第三者に渡すとセキュリティが破られる。

具体的な流れ

  1. クライアントがサーバーの公開鍵を取得し、それを使って送信データを暗号化。
  2. サーバーが自身の秘密鍵を使ってデータを復号し、元のメッセージを得る。

これにより、仮に通信途中でデータが盗まれても、秘密鍵がなければ解読できないため、安全にやり取りすることができます。

公開鍵認証方式の仕組み

SSHでは、パスワードの代わりに公開鍵認証方式を用いることで、安全かつ手間の少ないログインが可能になります。

認証の流れ

  1. クライアントが鍵ペア(公開鍵・秘密鍵)を生成

    • ssh-keygen コマンドで作成。
  2. 公開鍵をサーバーに登録

    • クライアントの公開鍵(id_rsa.pub)を、サーバーの ~/.ssh/authorized_keys に追加。
  3. ログイン時の認証プロセス

    • クライアントがSSH接続を試みると、サーバーがランダムなデータ(チャレンジ)を送信。
    • クライアントは自身の秘密鍵でそのデータを暗号化して返信。
    • サーバーが公開鍵でそのデータを復号し、正しい秘密鍵を持つクライアントであることを確認。

この仕組みにより、秘密鍵がクライアントにしか存在しないため、不正なアクセスを防ぐことができます

SSH関連のファイルと役割一覧(補足)

SSHでは、認証や通信のセキュリティを確保するために、さまざまな設定ファイルや鍵ファイルが使用されます。以下はそれらの主なファイルとその役割です。

ファイル名 役割 場所 説明
~/.ssh/id_rsa 秘密鍵(Private Key) クライアント SSH公開鍵認証の際に使用される秘密鍵。他人に漏洩しないように厳重に管理する必要がある
~/.ssh/id_rsa.pub 公開鍵(Public Key) クライアント SSHサーバーに登録し、秘密鍵とセットで認証を行うための鍵。~/.ssh/authorized_keys に追加することでログイン可能になる。
~/.ssh/authorized_keys 認証用の公開鍵リスト サーバー クライアントの公開鍵を登録するファイル。ここに登録された公開鍵を持つクライアントのみSSHログインを許可する。
~/.ssh/known_hosts 既知のホスト情報 クライアント 初回接続時にサーバーのIPやホスト鍵を保存し、次回以降の接続時に一致するか検証することで成りすましを防ぐ。
/etc/ssh/sshd_config SSHサーバーの設定ファイル サーバー SSHサーバーの動作を制御する設定ファイル。ポート番号、認証方式、ルートログイン許可/禁止などを設定可能。
/etc/ssh/ssh_config SSHクライアントの設定ファイル クライアント クライアント側のSSH設定を管理。デフォルトのユーザー名やポート番号を設定できる。
/etc/ssh/ssh_host_rsa_key サーバーのホスト鍵(秘密鍵) サーバー SSHサーバーが自分自身を識別するための秘密鍵(RSA方式)。
/etc/ssh/ssh_host_rsa_key.pub サーバーのホスト鍵(公開鍵) サーバー クライアントに提示するサーバーの公開鍵。クライアントがknown_hosts に登録して信頼する。
/etc/ssh/moduli 暗号パラメータ サーバー SSHで使用するDiffie-Hellman鍵交換用の素数リスト。セキュリティを高めるために使用される。
/etc/ssh/sshrc SSHログイン時のスクリプト サーバー ユーザーがSSHログインした際に実行されるスクリプト。環境変数の設定やログの記録などが可能。
~/.ssh/config 個別のSSH設定 クライアント クライアントごとに異なるSSH設定を行うためのファイル。例えば、特定のホストに対してデフォルトのユーザー名やポートを指定できる。

暗号化と数学の関係

暗号化技術は、高度な数学を基盤に構築されています。暗号化アルゴリズムは、複雑な数学的理論や計算を駆使して設計されており、これによってデータの安全性が確保され、第三者による解読が極めて困難になります。その強度は、使用されるアルゴリズムの難解さに依存し、解読には膨大な計算を必要とするように設計されています。

例えば、RSA暗号では、2048ビットの鍵を解読するために最先端のスーパーコンピュータでも何千年もの計算が必要とされています。
少し極端な例かもしれませんが、高度な数学が用いられたアルゴリズムは、とても一般的なコンピュータでは処理しきれないことがわかります。

一方で量子コンピュータの登場が暗号化技術に新たな課題を突きつけています。この次世代コンピュータは、現在の暗号化アルゴリズムの基盤である数学的難問(素因数分解や離散対数問題)を効率的に解く可能性があり、既存の暗号技術に対するリスクが高まっています。

このように暗号化は単なるデータ保護技術ではなく、数学的な難問を利用した非常に洗練された仕組みです。数学を基盤とするこれらのアルゴリズムにより、データの安全性が確保されている一方で、新しい技術の登場による課題にも対応する必要があります。アルゴリズムを掘り下げていくことで、暗号化と数学の関係性や課題について深く知ることができ、知識を深めることができます。数学が好きな人はぜひ掘り下げてみてください。

暗号化とハッシュ化の観察

暗号化がどのように動作しているのかを体験してみましょう。Wiresharkを使って、HTTPS通信や暗号化プロトコルの動作を観察できます。
Wiresharkでのパケットキャプチャ方法は、Day 20: Wireshark入門 - ネットワーク解析ツールの基礎
などで確認できます。

  1. HTTPS通信で暗号化の観察:

    • WebブラウザでHTTPS対応サイト(例:https://www.google.com)にアクセス。
    • WiresharkでSSL/TLS通信のパケットを観察してみる。
  2. ツールでハッシュ化の観察:

    • オンラインハッシュツール(例:https://passwordsgenerator.net/sha256-hash-generator/)で、自分の名前をSHA256に変換。
    • 複数回変換し、入力が同じなら結果が同じになることを確認。

まとめ

今回の投稿では、暗号化の基本や仕組み、ハッシュ化との違い、そして数学的との関係など入門的な部分を意識して学びました。
次回の投稿では、さらに暗号化やハッシュについて掘り下げていきます。

Discussion