Frage

Ich bin zu wollen, um zu versuchen, die CryptUnprotectData Windows-API-Funktion und den .net Secure zusammen, um die bestmögliche Weise zu binden. CryptUnprotectData gibt eine DATA_BLOB Struktur, bestehend aus einem Array von Bytes und einer Byte-Länge. In meinem Programm wird dies eine Unicode UTF-16 Zeichenfolge sein. Secure hat einen Konstruktor, der ein char * und Länge params nimmt, so würde Ich mag zu können, so etwas wie:

SecureString ss = SecureString((char*)textBlob.pbData, textBlob.cbData / 2);

Das funktioniert, außer UTF-16 mit variabler Länge, so dass ich nicht wirklich weiß, was als die Länge Argument zu verwenden. Das obige Beispiel geht davon aus 2-Byte-Zeichen (BMP), sondern auch für andere Ebene könnte es bis zu 4 Byte sein. Ich brauche die Anzahl der UTF-16-Zeichen in der Byte-Array kennen. Was ist der beste Weg, um dies die Werte um im Speicher (dabei Abstriche bei der Sicherheit) ohne das Kopieren zu tun. Ich plane auf eliminierte und befreite den Byte-Array so schnell wie möglich.

War es hilfreich?

Lösung

Die meisten der Windows-API-Angebote mit UTF-16-Codepunkte, soweit ich weiß - in anderen Worten, behandeln Sie Ersatzpaare als zwei Codepunkte anstelle eines einzelnen Zeichens. Da der Konstruktor für Secure wird mit einem Zeiger auf .NET System.Char Werte handelt (die UTF-16) Ich denke, die Code-Snippet du hast ist in Ordnung - die Anzahl der Elemente in pbData ist Hälfte seine Größe in Bytes.

Zum Beispiel, wenn pbData enthält (nur) ein Ersatzpaar, würde cbData 4 sein, und Sie würden immer noch wollen, in 2 als zweites Argument übergeben - denn das ist die Anzahl der System.Char Werte ist Du zum SecureString von der Konstruktion. Die Tatsache, dass es ein nicht-BMP Unicode-Zeichen ist irrelevant für die Anzahl von UTF-16 System.Char Werten es in dargestellt ist.

(Und ja, die Unterstützung für Nicht-BMP-Daten ist ein bisschen ein Durcheinander, und ich vermute, nur sehr wenige Menschen es überall richtig. Ich bin sicher, dass ich nicht. Zum Glück in vielen Orten, die Sie brauchen nicht Sorgen ...)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top