Реализация CBC режима работы AES - PullRequest
0 голосов
/ 26 мая 2018

У меня есть реализация шифра AES для 128, 192 и 256-битных ключей.Я пытаюсь реализовать режим операций блочного шифра, в настоящее время внедряю режим Cipher Block Chaining.

У меня есть два вопроса относительно реализации режима CBC:

1.Речь идет о подаче данных в процедуру шифрования, я вызываю процедуру шифрования в cbc()\\this function implements cbc mode.У меня вопрос, должен ли я прочитать файл (содержащий данные для шифрования) в cbc() или я могу прочитать файл вне cbc() и передать блоки данных в cbc() в качестве набора.Какой из них является безопасной реализацией.

2.Для режима CBC требуется произвольно сгенерированный вектор инициализации, также называемый IV (для этого я использую генератор случайных байтов в c ++ 11), поскольку пользователь вводит ключ только во время шифрования / дешифрования. Как узнать, какой вектор инициализации использовался?когда файл был зашифрован.Также, если мне нужно передать IV пользователю, как?

Я реализую их в C ++ 11.

спасибо.

1 Ответ

0 голосов
/ 26 мая 2018

Должен ли я прочитать файл (содержащий данные для шифрования) в cbc (), или я могу прочитать файл вне cbc () и передать блоки данных в cbc () как метод?

Вы определенно хотите передать данные в качестве аргумента, чтобы функция CBC могла использоваться с другими источниками данных.Видите ли, вы не обязательно должны шифровать только файл, может быть, вам захочется зашифровать некоторую передачу через сокет в какой-то момент.

Какой вариант является безопасным?

Обе эти опции могут быть реализованы как безопасно, так и небезопасно.Ни один из методов не является более безопасным, чем другой, он действительно зависит от самой реализации.Теперь я не собираюсь углубляться в проблему безопасности, поскольку уверен, что вы уже много раз читали, что кодирование собственной реализации любого криптографического алгоритма может быть и большую часть времени небезопасно, но одну вещь вы должны сохранитьв уме, и это довольно легко сделать - протрите свои буферы после их использования!Когда вы, например, читаете свой файл, вы сохраняете данные в каком-то векторе или строке, которые будут уничтожены в конце его срока службы, что нормально, но данные все еще находятся в памяти, они не были стерты.Поэтому, если вы возьмете указатель на данные, уничтожите вектор и посмотрите на данные, на которые указывает указатель, исходные данные будут оставаться там до тех пор, пока этот блок памяти не будет использован для хранения чего-либо еще.Для этого вы хотите использовать несколько пользовательских распределителей.

Если вам нужен рабочий пример реализации CBC, вы можете взглянуть на мою реализацию CBC .Теперь я не эксперт, поэтому есть некоторые возможные проблемы, которые я мог бы просто игнорировать при реализации этого.

Как я могу узнать, какой вектор инициализации использовался, когда файл был зашифрован.Также, если мне нужно передать IV пользователю, как?

Вектор инициализации не является частным, вы можете просто сохранить его любым удобным вам способом.Например, вы можете просто сохранить IV в самом зашифрованном файле, чтобы пользователю не нужно было об этом беспокоиться.
Что-то вроде: [IV] [HMAC] [CIPHER]

Затем при расшифровкеВы можете прочитать «заголовок», аутентифицировать данные, используя HMAC (который сообщает вам, верен ли предоставленный пароль), а затем расшифровать данные.

...