非対称暗号化での暗号化と署名の違いは何ですか?


297

一部のデータの暗号化と一部のデータの署名(RSAを使用)の違いは何ですか?

それは単に公開鍵と秘密鍵の役割を逆にするだけですか?

たとえば、私だけが送信者になることができるように、私は秘密鍵を使用してメッセージを生成したいと考えています。私は自分の公開鍵を使ってメッセージを読んでもらいたいのですが、誰がそれらを読んでもかまいません。特定の情報を暗号化して、ソフトウェアのプロダクトキーとして使用したい。これらを生成できるのは私だけであることだけを気にします。公開鍵をソフトウェアに含めて、鍵の署名を復号化/読み取りたいのですが。誰がキーのデータを読み取ることができるかは気にしません。私がそれらを生成できる唯一の検証可能な人であることだけを気にします。

このシナリオでは署名は役に立ちますか?

回答:


441

暗号化するときは、公開鍵を使用てメッセージを書き込み、秘密鍵を使用しメッセージを読み取ります。

署名するとき、あなたは秘密鍵を使ってメッセージの署名を書き、彼らはあなたの公開鍵を使っそれが本当にあなたのものであるかどうかをチェックします。

私だけが送信者になることができるように、秘密鍵を使用してメッセージを生成したいと思います。

メッセージの読み取りに公開鍵を使用したいのですが、誰がメッセージを読んでもかまわない

これは署名です。秘密鍵を使用して行われます。

特定の情報を暗号化して、ソフトウェアのプロダクトキーとして使用したい。

これらを生成できるのは私だけであることだけを気にします。

自分だけに知っておく必要がある場合は、これを行うためにキーをいじる必要はありません。ランダムなデータを生成してデータベースに保存するだけです。

しかし、キーが本当に自分のものであることを人々に知らせたい場合は、ランダムなデータを生成し、データベースに保存して、キーで署名する必要があります。

公開鍵をソフトウェアに含めて、鍵の署名を復号化/読み取りたいのですが。

おそらく、VerisignやThawteなどの商用プロバイダーから公開鍵の証明書を購入する必要があります。そうすることで、誰もあなたのソフトウェアを偽造して自分の公開鍵を自分のものに置き換えていないことを人々が確認できるようになります。


7
技術的に言えば、秘密キーを使用してメッセージの署名を書き込むとは、メッセージのハッシュが私の秘密キーで暗号化されているということですか?
Andy Ibanez

4
@AndyIbanez:暗号化されるもの(ダイジェスト)には、タイムスタンプとランダムなソルトも含まれる場合がありますが、そうです。
Quassnoi、2015年

7
@Quassnoi実際、「秘密鍵で署名する」とは、「暗号化」ではなく「復号」を意味します。大まかに言えば、メッセージに署名することは、秘密鍵で復号化することと同じであり、受信機では公開鍵で暗号化することで、ハッシュが同じになり、比較することができます。
ジョニーウィラー2015年

5
@JohnnyWiller:@slimが後述するように、数学的コアは暗号化関数と復号化関数の両方で同じです。彼らは同じ関数で、別々の機能ではありませんf(key, message)ように、f(private, f(public, message)) === f(public, f(private, message)) === message
Quassnoi

2
@ハニーいいえ、そうではありません。鍵ペアの生成は無料です。コストは、署名が本当にあなたのものであると他の人に信じさせることに関係しています。それを行うには、以前に無料で生成した公開鍵自体を所持しています。
Quassnoi

143

RSAクリプトでは、キーペアを生成するときに、公開キーとして選択するものと秘密キーを完全に任意にすることができます。一方を使用して暗号化すると、もう一方を使用して復号化できます-双方向で機能します。

したがって、受信者の公開鍵を使用してメッセージを暗号化し、受信者が秘密鍵を使用してメッセージを復号化する方法を確認するのはかなり簡単です。

署名は、署名者が何らかの公開鍵と一致する秘密鍵を持っていることの証明です。これを行うには、その送信者の秘密キーでメッセージを暗号化し、プレーンテキストバージョンと一緒に暗号化バージョンを含めるだけで十分です。送信者を確認するには、暗号化されたバージョンを復号化し、プレーンテキストと同じであることを確認します。

もちろん、これはあなたのメッセージが秘密ではないことを意味します。公開鍵はよく知られているため、だれでも解読できます。しかし、そうすることで、暗号文の作成者が対応する秘密鍵を持っていることが証明されました。

ただし、これは送信のサイズを2倍にすることを意味します-平文と暗号文を一緒にします(署名の検証に興味のない人にメッセージを読んでもらいたい場合)。そのため、代わりに、通常、平文のハッシュを作成することによって署名が作成されます。偽のハッシュを作成できないことが重要なので、SHA-2などの暗号化ハッシュアルゴリズムが使用されます。

