Вопрос

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

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

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

Это было полезно?

Решение

Насколько мне известно, большая часть 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, немного запутана, и я подозреваю, что очень немногие люди везде делают это правильно.Я уверен, что нет.К счастью, во многих местах вам не нужно беспокоиться ...)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top