「公開鍵暗号は秘密鍵で暗号化し公開鍵で復号化できる」
よく起きる議論ですが、良く忘れるので、自分のメモとして残しておきます。
公開鍵暗号システムと言った場合「公開鍵」で暗号化して「秘密鍵」で復号化するシステムを指します。
一度「公開鍵」で暗号化されたデータは、「秘密鍵」を持っている人しか復号化できません。
一方で公開鍵を使った署名の仕組みを解説する時に、「公開鍵暗号は秘密鍵で暗号化し公開鍵で復号化できる」と解説がよくあります。これが間違っている。という解説も同時によく見かけます。
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の暗号化アルゴリズム」になります。