暗号と署名

14.7.1. 暗号と署名

安全な通信のためには、通信の暗号化だけではなく、通信相手の認証、偽造の防止など、さまざまな観点で危険を排除することが必要です。 ユーザのインターネット利用時の安全を支えている HTTPS も、これらの技術の組合せで安全を担保しています。

基本の技術として以下の二つの技術があります

  • 暗号化と復号
  • 電子署名

これらの技術は、次のページで実際に体験可能です。

暗号 #

暗号は、データの暗号化と復号を提供する手順です。 秘密のデータをコンピュータに保存したり、通信で送る際に暗号化しておけば、盗聴されても盗聴者が復号できない、できてもとても時間がかかるといった効果を期待できます。

暗号化とは、情報を規則に従って変換して、特別な情報がないと元の情報に復元できないようにすることです。 暗号化された情報をもとの情報に戻すことを復号と呼びます。対称ではありませんが、 を復号にはつけない慣習です。

stateDiagram-v2 state "平文" as plain state "暗号文" as encrypted plain --> encrypted : 暗号化 +鍵 encrypted --> plain : 復号 +鍵'

現代の暗号では、暗号化や復号の手順は公開します。
多くの専門家が検証した手順の方が安全であると考えられているためです。 言葉を換えると、手順を秘匿にしたため検証したのは発案者のみであるような暗号手順はリスクが高いと考えていることになります。

秘密にするものは、復号に使う というデータです。

暗号の方式は、共通鍵暗号方式と公開鍵暗号方式に大別されます。 前者では、暗号化に使う鍵が分かると復号に使う鍵も分かるため、暗号化に使う鍵も秘匿する必要があります。 後者では、そのような危険がないため、公開鍵を秘匿する必要がありません。

共通鍵暗号 #

普通の人が思いつく暗号は、共通鍵暗号と思われます。

簡単な例として、 1文字ずつおきかえる換字暗号であれば、どの文字をどの文字で置き換えるかという換字表が暗号化の鍵になります。 復号の際は同じ表を使って、逆向きの換字を行います。
a b .. y z
b c .. z a
この表の場合は、文字をずらしているだけなので、ずらす数 1 が鍵であるとも言えます。

次のボタンから、文字をずらす変換を Colab で試すことができます。 HWB-Caesar.ipynb

分かりやすさのために換字暗号で例を紹介しましたが、換字暗号は安全ではありません。 鍵を知らなくても対応を全部試せば解ける (鍵空間が狭い) とか、文字毎の変換では統計情報がそのまま保存される (e.g., 英文ではeが多い) など、いろいろな弱点があります。

安全な共通鍵暗号には、たとえば AES256 があります。

どのアルゴリズムでも共通鍵暗号の場合は、 暗号化する側と復号する側で、あらかじめ鍵を共有する必要があります。 人同士の場合は、この点が、困る点になります (鍵配送問題と言います)。 コンピュータ同士なら、その場で安全に使い捨ての鍵を決める、鍵交換アルゴリズムも利用可能です。

公開鍵暗号 #

公開鍵暗号では、公開鍵秘密鍵 のペアを作り、次のように使います

公開鍵 秘密鍵
機能 暗号化専用 復号専用
所有者 送信者 (多数) 受信者 (1人)

錠前 (南京錠) だけ配って、鍵を自分だけが持つことと似ています。

公開鍵は暗号化専用で復号できないということは、慣れないと戸惑うかもしれません。 たとえば電子メールでは、送信したコピーを取っておくと便利ですが、公開鍵で暗号化した場合はそのコピーを送信者は読めません。 また複数人に同報することも電子メールでは多いですが、公開鍵暗号を使う場合は、受信者毎に別々に暗号化して送付する必要があります。

有名な公開鍵暗号には RSA や楕円曲線暗号があります。

RSAのアイデア