そう:

  • 署名を生成するには、平文からハッシュを作成し、秘密鍵で暗号化し、平文と一緒に含めます。
  • 署名を検証するには、平文からハッシュを作成し、送信者の公開鍵で署名を復号化し、両方のハッシュが同じであることを確認します。

8
@headcode は非対称キーにのみ適用されます。対称キーはペアになりません。
2015

3
実際、これはRSAキーにのみ適用されます。たとえば、ECDSA鍵を使用すると、秘密鍵から公開鍵を簡単に生成でき、秘密鍵はスカラーであり、公開鍵は座標です。
David Schwartz 2016年

5
どのようにしてPUBLICキーでメッセージを復号化できますか?メッセージは秘密鍵でのみ復号化されませんか?
daremkd

3
この回答矛盾5つの源12345
wha7ever

6
パブリックとプライベートのどちらを呼び出すかは任意ではありません。秘密鍵から公開鍵を生成できますが、公開鍵から秘密鍵を生成することはできません。それは大きな違いではないですか?
グレッグシュミット

23

安全な通信を確立するには、2つの異なるが密接に関連する問題があります。

  1. データを暗号化して、許可された人だけがデータを復号化して読み取ることができるようにします。
  2. 送信者の身元/認証を確認します。

これらの問題はどちらも、公開鍵暗号を使用してエレガントに解決できます。

I.データの暗号化と復号化

アリスは、誰も読むことができないはずのメッセージをボブに送信したいと考えています。

  • アリスはボブの公開鍵でメッセージを暗号化して送信します。
  • ボブはメッセージを受信し、自分の秘密鍵を使用してメッセージを復号化します。

AがメッセージをBに送信する場合、AはBの公開鍵(誰でも公開されている)を使用する必要があり、Aの公開鍵も秘密鍵もここでは表示されません。

したがって、私にメッセージを送信する場合は、私が提供する公開鍵を知って使用する必要があります。対応する秘密鍵にアクセスできるのは私だけなので、私だけがメッセージを復号化できます。

II。送信者の身元を確認する(認証)

アリスはボブにメッセージを送りたいと思っています。データを暗号化する問題は、上記の方法を使用して解決されます。

しかし、アリスとボブの間に座って、自分を「アリス」としてボブに紹介し、アリスが送信したメッセージを転送する代わりに自分のメッセージをボブに送信するとどうなるでしょうか。Aliceから送信された元のメッセージ(ボブの秘密鍵へのアクセスが必要)を解読して読み取ることはできませんが、それらの間の会話全体をハイジャックしています。

ボブが受信しているメッセージが実際にアリスによって送信されたことをボブが確認できる方法はありますか?

  • アリスは自分の秘密鍵でメッセージに署名し、それを送信します。(実際には、署名されるのはメッセージのハッシュです(例:SHA-256またはSHA-512)。)
  • ボブはそれを受け取り、アリスの公開鍵を使用してそれを検証します。アリスの公開鍵がメッセージの検証に成功したので、ボブはメッセージがアリスによって署名されたと結論付けることができます。

1
メッセージに署名するとき、実際のメッセージ自体または暗号化されたメッセージに署名しますか?
FrostyStraw 2018年

21

ええ、データに署名することは、他の誰も持っていない独自のワックススタンプを与えることと考えてください。誠実さと否認防止を達成するために行われます。暗号化されているため、他の誰もデータを見ることができません。これは機密性を達成するために行われます。ウィキペディアを参照してくださいhttp://en.wikipedia.org/wiki/Information_security#Key_concepts

署名は、秘密鍵を使用して署名されたメッセージのハッシュです。


16

署名は、公開鍵で検証できる秘密鍵で「ハッシュ」を生成します。テキストは平文で送信されます。

暗号化では、受信者の公開鍵を使用してデータを暗号化します。復号化は秘密鍵で行われます。

そのため、キーの使用は逆になりません(そうしないと、秘密キーはもう秘密になりません!)。


通常の非対称暗号化では、暗号化は秘密鍵ではなく受信者の公開鍵で行われます。
mmcdole 2009年

この質問が特にRSAに関するもので、キーの使用逆になっていて、秘密キーを危険にさらさないことを見逃しましたか?
David Schwartz

8

公開鍵暗号で署名を使用する方法と理由を正確に説明しています。他の人から提供された任意のメッセージに署名(または暗号化)することは非常に危険であることに注意してください。これにより、鍵を危険にさらす可能性のあるアルゴリズムへの攻撃が可能になります。


1
SSLを使用する場合、Webブラウザーは任意のデータを暗号化しませんか?
Ian Warburton、

