С использованием aes_cfb_encrypt
а также aes_cfb_decrypt
функции, у меня есть следующие вопросы.
Я шифрую большой файл размером около 100 МБ и передаю случайный * IV в первый раз, я должен использовать тот же * IV для остальной части цикла, или я должен использовать обновленный * IV с последнего вызова блока шифрования.
Наконец, я имею дело со структурированным файлом, поэтому я должен был использовать Sizeof (структура) как длина из буфера или должны использовать SizeOf (структура) * 8 как длина буфера для шифрования или дешифрования.
Пожалуйста, руководство ..
AES_RETURN aes_cfb_encrypt(const unsigned char *ibuf, unsigned char *obuf, int len, unsigned char *iv, aes_encrypt_ctx cx[1]);
AES_RETURN aes_cfb_decrypt(const unsigned char *ibuf, unsigned char *obuf, int len, unsigned char *iv, aes_encrypt_ctx cx[1]);
[/ NOEDIT]
Отвечая на ваши вопросы, обратите внимание на следующее:
PT(x) = Plain Text representation of 'x'
CT(x) = Cipher Text representation of 'x'
Bn = Logical Data Block 'n' in a sequence of multiple blocks.
1. Что такое IV?
IV короткое обозначение для Вектор инициализации. Он используется в симметричных алгоритмах блочного шифрования, которые выполняют их шифрование в так называемых прикованный или же Обратная связь режимы. В обоих случаях предыдущий блок зашифрованных данных используется как часть функциональных данных «goo» для изменения следующего блока данных, который должен быть зашифрован. Каждый последующий блок данных, который зашифрован, подается в ранее зашифрованный блок данных в качестве буфера для использования. Но как насчет первый блок открытого текста? Что значит Это использовать для своего специального соуса? Ответ: IV предоставляется функции. Наглядно это выглядит следующим образом:
CT(B1) = Encrypt(IV + PT(B1))
CT(B2) = Encrypt(CT(B1) + PT(B2))
CT(B3) = Encrypt(CT(B2) + PT(B3))
...
CT(Bn) = Encrypt(CT(Bn-1) + PT(Bn))
Примечание: «+» в вышеприведенном обозначении означает применение предыдущего блока шифра к следующему блоку открытого текста. это не следует рассматривать как математическое сложение. Думайте об этом как «в сочетании с».
Размер IV должен быть таким же, как размер блока используемого симметричного алгоритма. И AES-128-CFB, и AES-256-CFB используют 128-битный размер блока (16 байтов). Следовательно, для ваших целей в этом вопросе ваш IV должен составлять 16 байтов случайного сгущения и должен генерироваться на стороне шифрования с использованием безопасного алгоритма произвольного источника, совместимого с FIPS.
2. Требуется ли сохранить IV для расшифровки?
Да, но не обязательно так, как вы думаете. Первый IV (предоставленный вами) должен быть сохранены как-то. Традиционно, он отправляется именно там, где вы думаете, это должно быть; в качестве первого блока зашифрованных данных. Это часто пугает людей, они думают: «Но если я отправлю IV с данными, это не так безопасно, не так ли?» Подумайте об этом таким образом. Сколько «IV» ты отправляешь? Помните, что каждый блок данных шифруется с использованием предшествующий блок зашифрованных данных как его IV. Следовательно, вы фактически отправляете весь поток IV, каждый зашифрованный блок — IV для следующего зашифрованного блока и т. Д. Если исходный IV находится в вашем зашифрованном тексте, это вопрос представления данных, но куда он идет, в конечном итоге не имеет значения для вопрос. Это должен быть сохраненным. Возможно, ваш API делает это для вас как часть своего выходного потока (на самом деле это не редкость).
3. Каждый раз, когда я шифрую блок данных, изменяется * iv. Что мне делать с этим измененным * iv?
Я не знаком с API, который вы используете, но, похоже, вы получили IV для использования в следующий шифрование, которое имеет смысл, если учесть, как обратная связь или цепочка работает для шифрования в блочном режиме. Вы не должны использовать один и тот же IV повторно. Используйте тот, который вернулся последним, как следующий. Поскольку ваш API модифицирует IV на месте, похоже, единственное, что вам может понадобиться, это сохранить начальная IV где-то еще до отправки. Я бы сравнил первый блок зашифрованного текста с вашим IV. если они не совпадают, вам, вероятно, нужно отправить свой IV, затем цепочку зашифрованного текста в потоке данных, и получатель должен знать, что первый блок — это IV дешифрования.
4. Я шифрую большой файл размером около 100 МБ и в первый раз передаю случайный * iv, должен ли я использовать тот же * iv для остальной части цикла, или я должен использовать обновленный * iv из последний вызов зашифрованного блока.
Смотрите (3). Используйте обновленный IV для каждого последующего блока.
5. Наконец, я имею дело со структурированным файлом, поэтому я должен указать Sizeof (struct) в качестве длины буфера или использовать sizeof (struct) * 8 в качестве длины буфера для шифрования или дешифрования.
Используйте размер вашей структуры в байтах (не биты). C / C ++ sizeof(yourstruct)
следует рассчитать это для вас, но учтите, что если вы шифруете каждую структуру как независимую сущность (а не весь файл в одной массе), каждое шифрование будет содержать минимальный объем данных, добавляемых для учета (а) IV используется для этой структуры, и (б) заполнение последнего блока до четной границы блока, при условии, что вы используете заполнение PKCS5. Следовательно, точный размер зашифрованной структуры будет:
IV + ((sizeof(struct) + 15)/16)*16) bytes.
Опять же, это если вы независимо шифруете и храните каждую структуру как отдельное шифрование, и опять же, ваш API может объяснить некоторые из них за вас.
Для получения дополнительной информации о симметричной AES см. AES запись в вики. Для получения информации о режиме блочного шифрования CFB см. Режимы работы блочного шифра статья на том же сайте.
Надеюсь, это поможет. Делай домашнее задание и, прежде всего, учись именно так как работает ваш API, с чем я, к сожалению, не могу вам помочь.
Вектор инициализации (IV) в криптографической системе является случайным значением, которое включается как часть инициализации системы шифрования, чтобы гарантировать, что, если одни и те же данные шифруются несколько раз, они всегда возвращаются, выглядя по-разному. Это требование защищенных криптографических систем, чтобы гарантировать, что злоумышленник, просматривающий несколько разных зашифрованных сообщений, не сможет легко определить, являются ли любые два из этих сообщений одинаковыми. В идеале IV следует выбирать совершенно случайно.
Вам не нужно сохранять IV для расшифровки. Как правило, IV отправляется в виде открытого текста вместе с зашифрованными данными. Это не проблема безопасности — это дизайн.
IV изменяется на каждой итерации шифрования, поскольку внутренняя криптографическая система итеративно применяет блочный шифр к данным, а затем использует выходные данные этого шифра в сочетании с некоторыми дополнительными данными в качестве нового IV для следующего применения блочного шифра. , Затем этот процесс повторяется столько раз, сколько необходимо. Я подозреваю (но не уверен), что IV будет возвращен вам, чтобы вы могли зашифровать больше данных, с которых вы остановились раньше. Вы должны обязательно перепроверить это!
Что касается того, использовать ли размер вашей структуры или в восемь раз больше — я не могу сказать, не видя больше вашего кода. Однако вам, вероятно, следует предоставить общее количество байтов для шифрования, поэтому, если вы шифруете восемь копий структуры, передайте в восемь раз больше sizeof
структура.
Надеюсь это поможет!