📑

従来の暗号化方式(公開鍵暗号・共通鍵暗号)

に公開

はじめに

現在広く利用されている暗号技術は、量子コンピュータの登場によって安全性が揺らぐ可能性があると指摘されています。
この問題への解決策として二つのアプローチが注目を集めています。
一つは、量子コンピュータでも解けない計算問題に基づいた「耐量子計算機暗号(PQC)」 です。
もう一つは、量子力学の原理を利用する「量子暗号(QKDなど)」 です。

私はこれらの最先端の暗号技術に強い関心があり、独学で得た知識を体系的に整理するために、記事シリーズとしてまとめています。

本記事では、PQCを理解するための土台として、まず従来の暗号技術の基盤である公開鍵暗号方式共通鍵暗号方式の仕組みを紹介します。
さらに、これらを応用した鍵共有デジタル署名メッセージ認証についても紹介します。

なお、これらの暗号方式の安全性を保証する数学的基盤については本記事では扱いません。
その内容に興味のある方は、以下の記事をご覧ください。

1. 公開鍵暗号の基本原則

公開鍵暗号は、 「公開鍵」「秘密鍵」 のペアを使う方式です。

  • 公開鍵:誰でも利用できる鍵
  • 秘密鍵:特定の人だけが保持する鍵

これにより、公開鍵で暗号化したデータはそのペアとなる秘密鍵でしか復号できない、という仕組みが成立します。

この安全性は、「公開鍵から秘密鍵を解読することが極めて困難」 であるという数学的性質に基づいています。困難」であるというのは、原理的には解読可能ですが、現実的には十分な計算時間が必要であることを意味します。

< 公開鍵暗号方式 >

公開鍵暗号方式を使って、データを安全に相手に送る手順は以下の通りです。

  1. データの受信者(サーバーなど)は、自分専用の「公開鍵」と「秘密鍵」を生成します。
  2. 受信者は「公開鍵」をデータの送信者(クライアント)に渡します。
  3. 送信者は送信したいデータを、受信者から受け取った「公開鍵」で暗号化します。
  4. 暗号化されたデータが受信者に送信されます。
  5. 受信者は自分の「秘密鍵」を使ってデータを復号し、元の内容を取り出します。

注:従来の暗号が安全である前提は「計算が極めて困難である」という数学的性質に基づいています。しかし、量子コンピュータの登場によってこの前提は揺らぐ可能性があります。この点についてはこちらの記事をご覧ください。

2.共通鍵暗号の基本原則

共通鍵暗号は、 「共通鍵」 を使って暗号化と復号を行う方式です。

  • 共通鍵:データの送信者と受信者があらかじめ共有している同じ鍵

共通鍵で暗号化されたデータは、その共通鍵(同じ鍵)を使うことで、元のデータに戻すことができます。そのため、暗号化と復号で同一の鍵を利用することから、「対称鍵暗号」とも呼ばれます。

この方式の利点は、計算処理が速いことです。そのため、インターネット通信やファイル暗号化など、さまざまな場面で広く使われています。
しかし、課題もあります。それは、この共通鍵を、どうやって安全に相手に渡す(共有する)か、という点です。鍵が途中で盗まれてしまうと、暗号化したデータも簡単に解読されてしまうため、鍵の安全な受け渡しが非常に重要になります。

< 共通鍵暗号方式 >

共通鍵暗号方式を使って、データを安全に相手に送る手順は以下の通りです。

  1. 「共通鍵」を生成します。
  2. 送信者と受信者は、同じ「共通鍵」を事前に共有します。
  3. 送信者はデータを「共通鍵」で暗号化します。
  4. 暗号化されたデータを受信者に送ります。
  5. 受信者は同じ「共通鍵」を使ってデータを復号し、元の内容を取り出します。

ストリーム暗号・ブロック暗号

