Хочется дать пользователям возможность писать посты (с возможностью комментирования), текст и комментарии к которым доступны только определённым читателям и недоступны никому больше, в том числе серверу. На сервере должы храниться только зашифрованные версии текстов.
Пусть Алиса хочет создать криптопост, видимый ей, Бобу и Кларе. Для этого все трое должны иметь пары GPG(?)-ключей, причём все публичные ключи (Ka, Kb, Kc) должны быть доступны (например, в самоописании юзера), бразуер/клиент возможного читателя поста также должен знать приватный ключ читателя.
Алиса (точнее, её клиент) создаёт случайный ключ Ks для симметричного шифрования. Текст поста шифруется этим ключом. Ключ шифруется публичными ключами Алисы, Боба, и Элис, и всё вместе записывается как текст поста:
- Текст, зашифрованный с помощью Ks
- Хэш-сумма Ks
- Ks, зашифрованный с помощью Ka
- Ks, зашифрованный с помощью Kb
- Ks, зашифрованный с помощью Kc
Читатель поста, придя со своим приватным ключом, должен расшифровать все зашифрованные варианты Ks. Если хэш результата совпадёт с указанной в поста суммой, значит правильный ключ найден и им можно расшифровать текст поста.
Читатель поста может оставить крипто-комментарий, используя Ks для шифрования текста комментария.
Автор поста в любой момент может добавить нового читателя, для этого ему достаточно добавить ещё один блок с Ks, зашифрованным публичным ключом нового читателя.
С удалением читателя (назовём её Элис) дело обстоит сложнее. Понятно, что, однажды расшифровав Ks, Элис сможет прочесть обсуждение даже если блок с её ключом будет удалён из поста. Поэтому следует менять и общий ключ. Возможно, общий ключ стоит менять и в каких-то других случаях. Однако если читатели уже оставили комментарии с прежним ключом, то автор поста не сможет их перезаписать.
Перезаписать комментарий может только его автор или какой-то процесс на севере, по поручению автора поста. Но в последнем случае надо быть уверенным, что содержание комментария не изменяется. Кажется, этого нельзя достичь, не разрешив серверу прочесть незашифрованный комментарий, а это то, чего мы хотим избежать.
Можно предложить частичное решение этой проблемы. Когда автор поста создаёт новый общий ключ, предыдущий ключ добавляется в список устаревших ключей. Этот список, зашифрованный текущим ключом, также сохраняется в теле поста. В крипто-комментарий, помимо зашифрованного текста, записывается хэш-сумма ключа, которым он зашифрован. При расшифровке комментариев читатели должны использовать тот из (возможно, устаревших) ключей, который соответствует хэш-сумме.
В этом случае, при смене ключа, текст поста перестаёт быть доступен для Элис, но она всё равно может прочесть комментарии, оставленные до смены. Новые комментарии она прочесть не сможет, так как для них уже будет использоваться новый ключ. В принципе, комментаторы смогут сами обновить свои старые комментарии, если захотят.