Хорошо, что вы знаете CBC, поскольку это, безусловно, лучше, чем использование шифрования в режиме ECB (хотя существуют и более совершенные режимы, такие как аутентифицированные режимы GCM и EAX).
Я думаю, что есть несколько вещей, о которых вы должны знать, поэтому я объясню их здесь.
Ключи и пароли не совпадают. Обычно вы создаете ключ, используемый для симметричного шифрования, из пароля, используя функцию получения ключа. Наиболее распространенным из обсуждаемых здесь является PBKDF2 (функция получения ключа на основе пароля # 2), которая используется для PBE (шифрование на основе пароля). Это определено в последнем открытом стандарте PKCS # 5 лабораториями RSA. Перед вводом пароля необходимо проверить, правильно ли пароль переведен в байты (кодировка символов).
Соль используется как еще один вход для функции вывода ключа. Он используется для предотвращения атак методом "грубой силы" с использованием "радужных таблиц", где ключи предварительно вычисляются для конкретных паролей. Из-за соли атакующий не может использовать предварительно вычисленные значения, так как он не может сгенерировать одно для каждой соли. Соль обычно должна быть 8 байтов (64 бита) или длиннее; использование 128-битной соли обеспечит вам оптимальную безопасность. Соль также гарантирует, что идентичные пароли (разных пользователей) не получают один и тот же ключ.
Вывод функции вывода ключа является секретом dkLen
байтов, где dkLen
- длина генерируемого ключа в байтах. Поскольку ключ AES не содержит ничего, кроме этих байтов, ключ AES будет идентичен сгенерированному секрету. dkLen
должно быть 16, 24 или 32 байта для длины ключа AES: 128, 192 или 256 бит.
ОК, теперь у вас наконец есть ключ AES для использования. Однако, если вы просто зашифруете каждый блок простого текста этим ключом, вы получите идентичный результат, если блоки простого текста идентичны. Режим CBC позволяет обойти это, XOR'ing следующий простой текстовый блок с последним зашифрованным блоком перед выполнением шифрования. Этот последний зашифрованный блок является «вектором». Это не работает для первого блока, потому что - это не последний зашифрованный блок. Вот почему вам нужно указать первый вектор: «вектор инициализации» или IV.
Размер блока AES составляет 16 байтов независимо от размера ключа. Таким образом, векторы, включая вектор инициализации, также должны составлять 16 байтов. Теперь, если вы используете только ключ для шифрования, например, один файл, тогда IV может просто содержать 16 байтов со значением 00
h.
Это не работает для нескольких файлов, потому что, если файлы содержат один и тот же текст, вы сможете обнаружить, что первая часть зашифрованного файла идентична. Вот почему вам нужно указывать разные IV для каждого шифрования, которое вы выполняете с ключом. Не имеет значения, что он содержит, если он уникален, 16 байтов и известен приложению, выполняющему расшифровку.
[РЕДАКТИРОВАТЬ 6 лет спустя] Приведенная выше часть не совсем верна: для CBC IV должен быть непредсказуемым для злоумышленника, но не просто должен быть уникальным. Так, например, счетчик не может быть использован.
Теперь есть одна хитрость, которая может позволить вам все время использовать все нули для IV: для каждого простого текста, который вы шифруете с помощью AES-CBC, вы можете вычислить ключ, используя тот же пароль, но другую соль. В этом случае вы будете использовать полученный ключ только для одного фрагмента информации. Это может быть хорошей идеей, если вы не можете предоставить IV для библиотеки, реализующей шифрование на основе пароля.
[РЕДАКТИРОВАТЬ] Другой обычно используемый трюк заключается в использовании дополнительного вывода PBKDF2 для получения IV.Таким образом, официальная рекомендация о том, что IV для CBC не должна быть предсказана противником, выполняется.Однако вы должны убедиться, что вы , а не запрашиваете больше выходных данных функции PBKDF2, чем та, которую может предоставить базовая хеш-функция.У PBKDF2 есть недостатки, которые позволили бы противнику получить преимущество в такой ситуации.Поэтому не запрашивайте более 256 бит, если SHA-256 используется в качестве хэш-функции для PBKDF2.Обратите внимание, что SHA-1 - это стандартное значение по умолчанию для PBKDF2, поэтому допускается использование только 128-битного ключа AES.
IV и соли - это совершенно разные термины, хотя их часто путают.В своем вопросе вы также путаете биты и байты, размер ключа и размер блока, а также радужные таблицы с таблицами MD5 (никто не говорил, что шифрование - это просто).Одно можно сказать наверняка: в криптографии это оправдывает себя, насколько это возможно;избыточная безопасность, как правило, не является проблемой, если только вы действительно (действительно) не можете позволить себе дополнительные ресурсы.
Когда вы поймете, как все это работает, я бы серьезно отнесся к поиску библиотеки, которая выполняет шифрование PBE.Возможно, вам просто понадобится ввести этот пароль, соль, простые данные и - если они настроены отдельно - IV.
[Редактировать] Возможно, вам следует искать библиотеку, которая использует Argon2 к настоящему времени.PBKDF2 по-прежнему считается безопасным, но в некоторых случаях он дает несправедливое преимущество злоумышленнику, позволяя злоумышленнику выполнять меньше вычислений, чем обычному пользователю функции.Это не очень хорошее свойство для хэша PBKDF / пароля.