2016-08-02 11 views
0

die Windows Data Protection API verwenden, ist es möglich, Daten im Speicher zu verschlüsseln, wie der folgende Code veranschaulicht:Verschlüsselung mit DPAPI ohne die Länge unverschlüsselter Daten aufzudecken?

byte[] toEncrypt = UnicodeEncoding.ASCII.GetBytes("ThisIsSomeData16"); 

Console.WriteLine("Original data: " + UnicodeEncoding.ASCII.GetString(toEncrypt)); 
Console.WriteLine("Encrypting..."); 

// Encrypt the data in memory. 
EncryptInMemoryData(toEncrypt, MemoryProtectionScope.SameLogon); 

Console.WriteLine("Encrypted data: " + UnicodeEncoding.ASCII.GetString(toEncrypt)); 
Console.WriteLine("Decrypting..."); 

// Decrypt the data in memory. 
DecryptInMemoryData(toEncrypt, MemoryProtectionScope.SameLogon); 

Console.WriteLine("Decrypted data: " + UnicodeEncoding.ASCII.GetString(toEncrypt)); 

hier die Microsoft Referenz Siehe: https://msdn.microsoft.com/en-us/library/ms995355.aspx

jedoch die verschlüsselt gespeichert Daten in diesem Beispiel ist gleich groß wie die Originaldaten. Gibt es eine Möglichkeit, die DPAPI zum Verschlüsseln von Daten zu verwenden, ohne die Dateigröße der ursprünglichen Datei anzugeben? Zum Beispiel, den erzeugten Chiffretext an einem "zufälligen" Punkt innerhalb des Schlüssels zu verstecken, wie es mit einem Zeitblock möglich ist?

+0

Warum konstruieren Sie nicht einfach Ihre Eingabedaten als Länge + Daten + Padding? –

+0

Eine Möglichkeit sicherlich, obwohl dies die Analyse der Daten nach der Entschlüsselung erfordern würde, wenn ich denke, dass dies eine häufige genug Anliegen sein sollte, einige Implementierung bereits haben –

+1

Das hängt von der Qualität der DPAPI-Verschlüsselung, und wie viel Sie über die Möglichkeit von bekannten Klartextangriffen. Eine andere Möglichkeit besteht darin, einen Schlüssel zu erzeugen, diesen für eine ordnungsgemäße Blockverschlüsselung zu verwenden (wie 'AesCryptoServiceProvider') und nur den Schlüssel mit DPAPI zu schützen, so dass die bekannte Länge kein Problem ist. –

Antwort

0

Wenn Sie Daten in einem DPAPI-Blob verschlüsseln und dann diesen Blob entschlüsseln, erhalten Sie genau die gleichen Daten zurück. Das ist der springende Punkt. Wenn Sie nur betrachten Sie den verschlüsselten DPAPI-Blob und das System verwendet AES (wie der Standard ab Win7 ab), dann kann jeder die ungefähre Länge des Geheimnisses aufgrund der Größe der Krypto-Daten in es ist am nächsten mehrere der Blockgröße auf die tatsächliche Länge. Wenn beispielsweise das Geheimnis 17 Bytes lang ist, verschlüsselt der DPAPI-Provider diese Bytes, gefolgt von 15 Bytes mit dem Wert 0xF, um zwei Blöcke für AES zu erzeugen, die verschlüsselt werden sollen (und diese Bytes bei der Entschlüsselung ausblendet). Wenn wir nur die Größe in den DPAPI-Daten sehen, können wir sehen, dass das Geheimnis 16-31 Bytes lang war.

Wenn das ein Problem wäre, müssten Sie Ihr eigenes Geheimnis in Ihre eigene Füllung wickeln: Erstellen Sie als zu schützende Daten: "Länge des geheimen" geheimen "zufälligen Zeug", und setzen Sie das in DPAPI. Jeder konnte die ungefähre Länge dieser Daten (bis zu 16 Bytes) ableiten, aber nicht die Länge des eigentlichen Geheimnisses, außer für die triviale Obergrenze, natürlich. Wenn der berechtigte Benutzer die Entschlüsselung des DPAPI-Blobs zurückbekommt, kann er das Geheimnis aus dem Längenfeld herleiten (das selbst natürlich eine bekannte feste Länge haben sollte). DPAPI stellt sicher, dass die Daten nicht manipuliert werden (es verwendet einen HMAC), so dass Sie darauf vertrauen, dass die Daten korrekt sind.

Sie können auch jedes Byte, von dem Sie wissen, dass es nicht in dem zu schützenden Geheimnis enthalten ist, als Markierungsbyte für das Ende der geheimen Daten verwenden. Z.B. 0x0, wenn es eine C-Zeichenfolge ist. Aber das Hinzufügen der Länge ist mehr ausfallsicher, denke ich.