Интересный вопрос.
Во-первых, ваши начальные векторы не обязательно должны быть криптографически сильными случайными величинами, но они должны быть уникальными для каждого сообщения.На самом деле IV - это просто своего рода солидное значение, гарантирующее, что подобные сообщения, зашифрованные с использованием одного и того же ключа, не будут выглядеть похожими, когда они зашифрованы.Вы можете использовать любой быстрый псевдослучайный генератор, чтобы сгенерировать IV, а затем отправить его (предпочтительно зашифрованный) вместе с зашифрованными данными.
Ключи, конечно, должны быть настолько сильными, насколько вы можете их практически изготовить..
Ваше предложение хэшировать текстовую строку, содержащую одноразовые данные, парольную фразу и данные о валидности, мне кажется очень разумным - оно в целом соответствует тому, что делается в другой системе, использующей парольную фразу для генерацииключ.Вам следует хэшировать много раз, а не один раз, чтобы сделать генерацию ключей вычислительно дорогой (что станет большей проблемой для любого, кто пытается перебрать ключ, чем для вас).
Выможет также захотеть взглянуть на схему генерации ключей, изложенную в PKCS # 5 (например, на http://www.faqs.org/rfcs/rfc2898.html), которая реализована в cryptopp как PasswordBasedKeyDerivationFunction. Этот механизм уже широко используется и известен как достаточно безопасный (примечаниечто PKCS # 5 рекомендует хэшировать данные парольной фразы не менее 1000 раз.) Вы можете просто добавить свой срок действия и индексные данные к парольной фразе и использовать PasswordBasedKeyDerivationFunction в ее нынешнем виде.
Вы не говорите, какой алгоритм шифрования вы используетеПредлагаю использовать для шифрования данных, но я бы предложил, чтобы вы выбрали что-то широко используемое и, как известно, безопасное ... и, в частности, я бы предложил использовать AES. Я бы также предложил использовать один из SHAфункции дайджеста (возможно, в качестве входных данных для PasswordBasedKeyDerivationFunction).SHA-2 является текущим, но SHA-1 достаточно для целей генерации ключей.
Вы также не говорите, какую длину ключа вы хотите сгенерировать, но вы должны знать, что величина энтропии вВаши ключи зависят от длины используемой вами ключевой фразы, и, кроме тех случаев, когда она имеет длину очень , что будет намного меньше, чем в идеале требуется длина ключа.
Самым слабым звеном в этой схеме является сама фраза-пароль, и это всегда будет ограничивать уровень безопасности, которого вы можете достичь.Пока вы солите свои данные (как вы это делаете) и делаете генерацию ключей дорогостоящей для замедления атак методом перебора, у вас все будет хорошо.