Welcher symmetrische Cypher für die Verschlüsselung von Nachrichten?

Ich habe überhaupt keine Ahnung von Verschlüsselung. Aber ich brauche es Wie?

Sagen Sie, dass Sie ein System von Knoten haben, die miteinander über ein Netzwerk über asynchrone Nachrichten kommunizieren. Die Knoten pflegen keine Sitzungsinformationen über andere Knoten (dies ist eine Designbeschränkung).

Sagen Sie, dass Sie sicherstellen möchten, dass nur Ihre Knoten die gesendeten Nachrichten lesen können. Ich glaube, Verschlüsselung ist die Lösung dafür.

Da die Knoten keine Sitzung beibehalten und die Kommunikation in einer staatenlosen, verbindungslosen Art und Weise arbeiten muss, vermute ich, dass die asymmetrische Verschlüsselung ausgeschlossen ist.

Also hier ist was ich gerne machen möchte:

  • Nachrichten werden als UDP-Datagramme gesendet
  • Jede Nachricht enthält einen Zeitstempel, um Nachrichten zu unterscheiden (Counter Replay Attacken)
  • Jede Nachricht wird mit einem geteilten geheimen symmetrischen Schlüssel verschlüsselt und über das Netzwerk gesendet
  • Anderes Ende kann mit geteiltem geheimen symmetrischen Schlüssel entschlüsseln

Schlüssel können offensichtlich durch Kompromittierung eines einzelnen Knotens beeinträchtigt werden. Zur gleichen Zeit, in diesem Szenario, Zugang zu jedem einzelnen kompromittierten Knoten zeigt alle interessanten Informationen sowieso, so dass der Schlüssel ist nicht die schwächste Link.

Was soll ich für diese Verschlüsselung verwenden? Welche Schlüssellänge?

Ich würde es vorziehen, etwas zu benutzen, das von ezPyCrypto unterstützt wird.

Angenommen, wie die meisten zeigen, gehe ich mit AES. Welche Modi soll ich verwenden?

Ich konnte nicht herausfinden, wie es mit ezPyCrypto zu tun scheint, PyCrypto scheint auf einem Moderator Swap gehängt werden und googles Keyczar nicht erklären, wie man dies up – ich fürchte, wenn ich nicht nur bekommen , dann habe ich ein Risiko laufen Der Einführung von Unsicherheit. So Barebones wäre besser. Dieser Kerl behauptet, ein schönes Modul für AES in Python zu haben, aber er behauptet auch, dass dies sein erstes Pythonprojekt ist – Obwohl er wahrscheinlich schlauer ist als ich, vielleicht hat er sich gestolpert?

EDIT: Ich habe die Suche nach der Python-Implementierung auf eine andere Frage , um Clobber zu stoppen …

7 Solutions collect form web for “Welcher symmetrische Cypher für die Verschlüsselung von Nachrichten?”

Ihr erster Gedanke sollte Kanalsicherheit sein – entweder SSL / TLS oder IPSec.
Zugegeben, diese haben beide einen gewissen Setup-Overhead, IPSec mehr als SSL / TLS, vor allem, wenn es um PKI etc. geht – aber es mehr als sich selbst in der Einfachheit der Entwicklung, Zuverlässigkeit, Sicherheit und mehr bezahlt. Stellen Sie einfach sicher, dass Sie starke Chiffre-Suiten verwenden, je nach Protokoll.

Wenn weder SSL / TLS oder IPSec zu Ihrem Szenario / Umgebung passt, sollte Ihre nächste Wahl AES (aka Rijndael) sein.
Verwenden Sie Schlüssel mindestens 256 Bits lang, wenn Sie möchten, dass Sie länger gehen können.
Schlüssel sollten zufällig erzeugt werden, durch einen kryptographisch sicheren Zufallszahlengenerator (und nicht einen einfachen rnd () Anruf).
Stellen Sie den Chiffre-Modus auf CBC .
PKCS7 Polsterung verwenden.
Generiere einen einzigartigen, krypto-zufälligen Initialisierungsvektor (IV). Vergessen Sie nicht, richtig zu schützen und verwalten Sie Ihre Schlüssel, und vielleicht betrachten regelmäßige Schlüssel Drehungen.

Abhängig von Ihren Daten können Sie auch einen Keyed-Hash implementieren, um die Nachrichtenintegrität zu gewährleisten – verwenden Sie SHA-256 zum Hashing.

Es gibt auch seltene Situationen, in denen du mit einer Stream-Chiffre gehen möchtest, aber das ist in der Regel komplizierter und ich würde dir empfehlen, es dein erstes Mal zu vermeiden.

Jetzt bin ich nicht vertraut ezpycrypto (oder wirklich python im Allgemeinen), und kann nicht wirklich sagen, dass es das alles unterstützt; Aber alles hier ist ziemlich Standard und empfohlene Best Practice, wenn deine Kryptobibliothek es nicht unterstützt, würde ich vorschlagen, eine zu finden, die das macht ;-).

