it-swarm.com.de

AES-Verschlüsselung - Schlüssel versus IV

Mit der Anwendung, an der ich arbeite, kann der Benutzer Dateien verschlüsseln. Die Dateien können ein beliebiges Format haben (Tabellenkalkulation, Dokument, Präsentation usw.).

Für die angegebene Eingabedatei erstelle ich zwei Ausgabedateien - eine verschlüsselte Datendatei und eine Schlüsseldatei. Sie benötigen beide Dateien, um Ihre Originaldaten zu erhalten. Die Schlüsseldatei darf nur in der entsprechenden Datendatei funktionieren. Es sollte für keine andere Datei funktionieren, weder vom selben Benutzer noch von einem anderen Benutzer.

Der AES-Algorithmus erfordert zwei verschiedene Parameter für die Verschlüsselung, einen Schlüssel und einen Initialisierungsvektor (IV).

Ich sehe drei Möglichkeiten zum Erstellen der Schlüsseldatei:

  1. Betten Sie fest codierte IV in die Anwendung ein und speichern Sie den Schlüssel in der Schlüsseldatei.
  2. Betten Sie den fest codierten Schlüssel in die Anwendung ein und speichern Sie die IV in der Schlüsseldatei.
  3. Speichern Sie sowohl den Schlüssel als auch das IV in der Schlüsseldatei.

Beachten Sie, dass dieselbe Anwendung von verschiedenen Kunden verwendet wird.

Es scheint, dass alle drei Optionen das gleiche Endziel erreichen würden. Ich würde jedoch gerne Ihr Feedback dazu erhalten, wie der richtige Ansatz aussehen sollte.

59
Peter

Wie Sie aus den anderen Antworten ersehen können, ist eine eindeutige IV pro verschlüsselter Datei von entscheidender Bedeutung, aber warum ist das so?

Lassen Sie uns zunächst untersuchen, warum eine eindeutige IV pro verschlüsselter Datei wichtig ist. ( Wikipedia auf IV ). Die IV fügt Ihrem Start des Verschlüsselungsprozesses Zufälligkeit hinzu. Bei Verwendung eines verketteten Blockverschlüsselungsmodus (bei dem ein Block verschlüsselter Daten den vorherigen Block verschlüsselter Daten enthält) tritt beim ersten Block, bei dem die IV eingeht, ein Problem auf.

Wenn Sie kein IV hatten und die Blockverschlüsselung mit nur Ihrem Schlüssel verwendet haben, werden zwei Dateien, die mit identischem Text beginnen, identische erste Blöcke erzeugen. Wenn sich die Eingabedateien auf halbem Weg ändern, sehen die beiden verschlüsselten Dateien ab diesem Zeitpunkt bis zum Ende der verschlüsselten Datei unterschiedlich aus. Wenn jemand die Ähnlichkeit am Anfang bemerkte und wusste, womit eine der Dateien begann, konnte er ableiten, womit die andere Datei begann. Wenn Sie wissen, womit die Klartextdatei begonnen hat und was der zugehörige Chiffretext ist, kann diese Person den Schlüssel bestimmen und dann die gesamte Datei entschlüsseln.

Fügen Sie nun die IV hinzu - wenn jede Datei eine zufällige IV verwenden würde, wäre ihr erster Block anders. Das obige Szenario wurde vereitelt.

Was wäre, wenn die IV für jede Datei gleich wäre? Nun, wir haben wieder das Problemszenario. Der erste Block jeder Datei wird mit demselben Ergebnis verschlüsselt. Praktisch ist dies nicht anders als die IV überhaupt nicht zu verwenden.

Kommen wir nun zu den vorgeschlagenen Optionen:

Option 1. Betten Sie fest codierte IV in die Anwendung ein und speichern Sie den Schlüssel in der Schlüsseldatei.

Option 2. Betten Sie den fest codierten Schlüssel in die Anwendung ein und speichern Sie die IV in der Schlüsseldatei.

Diese Optionen sind ziemlich identisch. Wenn zwei Dateien, die mit demselben Text beginnen, verschlüsselte Dateien erzeugen, die mit identischem Chiffretext beginnen, sind Sie erledigt. Das würde bei beiden Optionen passieren. (Angenommen, es wird ein Hauptschlüssel zum Verschlüsseln aller Dateien verwendet.).

Option 3. Speichern Sie sowohl den Schlüssel als auch das IV in der Schlüsseldatei.

Wenn Sie eine zufällige IV für jede Schlüsseldatei verwenden, sind Sie gut. Keine zwei Schlüsseldateien sind identisch, und jede verschlüsselte Datei muss über eine Schlüsseldatei verfügen. Eine andere Schlüsseldatei funktioniert nicht.

PS: Wenn Sie mit Option 3 und IVs nach dem Zufallsprinzip fortfahren, sehen Sie sich an, wie Sie feststellen, ob die Entschlüsselung erfolgreich war. Nehmen Sie eine Schlüsseldatei aus einer Datei und versuchen Sie, damit eine andere Verschlüsselungsdatei zu entschlüsseln. Möglicherweise stellen Sie fest, dass die Entschlüsselung fortgesetzt wird und zu Abfallergebnissen führt. Beginnen Sie in diesem Fall mit der Untersuchung von authentifizierte Verschlüsselung .

74
Tails

Das Wichtige an einer IV ist , dass Sie niemals dieselbe IV für zwei Nachrichten verwenden dürfen . Alles andere ist zweitrangig - wenn Sie die Eindeutigkeit sicherstellen können, ist die Zufälligkeit weniger wichtig (aber immer noch eine sehr gute Sache!). Die IV muss nicht (und in der Tat im CBC-Modus kann nicht geheim sein.

Als solches sollten Sie die IV nicht neben dem Schlüssel speichern - das würde bedeuten, dass Sie dieselbe IV für jede Nachricht verwenden, was den Punkt zunichte macht, dass Sie eine IV haben. Normalerweise stellen Sie die IV einfach im Klartext vor die Datei encrypted.

Wenn Sie Ihre eigenen Verschlüsselungsmodi wie diese rollen, lesen Sie bitte die entsprechenden Standards. Das NIST verfügt über ein gutes Dokument zu Verschlüsselungsmodi: http://dx.doi.org/10.6028/NIST.SP.800-38A Die IV-Generierung ist in Anhang C dokumentiert. Kryptographie ist eine subtile Kunst . Versuchen Sie nicht, Variationen der normalen Verschlüsselungsmodi zu erstellen. In 99% der Fälle erstellen Sie etwas, das sieht aus sicherer, aber eigentlich weniger sicher ist.

29
bdonlan

Wenn Sie eine IV verwenden, ist es am wichtigsten, dass die IV so eindeutig wie möglich ist. In der Praxis sollten Sie also eine zufällige IV verwenden. Dies bedeutet, dass das Einbetten in Ihre Anwendung nicht möglich ist. Ich würde die IV in der Datei Daten speichern, da dies die Sicherheit nicht beeinträchtigt solange die IV zufällig/eindeutig ist .

12
gpeche