Web

公開鍵署名の文脈で使われる「公開鍵暗号は秘密鍵で暗号化し公開鍵で復号化できる」についての議論

2018年8月4日

「公開鍵暗号は秘密鍵で暗号化し公開鍵で復号化できる」

よく起きる議論ですが、良く忘れるので、自分のメモとして残しておきます。

公開鍵暗号システムと言った場合「公開鍵」で暗号化して「秘密鍵」で復号化するシステムを指します。

一度「公開鍵」で暗号化されたデータは、「秘密鍵」を持っている人しか復号化できません。

一方で公開鍵を使った署名の仕組みを解説する時に、「公開鍵暗号は秘密鍵で暗号化し公開鍵で復号化できる」と解説がよくあります。これが間違っている。という解説も同時によく見かけます。

WebでHome Page を公開しているシステムを考えると、Webブラウザはアクセスする Webサイトから証明書(=公開鍵を中に含む)を受け取り、ブラウザ側では、その「公開鍵」を使って自分のデータ(例えばログインユーザーIDやクレジットカード番号)を暗号化し、Home Page にデータを送ります。データは「秘密鍵」を持つ Home Pageをホストするサーバー側でしか復号化できません。

(と言いたい所ですが、正確に言うと、実際に行われているのは、Webサイトの証明書に含まれる「公開鍵」は、その後の「共通鍵」を交換するための手段として使われ、直接的にデータを暗号化するのには使われません。実際の暗号化に「公開鍵暗号」を使うのでは無く、その場で作成された「共通鍵」を使用するのは、共通の秘密鍵をその場で作成して暗号化に使い、通信完了後に鍵を破棄すればより、片割れが常にネットに公開されている「公開鍵」と違いまったく暗号の手がかりが残らず、暗号としてより強固になる。というメリットがあるためです。ここでは、現実世界のディーテイルについては、脇に置いておいて単純化された「公開鍵暗号」システムを考えます。)

ここで基本的な理解として重要なのは、公開鍵暗号化システムでは

  • 「公開鍵」→ 自分のデータを暗号化するのに使用する。
  • 「秘密鍵」→ 送られてきたデータを復号化するのに使用する。

という事です。

一方で、公開鍵署名の一つであるRSA署名では署名者は自分の「秘密鍵」で署名対象のデータを暗号化します。

その暗号化されたデータが「署名」になります。

その署名をした人は「公開鍵」を公開しています。

受け手側では、署名者が公開している「公開鍵」を使って「署名」を復号化して、署名されたデータと一致するか確認する。というプロセスを取ります。

RSA署名では、キーワード的には

  • 「秘密鍵」→ 暗号化
  • 「公開鍵」→ 復号化

と結びつきます。

これは、前述の公開鍵暗号化システムとは逆になっています。

これは、受け取った署名に対して「公開鍵と一緒に暗号化アルゴリズム」に渡して処理をすると「秘密鍵と一緒に復号化アルゴリズム」に渡して処理する前のデータが得られるという、RSA公開鍵暗号の特殊な性質を利用しています。

これは公開鍵暗号のどの方式でもできる事では無く、特定の公開鍵暗号だけに限られ、「公開鍵暗号では、公開鍵だけでなく、秘密鍵でも暗号化する事ができる」と般化してしまうと間違いになってしまいます。

ここでは簡単のために、元のデータを「秘密鍵」を使って何だかよくわからないものにしたものが「署名」なので、その作業を「暗号化」と呼びました。が、実はその処理には「復号化用の関数」を使用しています。

一方で、「署名」から「公開鍵」を使って元のデータに戻す事を「復号化」とここでは言いましたが、実はその処理は「暗号化用の関数」を使用しています。

この「暗号化」「復号化」という言い方がもう一つの議論の種になっており、次の議論へと続きます。

「秘密鍵で暗号化する」という表現についての議論

「公開鍵暗号は秘密鍵で暗号化し公開鍵で復号化できる」は前述したとおり一般化すると間違いです。これは RSA公開鍵の特徴です。

この表現にはもう一つ議論があります。「秘密鍵で暗号化する」もしくは「公開鍵で復号化する」という言い方です

