Java AES Verschlüsselung mit Salz

8

Okay, stellt sich heraus, ich lutsche bei der Verschlüsselung / Entschlüsselung. Ich verstehe es einfach nicht. Wie kann ich die Verschlüsselung von String message1 = "hello world"; mit String salt = "mySalt"; mithilfe der AES-Verschlüsselung machen? auch wie kann ich es einmal verschlüsselt entschlüsseln?

Wenn Sie die Zeit haben, den grundlegendsten Code zu liefern, würde es mir sehr helfen.

Auch 1 allgemeine Frage zur AES-Verschlüsselung, die dasselbe Salz verwendet, wird dieselbe Nachricht immer die gleiche Verschlüsselung haben?

Vielen Dank im Voraus.

    
cody 05.09.2011, 01:00
quelle

4 Antworten

6

AES hat kein Salzkonzept. Es braucht nur Daten und einen Schlüssel. Für die gleiche Eingabe wird immer die gleiche Ausgabe erzeugt.

Wie Sie Ihre Botschaft mit Ihrem Salz verbinden, liegt ganz bei Ihnen. String-Verkettung ist wahrscheinlich ausreichend. Aber beachten Sie, dass Salze für so etwas wie AES nicht wirklich sinnvoll sind, da es kein Hash-Algorithmus ist.

    
Oliver Charlesworth 05.09.2011, 01:05
quelle
2

Salzen Sie immer Ihre AES-Dateien. Der Grund dafür ist, dass Sie ein Verzeichnis von JPEG-Dateien haben, die mit demselben Passwort verschlüsselt sind, aber kein Salz haben. Wenn jemand diese Dateien erfasst, werden alle Dateien mit den gleichen Bytes beginnen (da dies der JPEG-Header ist und die gleiche Passphrase immer mit den gleichen Werten verschlüsselt wird, bis sich die Bytes unterscheiden, zumindest bei einem CBC) Sie wissen auch, wie die ersten Blöcke der Datei unverschlüsselt aussehen. Selbst wenn sie nicht wissen, welche Art von Dateien sie sind, können sie wahrscheinlich den Typ aus der Länge des Vorlaufs erraten, der ähnlich ist, und die verschiedenen Dateiformate da draußen.

Wenn Sie dies wissen, können Sie Ihr Passwort ähnlich wie bei Rainbow-Tischen / Brute-Force-Reverse-Engineern bearbeiten. Salzen wird das nicht aufhalten, aber es wird es wirklich schwer machen zu knacken, da jede Datei (nach dem Salz) anders sein wird, so dass die Dateitypidentifikation schwierig ist, und sie müssten eine Rainbow-Tabelle für jedes Salz oder den Rechenaufwand erzeugen Erstellen eines Initialisierungsvektors für das Salz.

OpenSSL speichert das Salz in der Datei

z.B. Ich habe eine Datei mit diesem Befehl mit dem Passwort 'password' erstellt:
echo "randomprhase" | openssl aes-128-cbc -out nachricht.enc
Hier ist der Hexdump der resultierenden Datei: -

  

[james @ web openssltest] $ hedddump message.enc
  0000000 6153 746c 6465 5f5f7eaa c4fd 63d8 8c8c
  0000010 9519 75c9 0497 d449 27f5 2c91 0d34 5ceb   0000020

Und die gleichen Daten, wenn ich die Verschlüsselung erneut ausgeführt habe: -

  

[james @ web openssltest] $ hedddump message1.enc
  0000000 6153 746c 6465 5f5f a876 5394 53f1 bf1a
  0000010 adcb e1cd dba9 8034 cf13 8b3f c37c 5048
  0000020

Die ersten 4 Bytes sagen, dass die Datei gesalzen ist ( 6153 746c 6465 5f5f ) und immer gleich ist.

Die nächsten 4 Bytes sind das zufällige Salz (7eaa c4fd 63d8 8c8 für die erste Datei & amp; a876 5394 53f1 bf1a für die zweite Datei) OpenSSL wird dieses Salz nehmen und den Initialisierungsvektor (IV) aufbauen, wobei es ein MD5-Hash des Passwortes + Salz ist, das dreimal wiederholt wird. Diese IV wird dann verwendet, um die Datei zu verschlüsseln. Beachten Sie, dass die Payload der jeweils letzten 8 Bytes unterschiedlich ist.

Wenn wir den gleichen Befehl ausführen, ohne zu salzen:

[james @ web openssltest] $ echo "randomprhase" | openssl aes-128-cbc -nosalz -out nosalt.enc

[james @ web openssltest] $ echo "randomprhase" | openssl aes-128-cbc -nosalz -out nosalt1.enc

  

[james @ web openssltest] $ hexdump nosalt.enc
  0000000 947e f4ab 6dd7 c548 89e4 b587 82f4 5136
  0000010

     

[james @ web openssltest] $ hexdump nosalt1.enc
  0000000 947e f4ab 6dd7 c548 89e4 b587 82f4 5136
  0000010

Beachten Sie, dass die Nutzdaten identisch sind, wenn ich sie unter Verwendung des gleichen Passworts wiederhole und nicht zum Salzen angegeben habe.

In einer Java-Implementierung können Sie Ihr Salt separat speichern, aber es lohnt sich, etwas zu schreiben, das die OpenSSL-Implementierung emuliert, so dass Sie sich nicht auf Ihren eigenen Code verlassen müssen, um eine Datei zu entschlüsseln Punkt in der Zukunft, Verschlüsselung kann Sie so sehr vereiteln, wie es einen Angreifer vereiteln kann).

    
James879 19.07.2014 21:08
quelle
2

Mit Spring Security Crypto ist es vereinfacht (hauptsächlich, weil sie standardmäßig die passwortbasierte Verschlüsselung anstelle von anderen Formen verwenden):

%Vor%

AES ist nur eine Chiffre, und Sie können eine IV mit dem Text verwenden, den Sie verschlüsseln. Bei symmetrischer Verschlüsselung wird das Salz für den Schlüssel / das Geheimnis verwendet, mit dem Sie verschlüsseln, wie Sie oben sehen können.

In der realen Welt müssen Sie mit verteilten Systemen, gemeinsamen Schlüsseln und Salzen im Cluster usw. umgehen. Viel Spaß.

Spring Security ist eine dünne Abstraktion über JCE, so dass es leicht anzupassen ist, wenn Sie Spring nicht selbst verwenden.

    
JeeBee 09.10.2015 17:02
quelle
1

Wenn Sie AES mit einem salt-Wert verwenden, unterscheidet sich der salt-Wert vom zu verschlüsselnden Text - der Schlüssel bleibt jedoch gleich - in diesem Fall müssen Sie auch den salt-Wert speichern.

Hier ist ein gutes Beispiel ...

>     
Prabath Siriwardena 05.09.2011 01:09
quelle

Tags und Links