Моя программа подключается к серверу, открытый ключ сервера уже известен. Затем программа шифрует ключ AES вместе с вектором инициализации и отправляет его на сервер. Сервер расшифровывает сообщение, и с этого момента для шифрования разговора используется AES.
Мой вопрос о том, как создать IV. Если я пойду наивным путем и заполню псевдослучайный генератор текущим временем, злоумышленник, вероятно, сможет сделать несколько очень хороших предположений о IV, что, черт возьми, не то, что мне нужно.
Поскольку аппаратные генераторы случайных чисел не только медленные, но и не везде доступны, я хотел бы пойти на другой подход. При первом запуске клиентской программы я позволяю пользователю сделать несколько случайных движений мышью, как это делает TrueCrypt. Теперь я сохраняю эти «случайные биты», созданные движением мыши, и когда мне понадобится генератор, я буду использовать их в качестве семени. Конечно, случайные биты должны обновляться каждый раз, когда я использую их в качестве начальных значений. И это мой вопрос: я подумал о том, чтобы просто сохранить первые несколько случайных битов, сгенерированных как новые «случайные биты». (Поэтому они привыкли инициализировать механизм случайных чисел при следующем запуске программного обеспечения.) Теперь я не уверен, будет ли это достаточно случайным или генераторы псевдослучайных чисел будут показывать здесь угадываемые закономерности. (Я бы, вероятно, использовал std::mt19937 http://en.cppreference.com/w/cpp/numeric/random)
Редактировать: режим цепочки меняется, поэтому я хочу, чтобы он работал в режиме с «самыми высокими» требованиями. Который был бы CBC, если я правильно помню.
Обратите внимание: программное обеспечение, которое я пишу, является чисто экспериментальным.