#c# #.net #security #pointers #encryption
#c# #.net #Безопасность #указатели #шифрование
Вопрос:
Я использую
Aes
класс для шифрования некоторых байтов. Я могу вызвать
CreateEncryptor
способ получить ICryptoTransform
, а затем соответствующим образом использовать его оттуда. Однако данные, которые я шифрую, являются указателем на некоторую память. (a byte*
). ICryptoTransform принимает только byte[]
‘s
Мой вопрос в том, должен ли я СКОПИРОВАТЬ указатель в управляемый массив, прежде чем использовать его для AES?
Комментарии:
1. Как вы создали память для массива? соответствует ли размер массива?
2. @MichaelRandall Что касается памяти для массива, я предполагаю, что вы имеете в виду указатель (то есть источник данных). Этот указатель поступает из неуправляемой памяти. Да, указатель имеет постоянный размер, вплоть до последнего блока.
3. Откуда берется
byte *
. Программы на C # обычно не имеют дела с указателями4. @Flydog57 байт * поступает из неуправляемой библиотеки.
5. Здесь вы мало что можете сделать, если пытаетесь сохранить все до последнего распределения. Нет смысла использовать span, так как вам пришлось бы вызывать toArray, единственный реальный вариант, который у вас есть, я вижу, это использовать статический буфер, который сохранит непрерывные выделения, но не будет потокобезопасным. Событие, после которого вам нужно будет его применить, для чего есть несколько взломов
Ответ №1:
Да, вы должны скопировать. Неуправляемый указатель, byte *
поступающий из неуправляемой библиотеки, не будет содержать дополнительной информации, которой обладает управляемая byte[]
, которая включает длину, дескриптор типа, чтобы CLR знала, к какому типу относится эта память, и индекс блока синхронизации, используемый ключевым словом lock.
Таким образом, любой управляемый метод, ожидающий byte[]
, ожидает, что переданный массив будет соответствовать .Формат сетевого объекта. Например, если ICryptoTransform
методы попытаются получить доступ к длине массива, он не найдет его в неуправляемом byte *
указателе. Если он пытается получить блокировку byte[]
массива с помощью lock
ключевого слова, он ожидает индекс блока синхронизации и т.д.
Работает наоборот, вы можете использовать fixed
ключевое слово для получения указателя на первый элемент в byte[]
массиве. Это связано с тем, что ожидающий код byte*
не заботится о дополнительной информации в byte[]
(хотя многие неуправляемые коды могут заботиться о длине и требуют, чтобы вы передавали длину в качестве отдельного аргумента).
Комментарии:
1. Ну что ж. Я ожидал этого. Я надеюсь, что это все равно будет быстро.