Шифрование AES с помощью указателей

#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. Ну что ж. Я ожидал этого. Я надеюсь, что это все равно будет быстро.