Обмен ключами сеансов вручную
Заметка
В процедуре, описанной в этом разделе, предполагается, что пользователи (или клиенты CryptoAPI) уже имеют собственный набор пар открытых и закрытых ключей и также получили открытых ключей друг друга.
На следующем рисунке показано, как использовать эту процедуру для отправки зашифрованного сообщения.
Этот подход уязвим по крайней мере к одной распространенной форме атаки. Прослушивание может получить копии одного или нескольких зашифрованных сообщений и зашифрованных ключей. Затем, в некоторое время, прослушивание может отправить одно из этих сообщений получателю, и получатель не сможет знать, что сообщение не поступило непосредственно от исходного отправителя. Этот риск может быть сокращен путем метки времени для всех сообщений или с помощью серийных номеров.
Самый простой способ отправки зашифрованных сообщений другому пользователю — отправить сообщение, зашифрованное случайным ключом сеанса, а также ключ сеанса, зашифрованный открытого ключа получателя,.
Ниже приведены шаги по отправке зашифрованного ключа сеанса.
Отправка зашифрованного ключа сеанса
- Создайте случайный ключ сеанса с помощью функции CryptGenKey.
- Зашифруйте сообщение с помощью ключа сеанса. Эта процедура рассматривается в шифровании и расшифровке данных.
- Экспортируйте ключ сеанса в ключ BLOB с помощью функции CryptExportKey, указывая, что ключ шифруется с помощью открытого ключа конечного пользователя.
- Отправьте зашифрованное сообщение и зашифрованное blOB-объект ключа конечному пользователю.
- Конечный пользователь импортирует ключ BLOB-объекта в свою или ее CSP с помощью функции CryptImportKey. Это автоматически расшифровывает ключ сеанса, если открытый ключ целевого пользователя был указан на шаге 3.
- Затем конечный пользователь может расшифровать сообщение с помощью ключа сеанса, следуя процедуре, описанной в шифровании данных и расшифровке.