Да, вам нужно все это.
Соль (и счетчик итераций) используется для получения ключа от пароля. Обратитесь к PKCS # 5 за дополнительной информацией. Соль и количество итераций, используемых для деривации ключей, не обязательно должны быть секретными. Однако соль должна быть непредсказуемой, и ее лучше всего выбирать произвольно.
Для режима CBC требуется вектор инициализации. Это блок случайных данных, создаваемых для каждого сообщения генератором криптографических случайных чисел. Он служит фиктивным начальным блоком зашифрованного текста. Подобно солью, генерирующей ключ, ее не нужно хранить в секрете и обычно передавать вместе с текстом шифрования.
Пароль и ключи, полученные из него, должны храниться в секрете. Даже если у злоумышленника есть параметры для деривации ключей и шифрования, а также зашифрованный текст, он не может ничего делать без ключа.
Обновление:
Пароли не выбраны случайным образом; некоторые пароли гораздо более вероятны, чем другие. Поэтому, вместо того, чтобы генерировать все возможные пароли заданной длины (исчерпывающий поиск грубой силы), злоумышленники сохраняют список паролей, упорядоченных с уменьшением вероятности.
Получение ключа шифрования с помощью пароля относительно медленно (из-за итерации алгоритма деривации ключа). Получение ключей для нескольких миллионов паролей может занять несколько месяцев. Это может побудить злоумышленника вывести ключи из своего списка наиболее вероятных паролей один раз и сохранить результаты. С таким списком он может быстро попытаться расшифровать каждый ключ в своем списке, вместо того, чтобы тратить месяцы на время вычисления, чтобы снова получить ключи.
Однако каждый бит соли удваивает пространство, необходимое для хранения производного ключа, и время, необходимое для получения ключей для каждого из его вероятных паролей. Несколько байтов соли, и быстро становится невозможно создать и сохранить такой список.
Соль необходима для предотвращения атак с предварительным вычислением.
IV (или nonce с режимами счетчика) делает один и тот же простой текст выдающим разные шифровальные тексты. Предотвращает использование злоумышленником шаблонов в обычном тексте для сбора информации из набора зашифрованных сообщений.
Вектор инициализации необходим для скрытия шаблонов в сообщениях.
Один служит для повышения безопасности ключа, а другой повышает безопасность каждого сообщения, зашифрованного этим ключом. Оба необходимы вместе.
Также стоит сказать, что если у вас есть все, кроме IV, вы можете успешно расшифровать все, кроме первого блока открытого текста. – caf
Если соль должна быть непредсказуемой, то почему она не должна быть секретной? У вас там неправильное заявление. –
@AkashKava Нет, мое утверждение верное. Злоумышленник не может угадать * непредсказуемую * соль * до того, как она выбрана. Если соль является секретной, * злоумышленник не сможет угадать ее даже после ее выбора. Стандарты для протоколов шифрования на основе паролей, таких как [CMS] (http://tools.ietf.org/html/rfc3211#section-2.1), указывают, что [незашифрованная соль может быть отправлена] (http://tools.ietf.org /html/rfc2898#appendix-A.2) вместе с зашифрованным сообщением. Предсказуемая соль позволяет злоумышленникам предварительно вычислить ключи шифрования для общих паролей и многократно использовать эту таблицу для быстрого дешифрования сообщений. – erickson