2009-08-07 2 views
0

Ich implementiere ein Dateisystem mit Protokollstruktur und möchte eine Reihe von Blöcken mithilfe des .NET Cryptography-Namespace verschlüsseln. Ich habe die symmetrische Aes-Verschlüsselung gewählt, den Schlüssel und den initialen, zufälligen Initialisierungsvektor erstellt.Wie wird der intermediate Initialization Vector aus einer Sequenz von Verschlüsselungsschritten extrahiert?

So weit so gut, mit der ICryptoTransform zurückgegeben von SymmetricAlgorithm.CreateEncryptor() ist es möglich, die einzelnen Blöcke zu verschlüsseln.

Um die "Direktzugriff" -Abtastung zur Entschlüsselungszeit zu ermöglichen, müssen die Zwischeninitialisierungsvektoren zusammen mit den verschlüsselten Blöcken gespeichert werden.

Aber ich kann keinen Weg sehen, die Zwischen IVs zu extrahieren? Sie müssen in der Instanz gespeichert werden, die den Verschlüsselungsalgorithmus implementiert, aber - wie ich sehen kann - auf die aktuelle IV kann nicht zugegriffen werden.

Natürlich kann diese Einschränkung umgangen werden, indem zufällige IVs erzeugt werden oder indem verschlüsselte Daten missbraucht werden, um den nächsten Block in der Kette zu verschlüsseln. Aber das fühlt sich an wie ein Hack aufgrund der Tatsache, dass die Blockverkettung in den meisten symmetrischen Algorithmen unterstützt wird, die - wie ich annehme - nur den resultierenden Vektor aus der Verschlüsselung des vorherigen Blocks wiederverwenden.

Antwort

1

Der CBC-Modus kettet jeden Block zusammen, indem er die Verschlüsselung des vorherigen Blocks vor der Verschlüsselung an den Klartextblock XORt. Wenn Sie den ersten Block verschlüsseln, müssen Sie keinen vorherigen Block verwenden, daher geben Sie einen IV für den ersten Block an.

Also was Sie die "Zwischen IV" nennen, ist nur die Verschlüsselung des vorherigen Blocks. Kein Hack benötigt.

+0

+1: Vielen Dank. Ihre Antwort zeigt ein tiefgreifendes Verständnis des Verschlüsselungsvorgangs und macht die Dinge für mich komplett sauber. Erleuchtung !!! :) – Armin

0

Die IV muss der verschlüsselten Informationen an den Empfänger bekannt sein Lage sein, es zu entschlüsseln. Dies kann in mehrfacher Hinsicht gewährleistet: durch Übertragen der IV zusammen mit dem Paket, indem auf sich die Vereinbarung vorher während des Schlüsselaustausches oder den Handshake, indem es die Berechnung (in der Regel inkrementell), oder durch Messung Parameter als aktuelle Zeit, IDs wie Absenders und/oder Empfängeradresse oder ID, Dateikennung, das Paket, einen Sektor oder Cluster-Nummer (in Hardware-Authentifizierungs-Tokens wie RSA SecurID, VASCO Digipass usw. verwendet) , usw.

Ref.

+0

Ja, die IVs werden schrittweise für jeden Block berechnet, aber um sie zu speichern, müssen sie bekannt sein. Meine Frage war, wie man sie aus dem .NET-API-Verschlüsselungsalgorithmus abruft. – Armin