共通鍵暗号方式におけるデータの暗号化アルゴリズムは、主にストリーム暗号ブロック暗号の二種類に分類されます。

  • ストリーム暗号

    • データを1ビットまたは1バイトといった小さな単位で区切り、鍵ストリームと呼ばれるビット列を使って逐次的(連続的)に暗号化・復号を行います。
    • ストリーム暗号では、あらかじめ長い乱数を渡すのではなく、短い鍵を共有し、その鍵をもとに疑似乱数生成器で長い乱数列(キーストリーム)を生成しています。
    • 代表例:RC4(現在では非推奨)
    1. 準備
      送信者と受信者はkビットの共通鍵skを共有します。
    2. 暗号化:送りたいnビットのメッセージm \in {0,1}^n
      • IVの用意:IVはその都度変わる値であり、秘密にする必要はないですが、送信者と受信者で同期する必要があります。
      • 乱数系列を生成:疑似乱数生成器Gを使用して、長い乱数列を生成します。

        r = G(sk||IV) = (r_1,r_2,...,r_n)

      • 暗号化:各単位ごとにXORを取ります。

        c_i = m_i⊕r_i(i=1,…,n)
        全体の暗号文 c = (c_1,c_2,...,c_n)

    3. 復号:受信側も同じ共通鍵skとIVからrを生成し、mを復元します。

      m_i = c_i⊕r_i(i=1,…,n) (XORは可逆)

  • ブロック暗号

    • データを決まったサイズのブロック(例えば64ビットや128ビット)に分割し、ブロック単位でまとめて暗号化・復号を行います。
    • 攻撃者が狙う直接的な目標は、暗号文c から対応する平文m や、暗号化に使われた鍵(共通鍵) k を取り戻すことです。
    • さらに危険なのは、単一の暗号文だけでなく、分割して暗号化された複数の暗号文{c_i}を手がかりにして、それに対応する平文の一部{m_i}や最終的に共通鍵 k を復元しようとする攻撃です。
    • 代表例:AES、DES
    1. 準備
      送信者と受信者は共通鍵kを共有します。
    2. 暗号化:送りたいメッセージm
      • c =Enk(k,m_t) = (c_1,c_2,...,c_t)
    3. 復号
      • m =Enk(k,c_t) = (m_1,m_2,...,m_t)

3. 鍵共有とデジタル署名・デジタル証明書

公開鍵暗号方式は 「鍵共有」「デジタル署名」、「デジタル証明書」 の用途でも使われます。

1. 鍵共有:安全と効率の両立

効率的な通信のためのハイブリッド方式

先ほど述べたように、実際のデータ通信では、共通鍵暗号方式の方が効率的です。公開鍵暗号方式は、共通鍵暗号方式よりも遥かに複雑で計算量の多い数学的処理に基づいているためです。

しかし、共通鍵暗号方式には 「安全に共通鍵を相手に渡す方法」 という課題があります。

これを解決する方法の一つとしてハイブリッド暗号があります。公開鍵暗号の仕組みを利用して通信の最初に共通鍵を安全に共有し、その後の大量のデータ通信は高速な共通鍵暗号で行います。

公開鍵暗号による共通鍵の共有

  1. データの受信者(サーバーなど)は、自分専用の「公開鍵」と「秘密鍵」を生成します。
  2. 受信者は「公開鍵」をデータの送信者(クライアント)に渡します。
  3. 送信者はその「公開鍵」で「共通鍵」を暗号化します。
  4. 暗号化された「共通鍵」を受信者に送ります。
  5. 受信者は自分の「秘密鍵」を使って、「共通鍵」を復号し、共通鍵を取り出します。

前方秘匿性の問題と鍵共有方式の進化

上記の方式でRSA暗号のような公開鍵暗号を使用すると、「前方秘匿性がない」という深刻な問題が発生します。

これは、もし攻撃者が長期的な受信者(サーバーなど)の秘密鍵を将来的に盗み出した場合、その秘密鍵を使って過去に盗聴・保存しておいた全ての通信の共通鍵を復号できてしまい、結果として過去の全通信内容が解読されてしまうというセキュリティ上の欠陥です。

