このチャレンジには、最初に答えて少なくとも3日間無敵のままでいるために200ポイントの報奨金が課せられます。user3080953が主張しています。
最近、エンドツーエンドの暗号化について多くの話があり、製品からそれを削除するように企業に圧力をかけています。私はその権利と不正には興味がありませんが、私は疑問に思いました。コードをどれだけ短くすれば、会社はそれを使わないように圧力をかけるでしょうか?
ここでの課題は、ネットワーク化された2つのシステム間でDiffie Hellmanキー交換を実装し、生成された対称キーを使用してユーザーがやり取りできるようにすることです。このタスクの目的のために、他の保護は必要ありません(たとえば、キーの循環、IDの確認、DoSからの保護など)。インターネットを開くことができます(リッスンするポートはすべてのユーザーが利用できます)。組み込みの使用が許可され、推奨されています!
次の2つのモデルのいずれかを選択できます。
- サーバーとクライアント:クライアントはサーバーに接続し、サーバーまたはクライアントは他方にメッセージを送信できます。2つの間のサードパーティは、メッセージを読むことができない必要があります。フローの例は次のとおりです。
- ユーザーAがサーバーを起動します
- ユーザーBはクライアントを起動し、それをユーザーAのサーバーに転送します(IP /ポート経由など)。プログラムは接続を開きます
- ユーザーAのプログラムは接続を確認します(オプションでユーザーに最初に同意を求めます)
- ユーザーBのプログラムはDHシークレットの生成を開始し、必要なデータ(公開キー、プライム、ジェネレーター、実装に必要なもの)をユーザーAに送信します。
- ユーザーAのプログラムは、送信されたデータを使用して共有シークレットの生成を完了し、必要なデータ(公開キー)をユーザーBに送り返します。この時点から、ユーザーAはメッセージを入力できます。 B(例:標準出力)。
- ユーザーBのプログラムは、共有秘密の生成を完了します。この時点から、ユーザーBはユーザーAにメッセージを送信できます。
- または:2つのクライアントが接続されたサーバー:各クライアントはサーバーと通信し、サーバーはメッセージを他のクライアントに転送します。サーバー自体(およびその間のサードパーティ)は、メッセージを読み取れないようにする必要があります。初期接続以外のプロセスは、最初のオプションで説明したものと同じです。
詳細なルール:
- 単一のプログラム、または複数のプログラム(サーバーとクライアントなど)を提供できます。スコアは、すべてのプログラムの合計コードサイズです。
- プログラムは理論的にはネットワークを介して通信できる必要があります(ただし、テストにはlocalhostで十分です)。選択した言語がネットワークをサポートしていない場合は、サポートしているもの(シェルスクリプトなど)と組み合わせることができます。この場合、スコアは使用されるすべての言語にわたるコードサイズの合計です。
- Diffie Hellmanキー生成では、ハードコードされた「p」および「g」値を使用できます。
- 生成された共有キーは、少なくとも1024ビットである必要があります。
- キーが共有されたら、対称キー暗号化の選択はあなた次第ですが、それに対して実際的な攻撃があることが現在知られている方法を選択してはなりません)。許可されたアルゴリズムの例:
- AES(任意のキーサイズ)
- RC4(理論的には壊れていますが、言及できる実用的な攻撃はないため、ここでは許容されます)
- ユーザーAとBはどちらも、相互にメッセージを双方向に送信できる必要があります(双方向通信)(たとえば、stdinからの行の読み取り、継続的なプロンプト、ボタンを押すなどのイベント)。簡単になった場合は、交互の会話を想定できます(つまり、ユーザーがメッセージを送信した後、次のメッセージを送信する前に応答を待つ必要があります)
- 言語の組み込みが許可されています(既にサポートされている場合、独自の暗号化またはネットワークメソッドを記述する必要はありません)。
- 基礎となる通信形式はユーザー次第です。
- 上記の通信手順は一例ですが、従う必要はありません(必要な情報が共有され、中間キーが共有キーまたはメッセージを計算できない場合)
- サーバーへの接続に必要な詳細が事前にわからない場合(ランダムポートでリッスンする場合など)、これらの詳細を印刷する必要があります。マシンのIPアドレスがわかっていると想定できます。
- エラー処理(無効なアドレス、接続の切断など)は必要ありません。
- 課題はコードゴルフであるため、バイト単位の最短コードが勝ちます。
p
とg
認め?