CCCrypt entschlüsseln in AES CBC funktioniert auch ohne IV

8

Ich habe ein verwirrendes Problem, bei dem das Entschlüsseln einer Datei, die mit dem AES-CBC-Modus von CCCrypt mit einer 16-Byte-Zufallsauswahl verschlüsselt wurde, genau die gleiche Ausgabe liefert, egal ob ich die richtige IV für die Verschlüsselung übergebe oder nicht / p>

Was ich erwarte: Die Verwendung eines NULL IV zum Entschlüsseln sollte nicht zu einer korrekten Entschlüsselung führen. Was ich beobachte: Die Verwendung von NULL IV führt zu demselben Ergebnis wie bei der IV, die für die Verschlüsselung verwendet wird.

Im Folgenden sind die wichtigsten Code-Snippets aus Gründen der Vollständigkeit aufgeführt: iv wird als 16-Byte-NCIS-Daten mit sicherer Randomisierung übergeben.

Was verstehe ich hier nicht? Kann CCCrypt die IV selbst aus den verschlüsselten Daten herausfinden? Ich konnte nichts in der Dokumentation finden.

%Vor%

BEARBEITEN:

Um dies näher auszuführen, egal welche IV ich für die Entschlüsselung verwende (habe ein paar verschiedene randomisierte IVs ausprobiert), bekomme ich immer Byte für Byte die identischen Ergebnisse. Selbst wenn ich nur einen Teil der verschlüsselten Datei irgendwo in der Mitte der verschlüsselten Datei entschlüssle.

Kann das mit den tatsächlichen Daten zusammenhängen, die ich entschlüssle (mp3-Dateien)?

Wenn ich einfach einen beliebigen Teil der eigentlichen verschlüsselten Datei an den Entschlüsseler übergebe, sollte nicht der Block direkt vor diesem Datenblock (den ich nicht explizit als IV angegeben habe) benötigt werden, um die korrekte Entschlüsselung durchzuführen? Die einzige Erklärung, die ich mir persönlich vorstellen konnte, ist, dass CCCrypt immer nur die ersten 16 Bytes als IV verwendet und diese nicht entschlüsselt, sondern in der Ausgabe ablegt.

EDIT 2:

Ausgabe von en / decryption, zeigt die ersten zwei Blöcke von Ein- und Ausgabedaten, den Schlüssel und den iv:

%Vor%

EDIT 3:

Der Code für -dataForHex: lautet:

%Vor%     
Dennis 19.11.2014, 10:18
quelle

4 Antworten

5

Wird zum Formatieren von Kommentaren verwendet.

Mit iv:

%Vor%

Mit iv von 0:

%Vor%

Es ist klar, dass das iv im OP-Code nicht verwendet wird.

Code für oben:

%Vor%     
zaph 19.11.2014, 14:27
quelle
5

Es ist auch erwähnenswert, dass man den Modus niemals mit den Padding-Optionen einschließen sollte. Ich habe das schon ziemlich oft gesehen, und ich bin in die gleiche Falle geraten, indem ich versucht habe, "so explizit wie möglich" zu sein.

%Vor%

Sollte sein:

%Vor%

Fun fact 1: Sowohl kCCModeEBC als auch kCCOptionPKCS7Padding teilen sich den gleichen Wert: 1 und würden tatsächlich die Verwendung von kCCOptionPKCS7Padding auswerten, was dann standardmäßig zu kCCModeCBC würde.

Fun fact 2: Die Verwendung von kCCOptionPKCS7Padding | kCCModeCBC ergibt, dass sowohl kCCOptionPKCS7Padding flag als auch kCCOptionECBMode gesetzt sind, was tatsächlich dazu führt, dass kCCModeEBC verwendet wird.

    
ocgully 05.03.2015 22:30
quelle
3

Der iv wird nur für den ersten Block bei der Entschlüsselung verwendet, weitere Blöcke verwenden den verschlüsselten Text des vorherigen Blocks, so dass es sich etwas selbstsynchronisiert.

Wikipedia Bild:

Aus Wikipedia Block Cipher-Modus .

Also, die Entschlüsselung in der Mitte eines CBC-verschlüsselten Streams an einer Blockgrenze funktioniert, außer für den ersten Block.

    
zaph 19.11.2014 14:34
quelle
0

Sie können die richtige Antwort hier lesen: Ссылка

Apple hat in ihrer Crypto-Bibliothek einen Fehler gemacht, der davon ausgeht, dass wenn der IV-Vektor nicht bereitgestellt wird, er die IV automatisch auf einen Nullvektor setzt, anstatt einen Fehler zurückzugeben. Eine IV sollte immer zur Verfügung gestellt werden, um die beste Sicherheit zu gewährleisten, und Apple sollte nicht ihre Null-Annahme machen, da sie die Sicherheit stark schwächt und sie anfällig für Angriffe macht.

    
USTD 22.03.2016 14:22
quelle