「受け取った署名を「公開鍵と一緒に暗号化アルゴリズムで処理」をすると「秘密鍵と一緒に復号化アルゴリズムで処理」する前のデータが得られる」という、RSA公開鍵暗号の特殊な性質を分かりやすく説明するために「受け取った署名を「公開鍵で復号化」をすると「秘密鍵で暗号化」する前のデータ得られる」と解説しているところがたくさんあります。

と書いてみたものの、わかりにくいので両者の表現を並べてみます。

  • 受け取った署名を「公開鍵と一緒に暗号化アルゴリズムで処理」をすると「秘密鍵と一緒に復号化アルゴリズムで処理」する前のデータが得られる
  • 受け取った署名を「公開鍵で復号化」をすると「秘密鍵で暗号化」する前のデータが得られる

これらは同じ事を意味しています。

はじめに署名を作るために行っている作業は、オリジナルのデータを「秘密鍵」を使って謎の文字列にする事です。ですのでここで行われているのは謎の文字列を作り出す「暗号化」の作業です。

ですが、暗号化するために実際に行われているのは「データ」と「秘密鍵」を「復号化アルゴリズム」にパラメーターとして渡す事です。

ですので、正確に言うと「データと秘密鍵を一緒に復号化アルゴリズムにかける事データを暗号化している」という事になります。

署名を受け取った側で行われる作業は、よくわからない署名の値からオリジナルのデータを取りもどす「復号化」の作業です。ですがこの処理として実際に行われるのは、「署名の値」と「公開鍵」を「暗号化アルゴリズム」にパラメーターとして渡す事です。

ですので正確に言うと「署名と公開鍵を一緒に暗号化アルゴリズムにかける事データを復号化している」という作業をしています。

青色の部分だけ読むと「秘密鍵で暗号化」「公開鍵で復号化」になります。

でもかなりの部分を飛ばした読み方なので、この短い言葉が正しいイメージを想起させる言葉とは言いがたい表現になっています。

RSA署名で使われる概念は「秘密鍵」「公開鍵」「暗号化アルゴリズム」「復号化アルゴリズム」等、RSA公開鍵暗号の概念を用いています。

RSA公開鍵暗号で「暗号化アルゴリズム関数」を使うのは「暗号化」と言い、「復号化アルゴリズム関数」を使う事を「復号化」と言います。

ですので「RSA署名」で良く用いられる「秘密鍵で暗号化」と言うフレーズは「RSA公開鍵暗号」の頭で考えると「秘密鍵をパラメーターにRSAの暗号化アルゴリズム関数を使用する」と理解する事ができます。

が、実際、RSA署名で行われているのは「秘密鍵をパラメーターにRSAの復号化アルゴリズム関数を使用する」事です。

「RSA署名」で用いられる「秘密鍵で暗号化」というフレーズは、前半の「秘密鍵」に対しては「RSAの秘密鍵」のイメージを持ち、後半の「暗号化」に対しては「RSAの暗号化処理」ではなく「RSAの復号化処理」をイメージしなければいけないという頭の体操を必要とします。

間違ってはいないのですが、誤解が起きないようなもうちょっと直感的な言い方があればな。と思い、この記事の解説部分では「秘密鍵で復号化処理」「公開鍵で暗号化処理」という言葉を使ってみました。

絵的に暗号化 / 復号化しているのは見て取れるのでコメント部分は「復号化処理」「暗号化処理」とする事で、そこで行われている処理が RSAの復号化アルゴリズム / 暗号化アルゴリズムである事を明示的に示せれば。と思いました。

「公開鍵暗号」も「公開鍵暗号を使用した署名」のどちらのケースでも、「RSAの秘密鍵」と一緒に使われるのは「RSAの復号化アルゴリズム」で、「RSAの公開鍵」と一緒に使われるのは「RSAの暗号化アルゴリズム」になります。

created by Rinker
¥3,850 (2024/03/29 14:06:26時点 Amazon調べ-詳細)

-Web
-, ,

Copyright© エンジニアの何でもメモ帳 , 2024 All Rights Reserved.