8.4. Детали реализации
143
Поменяем местами ключи шифрования и дешифрования, если участ-
ник — пользователь Б.
if
R
= “Пользователь Б”
then
swap(KeySendEnc, KeyRecEnc)
swap(KeySendAuth, KeyRecAuth)
fi
Установим значения счетчиков отправленных и полученных сообще-
ний равными 0. Счетчик отправленных сообщений — это номер
последнего отправленного сообщения. Счетчик полученных сообще-
ний — это номер последнего полученного сообщения.
(MsgCntSend, MsgCntRec)
←
(0
,
0)
Зафиксируем состояние.
S ←
(
KeySendEnc,
KeyRecEnc,
KeySendAuth,
KeyRecAuth,
MsgCntSend,
MsgCntRec
)
return
S
У нас есть еще одна функция, которая уничтожает значение состояния
S
.
Мы не будем рассматривать ее реализацию более подробно. Все, что требу-
ется от данной функции, — это очистить и высвободить память, в которой
хранится переменная
S
. Обратите внимание на слово “очистить” — это очень
важный момент. Во многих системах
функция высвобождения памяти не обя-
зательно очищает ее, поэтому по окончании использования состояния
S
его
необходимо удалить явно.
8.4.2
Отправка сообщения
Рассмотрим, какие действия необходимо выполнить, чтобы отправить со-
общение. Алгоритм отправки сообщения принимает на вход состояние сеанса,
сообщение, которое должно быть отправлено, и дополнительные данные, ко-
торые должны быть аутентифицированы, а выдает сообщение, зашифрован-
ное вместе со своим аутентификатором и готовое к отправке. Для аутентифи-
кации сообщения у получателя должны быть те же дополнительные данные,
что и у отправителя.
функция
SendMessage
вход:
S
Состояние безопасного сеанса.
m
Сообщение, которое должно быть отправлено.