Должен ли я прочитать файл (содержащий данные для шифрования) в cbc (), или я могу прочитать файл вне cbc () и передать блоки данных в cbc () как метод?
Вы определенно хотите передать данные в качестве аргумента, чтобы функция CBC могла использоваться с другими источниками данных.Видите ли, вы не обязательно должны шифровать только файл, может быть, вам захочется зашифровать некоторую передачу через сокет в какой-то момент.
Какой вариант является безопасным?
Обе эти опции могут быть реализованы как безопасно, так и небезопасно.Ни один из методов не является более безопасным, чем другой, он действительно зависит от самой реализации.Теперь я не собираюсь углубляться в проблему безопасности, поскольку уверен, что вы уже много раз читали, что кодирование собственной реализации любого криптографического алгоритма может быть и большую часть времени небезопасно, но одну вещь вы должны сохранитьв уме, и это довольно легко сделать - протрите свои буферы после их использования!Когда вы, например, читаете свой файл, вы сохраняете данные в каком-то векторе или строке, которые будут уничтожены в конце его срока службы, что нормально, но данные все еще находятся в памяти, они не были стерты.Поэтому, если вы возьмете указатель на данные, уничтожите вектор и посмотрите на данные, на которые указывает указатель, исходные данные будут оставаться там до тех пор, пока этот блок памяти не будет использован для хранения чего-либо еще.Для этого вы хотите использовать несколько пользовательских распределителей.
Если вам нужен рабочий пример реализации CBC, вы можете взглянуть на мою реализацию CBC .Теперь я не эксперт, поэтому есть некоторые возможные проблемы, которые я мог бы просто игнорировать при реализации этого.
Как я могу узнать, какой вектор инициализации использовался, когда файл был зашифрован.Также, если мне нужно передать IV пользователю, как?
Вектор инициализации не является частным, вы можете просто сохранить его любым удобным вам способом.Например, вы можете просто сохранить IV в самом зашифрованном файле, чтобы пользователю не нужно было об этом беспокоиться.
Что-то вроде: [IV] [HMAC] [CIPHER]
Затем при расшифровкеВы можете прочитать «заголовок», аутентифицировать данные, используя HMAC (который сообщает вам, верен ли предоставленный пароль), а затем расшифровать данные.