AES-Verschlüsselung - Schlüssel versus IV

73

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 mit der entsprechenden Datendatei funktionieren. Es sollte nicht mit einer anderen 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 die IV in der Schlüsseldatei.

Beachten Sie, dass es sich um dieselbe Anwendung handelt, die von verschiedenen Kunden verwendet wird.

Es scheint, dass alle drei Entscheidungen das gleiche Endziel erreichen würden. Ich möchte jedoch Ihr Feedback dazu erhalten, wie der richtige Ansatz aussehen sollte.

Peter
quelle

Antworten:

82

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

Lassen Sie uns zunächst überprüfen, warum eine eindeutige IV pro verschlüsselter Datei wichtig ist. ( Wikipedia zu IV ). Die IV fügt Ihrem Start Ihres Verschlüsselungsprozesses Zufälligkeit hinzu. Bei Verwendung eines Verschlüsselungsmodus für verkettete Blöcke (bei dem ein Block verschlüsselter Daten den vorherigen Block verschlüsselter Daten enthält) bleibt ein Problem hinsichtlich des ersten Blocks bestehen, bei dem die IV eingeht.

Wenn Sie keine IV hatten und die Verkettung verketteter Blöcke nur mit Ihrem Schlüssel verwendeten, erzeugen zwei Dateien, die mit identischem Text beginnen, identische erste Blöcke. Wenn sich die Eingabedateien auf halbem Weg ändern würden, würden die beiden verschlüsselten Dateien von diesem Punkt an bis zum Ende der verschlüsselten Datei unterschiedlich aussehen. 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 begann und was der entsprechende 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 unterscheidet sich dies nicht davon, dass die IV überhaupt nicht verwendet wird.

Kommen wir nun zu Ihren vorgeschlagenen Optionen:

Option 1. Betten Sie fest codiertes 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, werden Sie abgespritzt. Das würde bei beiden Optionen passieren. (Angenommen, es gibt einen Hauptschlüssel, mit dem alle Dateien verschlüsselt werden).

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

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

PS: Wenn Sie sich für Option 3 und zufällige IVs entschieden haben, prüfen Sie, wie Sie feststellen können, 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 fortschreitet und zu Müllergebnissen führt. Beginnen Sie in diesem Fall mit der Untersuchung der authentifizierten Verschlüsselung .

Schwänze
quelle
1
Die IV wird zur Entschlüsselung benötigt.
Schwänze
5
(Zumindest im CBC-Modus) eine falsche IV beschädigt jedoch nur den ersten Block. Sie können den verbleibenden Dateiinhalt dennoch entschlüsseln.
MV.
1
Ich sehe hier an einigen Stellen ähnliche Kommentare wie oben ("Eine falsche IV beschädigt nur den ersten Block, Sie können den verbleibenden Dateiinhalt immer noch entschlüsseln"). Das ist nicht wahr. Da der verschlüsselte erste Block die IV für den zweiten Block (usw.) ist, bedeutet eine unbekannte IV, dass keine Blöcke entschlüsselt werden können. Das CBC-Diagramm auf Wikipedia macht dies ziemlich deutlich: Link
Rich
4
@Rich - Ich weiß, dass mein Kommentar 4 Jahre zu spät ist, aber ... Ich habe versucht, eine beschädigte IV zu verwenden, um sie mit .NET AES-Bibliotheken zu entschlüsseln. Nur der erste Block wurde beschädigt. Dies liegt daran, dass der verschlüsselte Block die IV des nächsten Blocks in CBC ist ... Und wenn Sie einen anderen als den ersten Block entschlüsseln, haben Sie immer den verschlüsselten vorherigen Block.
Les
2
@Les - Vielleicht 4 Jahre zu spät, aber du hast absolut Recht. Mein obiger Kommentar ist für CBC völlig falsch. Keine Ahnung was ich dachte. Vielen Dank.
Rich
32

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 Einzigartigkeit sicherstellen können, ist Zufälligkeit weniger wichtig (aber immer noch eine sehr gute Sache!). Die IV muss nicht geheim sein (und kann im CBC-Modus auch nicht sein).

Aus diesem Grund sollten Sie die IV nicht neben dem Schlüssel speichern. Dies würde bedeuten, dass Sie für jede Nachricht dieselbe IV verwenden, was den Punkt einer IV zunichte macht. Normalerweise stellen Sie die IV einfach der verschlüsselten Datei im Klartext voran .

