Diese Herausforderung bringt eine Prämie von 200 Punkten mit sich, wenn der Erste antwortet und mindestens 3 Tage ungeschlagen bleibt.Wird von user3080953 beansprucht .
In letzter Zeit wird viel über End-to-End-Verschlüsselung geredet und Druck auf Unternehmen ausgeübt, sie aus ihren Produkten zu entfernen. Ich bin nicht an den Rechten und Unrechten daran interessiert, aber ich habe mich gefragt: Wie kurz kann Code sein, der ein Unternehmen dazu bringt, ihn nicht zu verwenden?
Hier besteht die Herausforderung darin, einen Diffie Hellman-Schlüsselaustausch zwischen zwei vernetzten Systemen zu implementieren und den Benutzern dann die Möglichkeit zu geben, mithilfe des generierten symmetrischen Schlüssels hin und her zu kommunizieren. Für diese Aufgabe sind keine weiteren Schutzmaßnahmen erforderlich (z. B. kein Durchlaufen des Schlüssels, Überprüfen der Identität, Schutz vor DoS usw.) und Sie können von einem offenen Internet ausgehen (alle Ports, die Sie abhören, sind für alle verfügbar). Die Verwendung von Builtins ist erlaubt und erwünscht !
Sie können eines von zwei Modellen wählen:
- Ein Server und ein Client: Der Client stellt eine Verbindung zum Server her, und der Server oder Client kann Nachrichten an den anderen senden. Zwischengeschaltete Dritte müssen die Nachrichten nicht lesen können. Ein Beispielablauf könnte sein:
- Benutzer A startet den Server
- Benutzer B startet den Client und leitet ihn an den Server von Benutzer A weiter (z. B. über IP / Port). Das Programm stellt eine Verbindung her
- Das Programm von Benutzer A bestätigt die Verbindung (optional wird der Benutzer zuerst um Zustimmung gebeten)
- Das Programm von Benutzer B beginnt mit der Generierung eines DH-Geheimnisses und sendet die erforderlichen Daten (öffentlicher Schlüssel, Prime, Generator, alles andere, was Ihre Implementierung benötigt) an Benutzer A
- Das Programm von Benutzer A verwendet die gesendeten Daten, um die Erstellung des gemeinsamen Geheimnisses abzuschließen, und sendet die erforderlichen Daten (öffentlichen Schlüssel) an Benutzer B zurück. Von diesem Punkt an kann Benutzer A Nachrichten eingeben (z. B. über stdin), die verschlüsselt und an Benutzer gesendet werden B (zB zu stdout).
- Das Programm von Benutzer B schließt die Erzeugung des gemeinsamen Geheimnisses ab. Von diesem Punkt aus kann Benutzer B Nachrichten an Benutzer A senden.
- Oder: Ein Server mit zwei verbundenen Clients: Jeder Client spricht mit dem Server, der seine Nachricht an den anderen Client weiterleitet. Der Server selbst (und alle dazwischen liegenden Drittanbieter) müssen die Nachrichten nicht lesen können. Abgesehen von der ursprünglichen Verbindung entspricht der Vorgang dem in der ersten Option beschriebenen.
Detaillierte Regeln:
- Sie können ein einzelnes Programm oder mehrere Programme (z. B. Server und Client) bereitstellen. Ihre Punktzahl ist die Gesamtcodegröße aller Programme.
- Ihr Programm muss theoretisch in der Lage sein, über ein Netzwerk zu kommunizieren (zum Testen ist localhost jedoch in Ordnung). Wenn Ihre Sprache die Vernetzung nicht unterstützt, können Sie sie mit einer anderen Sprache kombinieren (z. B. einem Shell-Skript). In diesem Fall ist Ihre Punktzahl die Gesamtgröße des Codes in allen verwendeten Sprachen.
- Die Diffie Hellman-Schlüsselgenerierung kann fest codierte "p" - und "g" -Werte verwenden.
- Der generierte gemeinsame Schlüssel muss mindestens 1024 Bit umfassen.
- Sobald der Schlüssel freigegeben ist, liegt die Wahl der symmetrischen Schlüsselverschlüsselung bei Ihnen. Sie dürfen jedoch keine Methode auswählen, die derzeit als praktisch erwiesen ist (z. B. ist es trivial, eine Cäsar-Verschiebung rückgängig zu machen, ohne den Schlüssel zu kennen ). Beispiel zulässige Algorithmen:
- AES (beliebige Schlüsselgröße)
- RC4 (theoretisch defekt, aber keine praktischen Angriffe, die ich erwähnen kann, also ist es hier zulässig)
- Benutzer A und B müssen in der Lage sein, interaktiv Nachrichten aneinander zu senden (wechselseitige Kommunikation) (z. B. Lesen von Zeilen von stdin, ständige Eingabeaufforderung oder Ereignisse wie Drücken einer Taste). Wenn es einfacher ist, können Sie eine abwechselnde Konversation annehmen (dh nachdem ein Benutzer eine Nachricht gesendet hat, muss er auf eine Antwort warten, bevor er seine nächste Nachricht sendet).
- Spracheinbauten sind zulässig (Sie müssen keine eigenen kryptografischen oder Netzwerkmethoden schreiben, wenn diese bereits unterstützt werden).
- Das zugrunde liegende Kommunikationsformat liegt bei Ihnen.
- Die oben angegebenen Kommunikationsschritte sind ein Beispiel, aber Sie müssen sie nicht befolgen (solange die erforderlichen Informationen geteilt werden und kein Mittelsmann in der Lage ist, den geteilten Schlüssel oder die geteilten Nachrichten zu berechnen).
- Wenn die für die Verbindung zu Ihrem Server erforderlichen Details nicht im Voraus bekannt sind (z. B. wenn er einen zufälligen Port abhört), müssen diese Details ausgedruckt werden. Sie können davon ausgehen, dass die IP-Adresse des Geräts bekannt ist.
- Eine Fehlerbehandlung (z. B. ungültige Adressen, verlorene Verbindungen usw.) ist nicht erforderlich.
- Die Herausforderung ist Codegolf, also gewinnt der kürzeste Code in Bytes.
p
undg
erlaubt?