Ответ 1
Да, вам нужно все это.
Соль (и "счетчик итераций" ) используется для получения ключа от пароля. Обратитесь к PKCS # 5 за дополнительной информацией. Соль и количество итераций, используемых для деривации ключей, не обязательно должны быть секретными. Однако соль должна быть непредсказуемой, и ее лучше всего выбирать произвольно.
Для режима CBC требуется вектор инициализации. Это блок случайных данных, создаваемых для каждого сообщения генератором криптографических случайных чисел. Он служит фиктивным начальным блоком зашифрованного текста. Как и соль для получения ключей, ее не нужно хранить в секрете и обычно передавать вместе с текстом шифрования.
Пароль и ключи, полученные из него, должны храниться в секрете. Даже если у злоумышленника есть параметры для деривации ключей и шифрования и зашифрованного текста, он не может ничего делать без ключа.
Update:
Пароли не выбираются случайным образом; некоторые пароли гораздо более вероятны, чем другие. Поэтому, вместо того, чтобы генерировать все возможные пароли заданной длины (исчерпывающий поиск грубой силы), злоумышленники сохраняют список паролей, упорядоченных с уменьшением вероятности.
Получение ключа шифрования из пароля относительно медленное (из-за итерации алгоритма деривации ключа). Получение ключей для нескольких миллионов паролей может занять несколько месяцев. Это может побудить злоумышленника вывести ключи из своего списка наиболее вероятных паролей один раз и сохранить результаты. С таким списком он может быстро попытаться расшифровать каждый ключ в своем списке, вместо того, чтобы тратить месяцы на время вычисления, чтобы получить ключи снова.
Однако каждый бит соли удваивает пространство, необходимое для хранения производного ключа, и время, необходимое для получения ключей для каждого из его вероятных паролей. Несколько байтов соли, и это быстро становится невозможным для создания и хранения такого списка.
Соль необходима для предотвращения атак с предварительными вычислениями.
В режиме IV (или nonce с режимами счетчика) один и тот же простой текст генерирует разные шифрованные тексты. Предотвращает использование злоумышленником шаблонов в открытом тексте для сбора информации из набора зашифрованных сообщений.
Вектор инициализации необходим, чтобы скрыть шаблоны в сообщениях.
Один служит для повышения безопасности ключа, а другой повышает безопасность каждого сообщения, зашифрованного этим ключом. Оба они необходимы вместе.