C # TripleDES-Provider ohne Initialisierungsvektor?

8

Ich habe eine Reihe von verschlüsselten Dokumenten, die mit TripleDES von einem Remote-System verschlüsselt wurden. Ich muss die Daten in C # dekodieren und habe keine Kontrolle über den Schlüssel oder den Kodierungsalgorithmus. Alles, was ich habe, ist der Schlüssel und der Modus (CBC) und die Daten in einer Datei.

Der TripleDESCryptoServiceProvider ist einfach zu verwenden, aber ich kann nicht herausfinden, wie man den Decryptor ohne einen Initialisierungsvektor verwendet.

Wir haben einen 24-Byte (192bit) Schlüssel zum Entschlüsseln, aber sonst nichts.

%Vor%

Dies schlägt direkt bei ungültigen Daten fehl. Wenn ich zu TransformBlock umschalte, läuft der Code zumindest, aber produziert nur Kauderwelsch:

%Vor%

Also sind die Fragen:

  • Wenn ich nur einen Schlüssel habe, ist der InitializationVector erforderlich?
  • Wenn nicht ist null das Richtige zu passieren?
  • Was müsste ich sonst noch über den Schlüssel und den Modus hinaus setzen?
  • Warum funktioniert TransformBlock zumindest und TransformFinalBlock schlägt einfach fehl?

Update - das Problem gefunden

Es stellt sich heraus, dass das Dekodierungsproblem nicht durch den fehlenden Initialisierungsvektor, sondern durch falsche Informationen vom Anbieter der verschlüsselten Daten verursacht wurde. Der aktualisierte Arbeitscode sieht folgendermaßen aus:

%Vor%

Der Schlüssel in unserem Fall war der richtige CipherMode und Padding. Reparieren der Füllung gemacht TransformFinalBlock () funktioniert ohne Bad Data Fehler. Fixing der CipherMode richtig gemacht, unverschlüsselt die Daten.

Moral der Geschichte: Im CipherMode.ECB-Modus mindestens einen Initialisierungsvektor müssen Sie keinen Initialisierungsvektor bereitstellen. Wenn keine IV zur Verfügung gestellt wird, wird der Provider automatisch eine generieren, aber die Entschlüsselung funktioniert immer noch (zumindest mit EZB).

Am Ende ist es wichtig, dass Sie alle Informationen von dem Provider haben, der die Daten verschlüsselt hat.

    
Rick Strahl 20.09.2012, 23:07
quelle

1 Antwort

9

Versuche jeden Punkt zu beantworten:

  • Der Initialisierungsvektor wird im CBC-Modus benötigt. Es ist nicht erforderlich, ein Geheimnis zu sein (anders als der Schlüssel), also sollte es vom Fernsystem gesendet werden.
  • Da Sie die IV brauchen, ist null nicht das Richtige, um sie zu bestehen.
  • Füllmodus. Sie müssen wissen, welcher Füllmodus verwendet wird.
  • TransformFinalBlock schlägt wahrscheinlich fehl, weil der Padding-Modus falsch ist.

Bearbeiten

Der Unterschied zwischen ECB (Electronic Code Book) und CBC (Cipher Block Chaining) ist unten dargestellt:

Wie Sie sehen können, wird im EZB-Modus kein IV verwendet. Selbst wenn Sie einen angeben, wird er ignoriert.

    
Sani Singh Huttunen 20.09.2012, 23:27
quelle

Tags und Links