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

投稿日:2018年08月04日

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

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

公開鍵暗号と言った場合「公開鍵」で暗号化して「秘密鍵」で復号化するシステムを指します。
一度「公開鍵」で暗号化されたデータは、「秘密鍵」を持っている人しか復号化できません。

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

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の暗号化アルゴリズム」になります。

Tags: , , ,