Wie können Sie kostengünstig eine Zwei-Wege-Verschlüsselung eines 32-Bit-Int durchführen, so dass jede Zahl auf eine andere Int in diesem Raum und zurück auf eine schwer vorhersagbare Weise abgebildet wird?
Und es ist natürlich nicht nötig, 4,29 Milliarden Ints in einer Zuordnungstabelle zu speichern.
Was Sie wollen, ist eine 32-Bit Blockchiffre. Leider sind die meisten Blockchiffre aufgrund der Schwäche einer kurzen Blockgröße 64-Bit oder mehr. Wenn Sie mit dem verschlüsselten Int umgehen können, der doppelt so groß ist wie die Eingabe, können Sie einfach Blowfish, TDES oder eine andere gut geprüfte 64-Bit-Blockchiffre verwenden.
Wenn Sie wirklich 32 Bits benötigen und die verringerte Sicherheit nicht stören, dann ist es einfach genug, eine Feistel-Netzwerkchiffre wie Blowfish auf eine beliebige Blocklänge zu kürzen, die ein Vielfaches von 2 und weniger als die Startchiffre ist. Für Blowfish teilen Sie Ihre Eingabezahl gleichmäßig zwischen den beiden Halbblöcken auf und trimmen die Ausgabe von F Funktion und die P-Werte bis zu 1/2 Ihrer Zielblockgröße. Dies kann alles getan werden, nachdem der Algorithmus wie üblich eingegeben wurde.
Offensichtlich brauchen Sie irgendeine Art von Zufallsschlüssel, um sicher zu sein. In diesem Fall:
%Vor%Dies ist nur ein einfaches XOR. XORing erneut wird diesen Prozess umkehren.
Auch sollte ich beachten, dass dies nur für eine Verwendung sicher ist. Es heißt One-Time-Pad . Wenn Sie denselben Schlüssel zweimal für nicht zufällige Daten verwenden, kann ein Angreifer sie möglicherweise entschlüsseln.
Verwenden Sie eine 32-Bit-Blockchiffre, skip32 ist die einzige, die ich gefunden habe: Ссылка
Ein Weg ist XOR mit einer geheimen 32-Bit-Nummer. Wenn Sie diese geheime Nummer erneut mit XOR verknüpfen, wird sie auf die ursprüngliche Nummer zurückgesetzt. Das ist schnell, aber nicht sehr sicher. Wenn eine sichere Methode benötigt wird, wäre ich auch daran interessiert, andere Methoden zu sehen.
Verwenden Sie einen Standardalgorithmus und ein zufälliges Pad (vorausgesetzt, der Chiffretext muss nicht die gleiche Länge wie der Ebenentext haben).
Verwenden Sie also im Grunde einen Standardalgo, der Verkettung verwendet und vier zufällige 32-Bit-Zahlen davor steckt. Das sollte helfen, Regelmäßigkeiten / Redundanz in Ihrer 32-Bit-Nachricht zu verschleiern. Hölle, pad auch am Ende, wenn es dir gefällt.
Grundsätzlich gilt: Je weniger Sie schreiben, desto besser sind Sie. Jeder verschraubt dieses Zeug.
Es gibt zwei einfache und reversible Operationen, mit denen Sie einen Integer-Wert verschlüsseln können. Sie können die xor-Operation verwenden, und Sie können Bits in der Zahl austauschen.
Wenn Sie beide verwenden, wird es nicht so trivial sein, die verwendete Methode herauszufinden. Sie werden sich gegenseitig schützen.
Wenn alles, was Sie wollen, etwas wirklich Einfaches ist, das der durchschnittliche Benutzer nicht bemerkt, dann verwenden Sie eine Reihe von XOR- und Shift-Operatoren.
Das Problem, wenn Sie kein Array zum Speichern der 4 Milliarden INTs verwenden, ist, dass Sie eine Funktion benötigen, die eine 1: 1-Zufallskarte über eine Domäne von 4 Milliarden INTs erstellt. Sie können eine Anzahl von XOR- und Shift-Operatoren mischen, um Ihre eigenen zu erstellen, aber es wird nicht schwer zu knacken sein. Selbst wenn es eine gut bekannte Eins-zu-eins-Karte gäbe, würde sie ebenfalls fehlschlagen. Ohne ein Salz könnte jemand einfach einen einfachen Regenbogen-Tisch erzeugen, um es zu brechen.
Das Problem mit einem Salz in Zwei-Wege-Kommunikation ist, dass Sie es sicher kommunizieren müssen. Salze müssen geheim sein, und wenn du erst einmal weißt, was sie sind, sind sie sinnlos.
Wenn Sie einen sicheren Kommunikationskanal einrichten möchten, schauen Sie sich Off-the-Record an Messaging-Protokoll Version 2 . Es wird Ihnen ein Beispiel dafür geben, wie komplex die Kommunikationsverschlüsselung werden kann. Ich würde vorschlagen, dass Sie etwas Bekanntes finden, das jemand anderes bereits erstellt und getestet hat. Selbst wenn Sie etwas verwenden, das jemand anderes erstellt hat, wenn Sie es falsch verwenden, wird es fehlschlagen.
Nehmen Sie Ihren 32-Bit-Eingang, schneiden Sie ihn in zwei 16-Bit-Hälften L und R, und wiederholen Sie dann die folgende Schritte: Berechne eine Pseudozufallsfunktion von R, x oder das Ergebnis dieser Pseudozufallsfunktion zu L und vertausche L und R. Dies ist ein Luby-Rackoff Konstruktion. Die Pseudozufallsfunktion muss nicht invertierbar sein. So könnte man beispielsweise eine Blockchiffre nehmen, 16 Bit verschlüsseln und das Ergebnis auf 16 Bit reduzieren. Stellen Sie sicher, dass nicht alle Runden die gleiche Pseudozufallsfunktion verwenden (oder verwenden Sie andere runde Schlüssel).
Ich benutzte XOR + ADD mit einem 64-Bit-Schlüssel. Ich benutzte auch, um den Schlüssel alle paar Minuten zu ändern und zu versuchen, mit dem aktuellen oder vorherigen Schlüssel zu entschlüsseln. (In meiner Domäne musste die Ganzzahl nicht länger als vier Minuten sicher sein.)
Tags und Links algorithm language-agnostic encryption