2
@IanWarburton:しかし、彼らはそのために非対称暗号化を使用していません。実際のデータ転送では、ランダムに生成されたセッションキーを使用した対称暗号化が使用されます。
Michael Borgwardt

1
@IanWarburton:いいえ、どちらも攻撃者によって選択されないためです。危険は、攻撃者から直接提供されたものを暗号化または署名することにあります。これは、意図的に巧妙に作成されて秘密鍵に関する情報を明らかにしたり、署名するつもりのないものに対して有効であるように見える署名を作成したりするためです。RSAで後者のケースがどのように機能するかの詳細な内訳は、次のとおり
Michael Borgwardt

2
@IanWarburton:これが、RSAがパディングを必要とする理由です。したがって、選択したメッセージのみを暗号化することはありません:en.wikipedia.org/wiki/…-しかし、実際には、選択した入力に対して特に脆弱な秘密鍵(署名など)を伴う操作です。
Michael Borgwardt

1
@IanWarburton私は暗号化の専門家ではありませんが、私が理解している限り、問題は発生しません。
Michael Borgwardt

8

署名は、あなたが本当に署名されたオブジェクトのソースまたは保証であることを示します。ただし、誰でもオブジェクトを読み取ることができます。

暗号化とは、対応する秘密鍵を持つユーザーのみがそれを読み取ることができることを意味しますが、署名なしでは、暗号化されたオブジェクトの背後にいることは保証されません。


メッセージが公開鍵で復号化された場合、私だけが送信できました。(私の秘密鍵が危険にさらされていないと想定)
Dojo

5

一部のデータの暗号化と一部のデータの署名(RSAを使用)の違いは何ですか?

暗号化はメッセージ(「一部のデータ」)の機密性を保持しますが、署名は否認防止を提供します。つまり、署名したエンティティのみが署名できます。機能的な違いもあります。読む。

それは単に公開鍵と秘密鍵の役割を逆にするだけですか?

絶対違う。署名と復号化に同じ秘密鍵を使用すること(または同様に、検証と暗号化に同じ公開鍵を使用すること)は、目的を混同してはならないため、推奨されません。これはそれほど数学的な問題ではなく(RSAは依然として安全である必要があります)、キーの管理に関する問題です。たとえば、署名キーは有効期間が短く、使用前に保護を強化する必要があります。

同じメッセージの場合、署名には送信者の秘密鍵を使用し、暗号化には受信者の信頼できる公開鍵を使用する必要があります。通常、署名後暗号化が使用されます。それ以外の場合、攻撃者は署名を自分のものに置き換えることができます。同様に、復号化には受信者の秘密鍵を使用し、検証には送信者の信頼できる公開鍵を使用する必要があります。

さらに、署名の生成は「秘密鍵による暗号化」を使用しないことを理解する必要があります。すべてのRSA操作はモジュラ指数に基づいていますが、パディング方式は署名の生成ではまったく異なります。さらに、公開鍵は、RSAのすべての実用的な用途において、RSA秘密鍵とはまったく異なる特性を持っています。

たとえば、私だけが送信者になることができるように、私は秘密鍵を使用してメッセージを生成したいと考えています。

これは否認防止プロパティであり、署名することで実現できます。

私は自分の公開鍵を使ってメッセージを読んでもらいたいのですが、誰がそれらを読んでもかまいません。

公開鍵はすべての人に知られていると見なされるべきです。全員にメッセージを読んでもらいたい場合は、暗号化しないでください。

署名は通常、メッセージの内容には影響しません。メッセージは署名とは別のものと見なされます。正式には、このような署名は「付録付き署名」として知られており、付録はメッセージです。メッセージは署名よりも重要であると考えられているため、少し奇妙な名前ですが、そうです。(部分的な)メッセージ回復を提供する署名はほとんどありません。それらはもうあまり使用されておらず、一般に非推奨と見なされています。

CMSなどの署名プロトコルは、メッセージと署名の両方を含むコンテナ形式を展開する場合があることに注意してください。その場合、プレーンな.zipアーカイブからファイルを解凍するのと同じように、最初に-まだ暗号化されていない-メッセージをコンテナから取得する必要があります。したがって、メッセージは表示されない可能性があり、その場合は直接使用できません。

特定の情報を暗号化して、ソフトウェアのプロダクトキーとして使用したい。これらを生成できるのは私だけであることだけを気にします。

暗号化は機密性を達成するために使用されます。これまで、RSA署名の生成は、「秘密鍵による暗号化」と考えられていました。ただし、上で説明したように、操作はまったく異なり、後の標準では暗号化と署名の生成を分離しようと必死になっています。