そのため、ハイブリッド暗号の鍵交換部分にRSA暗号を用いることは、現在では推奨されていません

鍵を共有する目的であれば、必ずしも公開鍵暗号を使う必要はありません。この問題に対処するため、最近の通信では専用の鍵共有方式が採用されています。

実際に、最新の通信規格であるTLS 1.3では、上記のような公開鍵暗号を用いた鍵共有は使用されておらず、楕円曲線上のDiffie-Hellman鍵共有 (ECDH) という方式が採用されています。

ECDHの詳細はこちらの記事で述べていますが、以下ではその基礎となるDiffie-Hellman鍵共有について紹介します。

2. デジタル署名とデジタル証明書

公開鍵暗号方式は、データの改ざん防止送信者の正当性の証明 のためにも使われます。

  • デジタル署名

    • デジタル署名は、送信されてきたデータが間違いなく本人のものであるかを証明するための技術です。
    • 基本要素
      • 署名者:自分の署名鍵(秘密鍵)skを持ちます。
      • 検証者:署名者の検証鍵(公開鍵)vkを持ちます。
      • アルゴリズム:
        • Keygen:鍵ペア(skvk)を生成するアルゴリズム。
        • Sign:平文mと署名鍵skから署名σを生成するアルゴリズム。
        • Ver:署名σと検証鍵vkから、署名が**正しい(accept)か正しくない(reject)**かを出力するアルゴリズム。
    • 署名の仕組み(具体的な手順)
      1. ハッシュ値の計算:送信者は、送りたいデータ本体にハッシュ関数を適用し、そのデータの要約値(ハッシュ値) を計算します。
      2. 署名の生成:送信者は、そのハッシュ値を自分の「秘密鍵」 で暗号化します。この暗号化されたハッシュ値が「デジタル署名」となります。
      3. データ送信:送信者は、データ本体とデジタル署名をセットにして受信者に送ります。
      4. 検証:受信者は、以下の2つの値を照合します。
        • 受け取ったデジタル署名を、送信者の 「公開鍵」を使って復号して得られた値。
        • 受け取ったデータ本体を自分でハッシュ化して得られた値。
      5. 結果: この二つの値が一致すれば、以下の二点が同時に証明されます。
        • 「データが途中で改ざんされていないこと」(データの完全性)
        • 「署名者が秘密鍵の持ち主(送信者本人)であること」(送信者の認証)
  • デジタル証明書

    • デジタル証明書は、「この公開鍵が、本当に名乗っている本人(または組織)のものである」ことを認証局(CA) という信頼できる第三者が保証するために発行するものです。

    • 証明書の仕組み

      1. 申請:送信者は、自分の「公開鍵」と身元情報(名前や組織名など)を**認証局(CA)**に提出します。
      2. 本人確認:認証局は、提出された公開鍵が間違いなく本人のものであるかを厳正に確認します。
      3. 証明書の発行:認証局は、確認が取れた公開鍵と身元情報をまとめ、認証局自身の「秘密鍵」で署名を行い、「デジタル証明書」として発行します。
      4. 利用:送信者は、この証明書をデータやデジタル署名と一緒に受信者へ送ります。
      5. 信頼性の確認:受信者は、この証明書を通して、送られてきた送信者の公開鍵が信頼できるものであることを確認できます。

4.メッセージ認証・認証付き暗号

共通鍵暗号方式は、データの暗号化(秘匿性)だけでなく、「メッセージ認証」「認証付き暗号」 の用途でも使用されます。

1. メッセージ認証