Wenn Sie Ihre eigenen Verschlüsselungsmodi wie diesen verwenden möchten, lesen Sie bitte die entsprechenden Standards. Das NIST hat hier ein gutes Dokument zu Verschlüsselungsmodi: http://dx.doi.org/10.6028/NIST.SP.800-38A Die IV-Generation 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 sicherer aussieht , aber tatsächlich weniger sicher ist.

bdonlan
quelle
6
@ Peter, dafür ist eine IV nicht gedacht. Insbesondere wenn die IV unbekannt ist, der Schlüssel jedoch bekannt ist, kann der Hacker im CBC-Modus den ersten Block des Klartextes nicht wiederherstellen . Sie können jedoch den Rest des Klartextes wiederherstellen. Der einzige Zweck der IV besteht darin, die Datei so zu stören, dass wiederholte Verschlüsselungen nicht dieselbe Ausgabe erzeugen (daher kann der Angreifer nicht erkennen, dass zwei Dateien denselben Inhalt haben, indem er feststellt, dass der Chiffretext identisch ist).
Bdonlan
1
Bearbeiten: Ich habe meine vorherigen Kommentare gelöscht. Ich stimme zu, wenn ich I cwe.mitre.org/data/definitions/329.html lese, bedeutet dies, dass Sie eine zufällige IV verwenden und nicht wiederverwenden sollten. Wenn Sie sich auf das Passwort, das Salz usw. stützen, wird dies verletzt.
Phil Bolduc
2
Es wäre sinnvoll, eine statische IV zu verwenden, wenn Sie sie nur zum Verschlüsseln zufälliger Daten (Sitzungsschlüssel oder andere abgeleitete Schlüssel) verwenden. Andernfalls sollten Sie eine zufällige IV verwenden. Wenn Sie für jede verschlüsselte Nachricht Platz für die zusätzlichen <blocksize> -Bytes haben, können Sie auch immer eine verwenden.
Maarten Bodewes
1
@owlstead, wenn Sie eine feste IV verwenden, ist es wichtig sicherzustellen, dass der erste Klartextblock der Nachricht immer eindeutig ist. Es reicht nicht aus, dass die Botschaft insgesamt einzigartig ist. Wenn Ihre Nachricht die Größe eines einzelnen Klartextblocks (z. B. abgeleitete Schlüssel) hat und eindeutig ist, können Sie einfach den EZB-Modus verwenden.
Bdonlan
1
@bdonlan: Natürlich muss der erste Block eindeutig sein, aber das ist bei zufälligen Daten der Fall. Wenn die Nachricht die Größe eines einzelnen Klartextblocks hat, können Sie den EZB-Modus verwenden, aber nur, wenn Sie den Schlüssel nicht wiederverwenden - der Teufel
steckt
13

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

gpeche
quelle
Letztendlich soll sichergestellt werden, dass ein Hacker die verschlüsselte Datei nicht aufbrechen kann. Die Größe von IV scheint kleiner zu sein als die Größe des Schlüssels. Wenn der Schlüssel fest ist und die IV variiert, wie Sie vorgeschlagen haben, hat ein Hacker weniger Kombinationen, um zu versuchen, die Datei aufzubrechen. Fehlt mir etwas?
Peter
11
Die IV soll nicht sicherstellen, dass ein Hacker die verschlüsselte Datei nicht aufbrechen kann. Wenn Sie dieselbe Datei zweimal verschlüsseln, wird eine andere verschlüsselte Ausgabe erzeugt.
Bdonlan
bdolan Diese kleine Nachricht ließ mich endlich die Münze fallen. Ich hatte Probleme zu verstehen, wie wichtig die IV im Vergleich zur Nachrichtenlänge ist, aber ich sehe, dass es nicht wirklich ist, aber es ist stattdessen wichtig im Vergleich zum Nachrichteninhalt. Danke !
DusteD
0

IV wird verwendet, um die Sicherheit durch Zufälligkeit zu erhöhen. Dies bedeutet jedoch nicht, dass es von allen Algorithmen verwendet wird, d. H. Geben Sie hier die Bildbeschreibung ein

Der Trick ist, wie lange sollte die IV sein? Normalerweise hat es die gleiche Größe wie die Blockgröße oder die Verschlüsselungsgröße. Zum Beispiel hätte AES 16 Bytes für IV. Außerdem kann auch der IV-Typ ausgewählt werden, dh eseqiv, seqiv, chainiv ...

LinconFive
quelle