Ich habe überhaupt keine Ahnung von Verschlüsselung. Aber ich brauche es Wie?

ACHTUNG! Wenn Sie nicht viel über Kryptographie wissen, versuchen Sie nicht, es selbst zu implementieren. Kryptographie ist schwer zu bekommen . Es gibt viele, viele verschiedene Möglichkeiten, um die Sicherheit eines kryptographischen Systems zu brechen, das tatsächlich den Schlüssel knackt (was normalerweise sehr schwer ist).

Wenn Sie einfach eine Chiffre auf Ihre Streaming-Daten, ohne sorgfältige Key-Management und andere Verständnis der Feinheiten der kryptographischen Systeme, werden Sie wahrscheinlich öffnen Sie sich bis zu allen Arten von Schwachstellen. Zum Beispiel wird das Schema, das Sie beschreiben, anfällig für Man-in-the-Middle-Angriffe ohne einen bestimmten Plan für die Schlüsselverteilung zwischen den Knoten und kann anfällig für ausgewählte-Klartext- und / oder bekannte-Klartext-Angriffe sein, je nachdem, wie Ihre verteilten System kommuniziert mit der Außenwelt und die genaue Auswahl der Chiffre und Betriebsart .

Also … du musst auf Krypto im Allgemeinen lesen, bevor du es sicher benutzen kannst.

Angenommen, die Verwendung von symmetrischen Krypto, dann sollte AES Ihre Standard-Wahl sein, es sei denn, Sie haben einen guten Grund, anders auszuwählen.

Es gab einen langen, beteiligten Wettbewerb um AES zu wählen, und der Gewinner wurde sorgfältig ausgewählt. Auch Bruce Schneier, Krypto-Gott, hat gesagt, dass der AES-Gewinner eine bessere Wahl als der Algorithmus (TwoFish) ist, den er dem Wettbewerb unterbreitet hat.

AES 256 ist in der Regel die bevorzugte Wahl, aber je nach Standort (oder dem Standort Ihrer Kunden) können Sie gesetzliche Einschränkungen haben und werden gezwungen sein, etwas Schwächeres zu benutzen.

Beachten Sie auch, dass Sie eine zufällige IV für jede Kommunikation verwenden und es mit der Nachricht weitergeben (dies wird auch die Notwendigkeit für einen Zeitstempel sparen).

Wenn möglich, versuchen Sie nicht, sich auf den Algorithmus zu verlassen, und übergeben Sie den Algorithmus zusammen mit der Nachricht. Der Knoten schaut dann auf den Header und entscheidet über den Algorithmus, der für die Entschlüsselung verwendet wird. Auf diese Weise können Sie ganz einfach Algorithmen wechseln, wenn eine bestimmte Bereitstellung dies erfordert.

Ich würde wahrscheinlich für AES gehen.

Die asymmetrische Verschlüsselung würde auch in diesem Szenario funktionieren. Sobald jeder Knoten seinen öffentlichen Schlüssel veröffentlichen kann. Jeder Knoten, der mit diesem Knoten kommunizieren möchte, muss nur die Nachricht mit dem öffentlichen Schlüssel des Knotens verschlüsseln. Ein Vorteil der Verwendung von asymmetrischen Schlüsseln ist, dass es einfacher wird, Schlüssel zu ändern und zu verteilen – da die öffentlichen Schlüssel offen verteilt werden können, muss jeder Knoten nur das öffentlich-private Schlüsselpaar aktualisieren und neu veröffentlichen. Sie brauchen kein Protokoll für das gesamte Netzwerk (oder jedes Knotenpaar), um einen neuen symmetrischen Schlüssel zu vereinbaren.

Warum nicht ein VPN unter den Knoten erstellen, die sicher kommunizieren müssen?

Dann musst du dich nicht entschuldigen, deine eigene Sicherheitslösung zu kodieren, und du bist nicht auf einen statischen, geteilten Schlüssel beschränkt (der, wenn er kompromittiert wird, es ermöglicht, dass jeder erfasste Verkehr nach der Tatsache entschlüsselt wird).

  • Python-Implementierung von sha512_crypt.c
  • Programmgesteuert `d` aus` p` und `q` (RSA)
  • Ein guter Weg, um Datenbankfelder zu verschlüsseln?
  • XOR Python Text Verschlüsselung / Entschlüsselung
  • Python Blowfish Verschlüsselung
  • AES Entschlüsselung fehlschlägt beim Entschlüsseln eines zweiten Mal
  • Verschlüsseln und Entschlüsseln mit python und nodejs
  • Warum ist AES verschlüsselte Chiffre der gleichen Saite mit der gleichen Taste immer anders?
  • Verschlüsseln von Passwörtern auf POST Django
  • Entschlüsseln von Daten in Python, die in Java von Java verschlüsselt wurden
  • Verschlüsselte Datei oder db in python
  • Python ist die beste Programmiersprache der Welt.