公開鍵をソフトウェアに含めて、鍵の署名を復号化/読み取りたいのですが。誰がキーのデータを読み取ることができるかは気にしません。私がそれらを生成できる唯一の検証可能な人であることだけを気にします。

はい、これは公開鍵への信頼の確立と呼ばれます。ただし、プログラムコードの保護は、メッセージの保護とは大きく異なります。コード署名を実行できますが、コードの外部で署名を確認するためのものが必要になります。これを提供するオペレーティングシステムがあります。

たとえば、Microsoft Authenticodeがあります。iStoreやAndroidアプリストアなどのアプリケーションストアはコード署名を使用する場合と使用しない場合がありますが、アプリケーションが複製されていないか、少なくともストア内で複製されていないことをある程度保証します。結局のところ、暗号化が常に解決策であるとは限りません。

コードのクローン作成や変更をまったく行わないようにすることははるかに難しく、そのようにすると、DRMの領域に確実に入ることができます。

このシナリオでは署名は役に立ちますか?

そのとおり。公開鍵に信頼がある場合は、メッセージが自分だけによって署名されていることを確認するのに役立ちます。アプリケーションコード/統合公開キーの認証に役立つかどうかは、コードを実行する予定の環境に完全に依存します。


「これまでは、RSA署名の生成は「秘密鍵による暗号化」と考えられていました。ただし、上記のように操作はまったく異なり、後の標準では暗号化と署名の生成を必死に分離しようとします。」-これは私にはわかりません。KeyPairはpkまたはskにすることができ、一方が暗号化したものを復号化できます。これに同意する場合、署名と暗号化は意味のある方法で区別できるとどのように主張できますか?暗号化した後は、もう一方の鍵でのみ復号化できます。署名関数への参照を見てきましたが、これは関連していますか?
モーガン

署名機能で知っている唯一の違いは、暗号化前のメッセージのハッシュです。
モルガン

4

シナリオでは、非対称暗号化の意味で暗号化しません。私はそれを「エンコード」と呼びたいと思います。

したがって、データをバイナリ表現にエンコードしてから、秘密鍵で署名します。公開鍵で署名を検証できない場合は、署名付きデータが秘密鍵で生成されていないことがわかります。(「検証」とは、署名されていないデータが意味をなさないことを意味します)


2

機能的には、公開鍵/秘密鍵の暗号化を使用して、受信者だけがメッセージを読むことができるようにします。メッセージは、受信者の公開鍵を使用して暗号化され、受信者の秘密鍵を使用して復号化されます。

署名は、メッセージを作成したことを受信者に知らせるために使用でき、転送中に変更されていません。メッセージの署名は、独自の秘密鍵を使用して行われます。受信者は公開鍵を使用して、メッセージが改ざんされていないことを確認できます。

使用されるアルゴリズムについては、一方向の関数が含まれます。たとえば、wikipediaを参照してください。このようなアルゴリズムの最初の1つは大きな素数を使用しますが、それ以降、一方向関数がさらに発明されました。

インターネットで紹介記事を見つけるには、「ボブ」、「アリス」、「マロリー」を検索します。


私のユースケースについてコメントしていただけますか?秘密鍵を使用して暗号化し、公開鍵を使用して、誰でも、誰でも復号できるようにしたい
mmcdole 2009年

1
すべての非対称暗号化が素数に基づいているとは限りません。これは、最もよく知られている例(RSA)にすぎません。楕円曲線暗号などの他の方法があります。
Michael Borgwardt

「メッセージは暗号化され、受信者の公開鍵を使用して暗号化されます。」この文は意味をなさないか、少なくとも説明が必要です。「暗号化してから暗号化する」???
Maarten Bodewes

あなたはトレントを忘れました!:)
Dojo

1

質問者がソフトウェアライセンシングのソリューションを使用することを意図していた内容でこの質問に答えるには、要件は次のとおりです。

  1. サードパーティは、アプリの逆コンパイルからライセンスキーを生成できません
  2. ソフトウェアキーの内容は安全である必要はありません
  3. ソフトウェアキーは人間が読み取れない

デジタル署名はこの問題を解決します。キーを作成する生データは秘密キーで署名できるため、人間が読めないようにできますが、リバースエンジニアリングするとデコードできる可能性があります。ただし、秘密鍵は安全です。つまり、ソフトウェアのライセンスを作成することはできません(これがポイントです)。

熟練した担当者が製品のソフトウェアロックを解除することを防ぐことはできません。したがって、リリースされた各バージョンをハックする必要がある場合。ただし、すべてのバージョンで共有できる製品の新しいキーを生成できるようにしたくはありません。

Python PyNaClドキュメントには、目的に適した「デジタル署名」の例があります。 http://pynacl.readthedocs.org/en/latest/signing/

そして原因のNaClプロジェクトからCの例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.