Если что-то в протоколе Signal выглядит удивительным, то причина этого, вероятно, связана с компрометацией ключа. Главное, о чем следует помнить, это тот факт, что «идентификационные ключи» являются долговременными секретами.
Предположим, что у Алисы есть долгосрочный ключ $а^*$ а у Боба долгосрочный ключ $б^*$, с соответствующими открытыми ключами $г^{а^*}$ и $г^{б^*}$.
Они могут выполнить обычное соглашение о ключе Диффи-Хелмана с этими долгосрочными ключами и согласиться с секретом. $г^{а^*б^*}$ и приступайте к обмену зашифрованными сообщениями.
Но мы заботимся о компрометация долговременных ключей.
Если долгосрочный ключ Алисы $а^*$ скомпрометирован в более позднее время, злоумышленник может вычислить $г^{а^*б^*}$ и нарушать конфиденциальность зашифрованных сообщений (в все связей Алисы!).
Если вы знакомы с Signal, то, вероятно, знаете, как Signal восстанавливается после компрометации ключа в обычных ситуациях.
Мы используем «непрерывный асимметричный храповик».
Алиса отправляет новый/свежий $г^{а_я}$ с каждым сообщением, и Боб отправляет новое $г^{b_j}$ с каждым сообщением.
В любое время они могут использовать самые последние $г^{а_я}$ и $г^{b_j}$ для получения текущего общего ключа $g^{a_i b_j}$.
Важным моментом здесь является то, что $a_i$ и $b_j$ ключи временный.
Алиса может выбросить $a_i$ после того, как Боб признает, что он перешел к использованию $г^{ а_{я+1}}$.
Если злоумышленник вовремя скомпрометирует Алису $t$, этот злоумышленник узнает только $a_t$.
Через некоторое время Алиса и Боб перестанут использовать $a_t$ и начать использовать $а_{т+1}$, и злоумышленник перестанет читать свои сообщения.
Таким образом, если непрерывный асимметричный храповик — это способ восстановления после компрометации ключей, а нас беспокоит долгосрочный (идентификационные) ключи скомпрометированы, то естественным решением является сделать асимметричный храповик, как только соединение будет установлено (используя идентификационные ключи).
Вот как мне нравится думать о X3DH.
Думайте о долгосрочных идентификационных ключах как о $a_0$ и $b_0$.
Стороны могут согласовать ключ $г^{а_0 б_0}$.
Они также немедленно отправляют следующие сообщения в своем асимметричном храповике: Алиса отправляет $г^{а_1}$ и Боб отправляет $г^{b_1}$.
Затем будут заключены ключевые договоренности, которые дают $г^{а_1 б_0}$ и $г^{а_0 б_1}$.
X3DH объединяет все 3 этих ключевых соглашения.
Важно, $a_1$ и $b_1$ находятся кратковременно секреты - уникальные для этого сеанса и сбрасываются после того, как храповик проходит мимо них.
Если долгосрочный ключ, как $a_0$ происходит утечка, даже первые сообщения в соединении защищены, потому что стороны упреждающе продвинули храповик на один шаг, включив свежие значения $а_1, б_1$.
В этом суть X3DH.
Спецификация Signal выглядит немного иначе, чем то, что я описал, потому что одна из целей — позволить сторонам устанавливать соединение асинхронно.
Таким образом, мы позволим Алисе (например) предварительно вычислить и опубликовать $г^{а_1}$ заранее, как «подписанный предварительный ключ».
Когда Боб хочет установить связь с Алисой в первый раз, он получает $г^{а_1}$ а затем отправляет свой $г^{b_1}$ ей.
На мой взгляд, X3DH $г^{а_1}$ и $г^{b_1}$ имеют симметричные роли, но в Signal их роли не совсем одинаковы — одна из них вычисляется заранее («подписанный предварительный ключ Алисы»), а другая вычисляется в момент подключения («эфемерный ключ» Боба).
В спецификации сигнала вы увидите, что другая терминология нарушает то, что в противном случае является симметрией в протоколе.