Сообщение А с номером 1 шифруется рандомом (ключа 0). Получив сообщение А с номером 1 все юзеры формируют ключ А1 от ключа0+сообщения А. Сообщение Б с номером 2 шифруется этим ключом. И т.д.
Ты про то что цепочка генерации ключей одна глобальная для всех, я правильно понимаю? Типа очередной ключ из храповика используется только раз для одного сообщения?
В чём нюанс: если я не получил сообщение Б с номером 2, я могу зашифровать сообщение В ключом А1. Поскольку сообщение В будет иметь номер 2 - будет ясно что его надо расшифровывать ключом А1. Без особых дыр в синхронизации перед отправкой при расшифровке сообщения 3 придётся перебрать не так много сообщений 2.
То есть всё что надо иметь в качестве ограничения - какой-то набор скачанных сообщений. Какой-то, не обязательно последний.... просто чем новее - тем надёжнее.
Но это конечно махровые черновики. Мне бы сначала продумать до протокола все отправки сообщений. Это как бы тоже нетривиально...
В принципе нафига нам вообще соль? Храповик можно и влобовую прокручивать. Если все сообщения хранятся в архиве (а у меня это предполагается) - то все пользователи всё равно могут прочитать все сообщения с момента последней генерации.
Изначально есть некоторая функция KDF(init, n, salt), выдающая ключи init в данном случае - общий секрет юзеров n - порядковый номер сообщения, при том нумерацию ведёт отправитель, а приходящие сообщения не увеличивают n salt - собственно соль