web-dev-qa-db-ja.com

秘密鍵を公開鍵として使用できますか?

公開鍵を使用してデータを暗号化し、秘密鍵を使用してデータを復号化するコードがあります。これは、クライアントがサーバーにデータを送信し、サーバーだけがデータを復号化できることを知りたい場合に役立ちます。

しかし、サーバーがprivateキーを使用してデータを暗号化し、publicキーを使用してデータを復号化したいとします。これは、正しいサーバー。これを許可するようにコードを変更するのではなく、秘密鍵を公開して公開鍵を秘密にしておくことはできますか?これはシステムのセキュリティに影響しますか?

39
Graeme Perrow

しかし、適切なサーバーからのデータであることが確認できるデータを配布する方法として、サーバーに秘密キーを使用してデータを暗号化し、公開キーを使用してデータを復号化したいとします。

あなたはこれを行うことができます-これは、非常に単純化したレベルで、RSA署名がどのように機能するかです(注意、単純化-これにはもう少しあります)。

これを許可するようにコードを変更するのではなく、秘密鍵を公開して公開鍵を秘密にしておくことはできますか?これはシステムのセキュリティに影響しますか?

あなたは秘密鍵を公開する必要がない-RSAはTrapdoor置換であり、次のことを意味します。

  • 公開鍵で暗号化すると、秘密鍵で復号化できます。
  • 秘密鍵で暗号化すると、公開鍵で復号化できます。

したがって、RSAは、公開鍵のみを持つエンドユーザーに依存して、署名と暗号化の両方を実行することをサポートします。

あなたの場合、クライアントがデータがサーバーからのものであることを確認したい場合は、RSAの2番目のケースを適用し、すでに持っている公開鍵を使用して署名データを復号化します。

さらに、これは順列なので、コードを変更する必要はまったくありません。両方のキーが同じ機能を使用して機能するはずです。きちんとした暗号ライブラリには、存在するさまざまな標準に従って署名を検証するためのAPIがあると思います。これらの1つはおそらく良い策になるでしょう。

RSA Labsは素晴らしい これの説明 を提供します。

サーバー間でこれを拡張する場合、またはクライアント通信を確認する場合-各エンティティのキ​​ーを生成し、公開のものを交換します。このプロセスは両端で使用できます。

理論的には、eとdは交換可能です(これがRSAが機能する理由です)(1つは秘密に指定し、秘密にしておく必要があります)が、pとqは常にでなければなりませんこれらはeからdを派生させることができ、その逆も可能であるため、秘密にしてください。ただし、秘密鍵の理解には細心の注意を払う必要があります。ソフトウェアは秘密鍵にp/qを格納しますか?その場合、そのまま公開することはできません。また、私が交換可能と言ったとき-そのペアの1つ(eまたはdと係数n)を公開したら、もう1つを自分のライフで保護する必要があります。実際に言えば Graemeがコメントでリンクしているように eは、小さい値または固定値として選択されることがよくあります。 e/dが交換可能であるという私のコメントは、eが簡単に決定できる場合には当てはまりません。したがって、この種のことを行うと、混乱や誤実装の可能性があります。サードパーティのライブラリを使用する/秘密鍵の公開を開始しないでください。

51
user2213

はい、秘密鍵を使用して暗号化し、公開鍵を使用して復号化できます。秘密鍵を渡さないでください(秘密鍵は公開鍵を生成する可能性があり、暗号化システム全体が役に立たなくなります)。次のようなことをしたいと思いますこの:

サーバーはデータを暗号化し、クライアントに送信します。

クライアントは公開鍵を持ち、サーバーからのデータを復号化できます。

この状況では理にかなっています。サーバーが暗号化と復号化の両方を実行している場合、非対称暗号の実装が必要な理由はわかりません。

ただし、ルールは常に適用されます。秘密鍵は非公開のままで、サーバーを離れません。

9
StrangeWill

しかし、サーバーに秘密鍵を使用してデータを暗号化し、公開鍵を使用してデータを復号化したいとします。

サーバーはその秘密鍵を使用してデータを暗号化でき、受信者はサーバーの公開鍵を使用して復号化できます。これは可能です。ただし、このシナリオは、ドキュメントにデジタル署名するために使用され、対応するキー(サーバーの公開キー)しか使用できないため、「適切なサーバーからのデータであることが確認できるデータを配布する方法」と言います。データを復号化します。サーバーの公開鍵は、サーバーによって生成およびデジタル署名された対応するデジタル証明書によって検証されます。

秘密鍵を公開し、公開鍵を秘密にしておくことはできますか?

名前が示すように、秘密鍵を公開しないでください。

これはシステムのセキュリティに影響しますか?

はい、このシステムも実行できません。たとえば、Diffie-Hellman(最も広く使用されているキー交換プロトコルの1つ)を使用している場合、サーバーとすべてのクライアントは、セッションキーの計算に使用される公開値を共有する必要があります。 。したがって、ユーザーが秘密鍵を公開する場合、公開鍵を計算するのは非常に簡単です。これは不可能であるか、またはその逆は非常に困難です。

2
Ishtiaq Hussain

秘密鍵で暗号化して公開鍵で復号化できるかどうかはわかりませんが、復号化鍵は公開されているため、秘密鍵は非公開にしておく必要があるため、安全ではありません。

メッセージの送信者を確認するだけの場合は、送信者の秘密鍵を使用してデータに署名し、受信者は送信者の公開鍵を使用して署名を確認します。

データの暗号化と送信者の確認の両方を行う場合は、暗号化と署名を行います。どちらも秘密鍵を公開する必要はありません。

0
hmallett