宿題のために、単一のネットワーク内で通信できるチャットサービスを開発しています。通信チャネルはRSAで暗号化する必要があります。
すべてのクライアントでキーペアを生成し、クライアントが通信しようとしたときに公開キーを要求する必要がありますか?これは安全ですか?
重複ではありません。誰かがネットワークを介してパケットを変更できず、認証も提供できない場合にどうなるかを知りたいです。
私は2つの部分であなたの質問に答えます:
通信チャネルはRSAで暗号化する必要があります。どうやってやるの?
RSAはメッセージ全体を暗号化するのが本当に遅いです。これを行う通常の方法は、AESなどの対称暗号でメッセージを暗号化し、受信者のRSA公開鍵を使用して対称鍵を暗号化することです。
そうは言っても、正しく理解するにはたくさんの細かい点があるため、ビルド済みの実装を使用することをお勧めします。実際、SSL/TLSを使用するだけで、あなたのようなユースケースがまさにそのために作られました。 OpenSSL
最も一般的なTLS実装では、使いやすく、すべての暗号化を処理します。 「opensslプログラミング入門」のようなものをグーグルすることで始められます。
編集:@Volkerがコメントで指摘したように、PidginやKopeteなどの多くの一般的なインスタントメッセンジャークライアントは、インスタントメッセンジャー専用に設計された暗号化プロトコルであるライブラリ Off-the-Record Messaging を使用します。 OTRは、基礎となる暗号化システムとしてPGPを使用します。 CのOTRライブラリはこちら と Javaライブラリはこちら があります。
次に、質問の2番目の部分について説明します。
すべてのクライアントでキーペアを生成し、クライアントが通信しようとしたときに公開キーを要求しますか?これは安全ですか?
SSL/TLSハンドシェイクでこのすべてを処理します。 Diffie-Hellman と呼ばれるキー交換プロトコルを使用して、キー交換の問題を非常にうまく解決します。
考えたいことの1つは、強力な認証が必要かどうか、つまり、他のユーザーになりすましている人々が心配かどうかです。もしそうなら、あなたは各公開鍵を特定の人に結びつけるcertificatesにされた全員の公開鍵を取得する必要があります。これは、ある種の Public Key Infrastructure を必要とするはるかに複雑なセットアップです。= Certificate Authority サーバーをセットアップする必要があります(OpenSSL
)、またはPGPのような信頼できるWebシステムがあります。このルートを選択する場合は、Googleやこのエクスチェンジで情報を見つけるか、チャットネットワーク用のPKIの設定に関する新しい質問を投稿できます。
このタイプのチャットサービスは以前に書いたことがあります。ユーザーがサーバーに参加すると、クライアントの公開鍵が送信されます。次に、プライベートメッセージが開始されるたびに、サーバーは通信しているそれぞれのクライアントに公開鍵を配布できます。
RSAを使用してチャットメッセージ全体を暗号化するのは遅いことを覚えておく必要があります。これが、長期対称暗号化キーを確立するためのキー交換で一般的にRSAが使用される理由です。鍵交換により、アルゴリズムとセキュリティパラメータも確立されます。これにより、セキュリティを犠牲にすることなく、より高速な暗号化方法のために安全な通信を確立できます。
チェックアウト SSL/TLSの仕組み 安全なプロトコルがどのように機能するかを詳しく見ていきます。独自の安全なプロトコルを作成すると、脆弱性が発生することに注意してください。 "ロールしたり所有したりすべきではないのはなぜですか?" これらの懸念に対処します。