2009-02-04 2 views
4

Я хочу попытаться связать функцию API Windows CryptUnprotectData и .net SecureString вместе наилучшим образом. CryptUnprotectData возвращает структуру DATA_BLOB, состоящую из массива байтов и длины байта. В моей программе это будет строка Unicode UTF-16. SecureString имеет конструктор, который принимает символ * и длину Params, поэтому я хотел бы быть в состоянии сделать что-то вроде:Создать SecureString из неуправляемой строки unicode

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

Это работает, кроме UTF-16 является переменной длиной, так что я не знаю что использовать в качестве аргумента длины. В приведенном выше примере предполагается 2 байтовых символа (BMP), но для других плоскостей оно может составлять до 4 байтов. Мне нужно знать количество символов UTF-16 в массиве байтов. Каков наилучший способ сделать это, не копируя значения в памяти (тем самым угрожая безопасности). Я планирую обнулить и освободить массив байтов как можно быстрее.

ответ

2

Большая часть Windows API имеет дело с кодовыми точками UTF-16, насколько я знаю, другими словами, вы обрабатываете суррогатные пары как два кодовых пункта вместо одного символа. Учитывая, что конструктор для SecureString имеет дело с указателем на значения .NET System.Char (которые являются UTF-16), я думаю, что у вас есть фрагмент кода - количество элементов в pbData равно с половиной его размера в байтах.

Например, если содержащаяся pbData (только) суррогатная пара, cbData будет 4, и вы все еще хотите, чтобы пройти в 2 в качестве второго аргумента - потому что это число System.Char значений вы, составляющих SecureString от. Тот факт, что это один символ Unicode без BMP, не имеет отношения к числу значений UTF-16 System.Char, в котором он представлен.

(И да, поддержка данных, отличных от BMP, немного путаница, и я подозреваю очень мало людей получают все правильно, я уверен, что нет. К счастью, во многих местах вам не нужно беспокоиться ...)

+0

Спасибо, много, Джон, это имеет смысл! Этот материал для меня все еще новенький. – Jarrod

Смежные вопросы