メッセージ認証コード(MAC:Message Authentication Code) を利用することにより、二者間の通信において、なりすましや改ざんを検知できるようになります。

  • MACの仕組み(具体的な手順)

    1. 鍵の共有:送信者と受信者は、あらかじめ共通鍵 k を共有しておきます。
    2. タグの生成:送信者は、共通鍵 k と送りたいメッセージ(平文)m を使って、認証タグ T = \text{MAC}(k;m) を生成します。
    3. 送信:送信者は、メッセージ本体 m と認証タグ T をセットで送信します。
    4. 検証:メッセージとタグを受信した受信者は、受け取ったメッセージ m と共有鍵 k を使って、自分で新しいタグ T' = \text{MAC}(k; m) を計算します。
    5. 照合:計算したタグ T' が、受け取ったタグ T と一致すれば「認証成功(accept)」として、メッセージが改ざんされていないと判断します。一致しなければ「認証失敗(reject)」として、改ざんされたと判断します。
  • 攻撃者の狙い

    攻撃者の目的は、共有鍵 k を知らない状況で、これまでに盗聴したものとは異なる偽のメッセージ m' と、それに対応する偽のタグ T' を生成し、受信機に**認証成功(accept)**を出力させることです(これを「選択平文攻撃によるMACの偽造」といいます)。

  • MACの限界(否認防止の課題)

    ここで注意が必要なのは、メッセージ認証コードでは 「送信者と受信者が共に共通鍵 k を所有し、対等な立場である」 ということです。つまり、どちらもタグを生成できるため、二者間の争いを解決できません。たとえば、受信者が有効なメッセージとタグを持っていても、それを送信者本人が送ったことを証明することはできません。このため、送信者が「そのメッセージは送っていない」と否認(メッセージ送信の事実を否定すること)することを防げない、という限界があります

  • 代表的なMACの種類
    MACには、タグの生成にブロック暗号を用いたCBC-MACや、ハッシュ関数を用いたHMACなどがあります。

2. 認証付き暗号

共通鍵暗号はメッセージの秘匿性(中身を見せないこと)を保証しますが、改ざんされたかどうかは検知できません。逆に、MACは改ざん検知はできますが、メッセージの秘匿性はありません(メッセージ自体は平文で送られます)。

これらの互いの問題を解決し、秘匿性と認証の両方を同時に提供するために使用されるのが「認証付き暗号」です。

その中でもAEAD (Authenticated Encryption with Associated Data) と呼ばれる手法が代表的です。これは、メッセージの暗号化と認証の機能に加え、暗号化する必要はないが認証の対象としたいデータ(補助データ) も一緒に送ることができる、拡張性の高い手法です。


PKI(公開鍵基盤)

公開鍵を安全に利用するためには、その公開鍵が本物であり、正しい相手に属していることを確認する仕組みが必要です。その役割を担うのが PKI(Public Key Infrastructure) です。

PKIを構成する主な要素

  • 認証局(CA):証明書の真偽を保証する信頼できる第三者機関。
  • 証明書管理システム:証明書の発行、更新、失効などを管理するソフトウェア。
  • ディレクトリサービス:公開鍵や証明書を公開し、誰もが利用できるようにするデータベース。
  • 鍵管理システム(KMS):鍵の生成から保管、配布、更新、廃棄まで、鍵のライフサイクル全体を管理するシステムです。このKMSの一部として、秘密鍵を安全に生成・保管・利用するための鍵管理ハードウェア(HSM(ハードウェア・セキュリティ・モジュール)[^1]、スマートカード、USBトークンなど)が使用されます。

PKIは通信を暗号化するわけではなく、「誰が本物か」を保証する仕組みです。デジタル証明書を通じて通信相手の正当性を確認できることで、安全な通信や署名の信頼性が確保されます。


現在広く使用されている暗号化方式の仕組みと応用例を整理してきました。ただし、これらの技術は量子コンピュータの実用化によって安全性が損なわれる可能性が指摘されています。
この課題に対応する新しいアプローチとして、PQC(耐量子計算機暗号)量子暗号(QKDなど) が研究・標準化の対象となり、注目を浴びています。

本記事ではそれらの技術を詳しく掘り下げることはしませんが、より詳しく知りたい方は以下の記事をご覧ください。

Discussion