そんな暗号方式が可能なの? という疑問ももっともなので、公開鍵暗号普及のきっかけとなった、 RSAのアイデアを紹介します。 整数 1つを暗号化する前提で、以下のような数 (e, d, n) を探します。

\[(m^e)^d \equiv m \pmod n \;\; \forall m <n \]

そして公開鍵を (e, n)、秘密鍵を d とします。d は mod n の世界で e乗の逆演算になっていることを上の式は示しています。

暗号化は送りたい数 (平文) を 冪乗します

$$\text{暗号文} = (\text{平文}^e) ; \mod n$$

復号は暗号文を秘密鍵 d で冪乗します

$$\text{平文} = (\text{暗号文}^d) ; \mod n$$

公開鍵では復元が難しいことを確認しましょう。mod n の世界でe乗するという手順とデータ n, e が公開されているので底を e として log 暗号文 をmod n の世界でとれれば平文を復元できます。これを離散対数問題と言います。 (e, d, n)を大きな数でうまくつくると、現時点ではよい計算方法が知られていません。 量子コンピュータが実用化されたら解けるのではないかと言われていますが、その場合も別の公開鍵暗号手順を使えば問題ありません。

公開鍵から秘密鍵を予想できないため、公開鍵をウェブや電子メールで配ることができます。 一方、公開鍵は配布する人ではなく、受け取る人にリスクがあります。 偽の公開鍵を掴まされて伝える相手を間違えては、どんな暗号化をしても、秘密がすべて漏れてしまいます。 人の世界でも電話でのオレオレ詐欺など相手を誤認識する被害がありますが、 コンピュータが自動通信を使う場合は、(表情や声色など非言語情報をもともと使えないので)、より慎重に公開鍵を確認する必要があり、ここで電子署名が活用されます。

ハイブリッド暗号
公開鍵暗号は共通鍵暗号に比べて暗号化、復号に時間がかかります。そこで、共通鍵暗号化方式につかう鍵を公開鍵暗号化方式で安全に送り、そのあとは比較的高速な共通鍵暗号で通信するハイブリッドな暗号も行われます。たとえば、安全なリモートログインをするときに使われる SSH も、そのような方式をとっています。

電子署名 #

電子署名も、公開鍵秘密鍵 のペアを作り、次のように使います。

公開鍵 秘密鍵
機能 署名検証専用 署名作成専用
所有者 受信者 (多数) 送信者 (1人)

公開鍵暗号のときと比較すると、秘密鍵を秘密に保つ点は共通ですが、送信者と受信者が逆で秘密鍵所有者からメッセージを送っていることに注意してください。

次のように使います

  • 送信者のみが秘密鍵を持ち、受信者は (本人の) 公開鍵を持っている
  • 送信者は、メッセージ本文を送る際に、署名を計算し付加して、メッセージ本文と一緒に送る
  • 受信者は、受信したメッセージ本文と署名を公開鍵で照合し、メッセージ本文が公開鍵に対応する秘密鍵所有者が署名したことを確認する

大雑把には、本文を本人が書いたことを確認し、偽造されていれば見抜けます。ただし、送信者の秘密鍵を別の人が持っていたり、受信者が偽の公開鍵を持っていた場合は無力です。

RSAでは、暗号用の鍵ペアで署名にも使えます。 このとき秘密鍵と公開鍵は対称に使えるので、秘密鍵で本文に対応するデータを暗号化することがほぼ署名になります。 他の署名アルゴリズムの場合は、秘密鍵所有者のみが行える計算結果を付与し、公開鍵で確認します。

電子証明書とPKI #

公開鍵が本物であるかどうかが

参考書籍 #

要点のみを紹介しているので、正確なところは書籍で確認してください。

結城浩『暗号技術入門 第 3 版』(SB クリエイティブ)

光成滋生 「クラウドを支えるこれからの暗号技術」(秀和システム) PDF 版がダウンロードでき、書店でも書籍版を購入できます。

暗号化と電子署名 暗号と署名 共通鍵暗号の体験