Открыть сервис

Double Ratchet

Double Ratchet — это криптографический протокол, обеспечивающий сквозное шифрование (end-to-end encryption) в асинхронных коммуникациях, таких как обмен мгновенными сообщениями. Протокол разработан для обеспечения двух ключевых свойств: прямой секретности (forward secrecy) и защиты от компрометации в будущем (future secrecy, также известной как self-healing). Double Ratchet лежит в основе протокола Signal, используемого в одноимённом мессенджере, а также в WhatsApp (продукт Meta, признанной экстремистской и запрещённой в РФ), Facebook Messenger (в режиме «секретных бесед») и Google Messages (в режиме RCS с шифрованием). Протокол был впервые описан в 2013 году криптографом Тревором Перрином (Trevor Perrin) и соавторами (Moxie Marlinspike, Tilman Frosch, Christian Mainka, Christoph Bader, Florian Bergsma, Jörg Schwenk и Thomas Holz) в документе «The X3DH Key Agreement Protocol» и последующей спецификации «The Double Ratchet Algorithm».

История и предпосылки создания

До появления Double Ratchet большинство протоколов шифрования для мгновенных сообщений либо не обеспечивали прямую секретность, либо требовали постоянного онлайн-соединения для обновления ключей. Например, протокол OTR (Off-the-Record Messaging) обеспечивал прямую секретность, но был ориентирован на синхронный диалог и не подходил для асинхронной переписки, где сообщения могут быть отправлены, когда получатель не в сети.

В 2013 году Эдвард Сноуден обнародовал данные о массовой слежке АНБ, что подстегнуло развитие криптографических протоколов, устойчивых к компрометации долговременных ключей. Разработчики Signal (тогда TextSecure) — Moxie Marlinspike и Тревор Перрин — создали протокол Double Ratchet, который сочетал в себе идеи протокола Диффи-Хеллмана (DH) и хеш-цепочек (ratchet). Первая реализация появилась в 2013 году в приложении TextSecure для Android.

Принцип работы

Протокол Double Ratchet использует два механизма («храповика»), работающих параллельно:

1. Храповик Диффи-Хеллмана (DH Ratchet)

Этот компонент обеспечивает прямую секретность и защиту от компрометации в будущем. Каждый участник диалога генерирует свою пару ключей (закрытый и открытый) для каждого раунда общения. После каждого отправленного или полученного сообщения участники выполняют обмен открытыми ключами через протокол Диффи-Хеллмана, что приводит к вычислению нового общего секрета. Если злоумышленник когда-либо скомпрометирует текущие ключи, он не сможет расшифровать предыдущие сообщения (прямая секретность). Кроме того, после компрометации, когда участники продолжают обмен, они генерируют новые ключи, и злоумышленник теряет доступ к будущим сообщениям (защита от компрометации в будущем).

2. Храповик цепочек (Symmetric Ratchet)

Этот компонент использует хеш-функции (например, SHA-256 или SHA-512) для генерации последовательности ключей шифрования из одного начального секрета. Каждый раз, когда участник отправляет или получает сообщение, он применяет хеш-функцию к текущему ключу, получая новый ключ для следующего сообщения. Это позволяет генерировать уникальные ключи для каждого сообщения, даже если DH-храповик не обновляется (например, если сообщения отправляются быстро одно за другим). Храповик цепочек также обеспечивает прямую секретность: даже если текущий ключ скомпрометирован, предыдущие ключи восстановить невозможно (из-за необратимости хеш-функции).

Комбинация двух храповиков

Протокол работает следующим образом:

  1. Инициализация: Участники выполняют протокол X3DH (Extended Triple Diffie-Hellman) для установления начального общего секрета (master secret). Этот секрет используется для инициализации цепочек ключей.
  2. Отправка сообщения: Отправитель использует текущий ключ из храповика цепочек для шифрования сообщения. Если отправитель решает обновить DH-храповик (обычно после каждого N-го сообщения или через определённое время), он генерирует новую пару ключей, включает свой открытый ключ в сообщение и выполняет DH-обмен с открытым ключом получателя. Полученный новый общий секрет используется для переинициализации храповика цепочек.
  3. Получение сообщения: Получатель извлекает из сообщения открытый ключ отправителя (если он есть), выполняет DH-обмен со своим закрытым ключом, вычисляет новый общий секрет и использует его для обновления своего храповика цепочек. Затем он расшифровывает сообщение с помощью соответствующего ключа.
  4. Асинхронность: Если получатель не в сети, отправитель может отправить несколько сообщений, используя один и тот же DH-ключ. Когда получатель подключается, он обрабатывает все накопленные сообщения, последовательно обновляя свой храповик цепочек.

Криптографические свойства

Double Ratchet обеспечивает следующие свойства безопасности:

Реализации и использование

Double Ratchet является ключевым компонентом протокола Signal Protocol, который, в свою очередь, используется в:

Реализации Double Ratchet существуют для различных языков программирования, включая C, Java, JavaScript, Python, Go и Rust. Библиотеки, такие как libsignal-protocol-c, предоставляют готовые реализации протокола.

Критика и ограничения

Несмотря на широкое признание, Double Ratchet имеет некоторые ограничения:

Сравнение с другими протоколами

ПротоколПрямая секретностьЗащита от компрометации в будущемАсинхронностьАутентификация
OTRДаНетНетДа
Double RatchetДаДаДаДа (через X3DH)
PGPНетНетДаДа
TLS 1.3ДаДа (при использовании DHE)НетДа

Примечания

Double Ratchet не следует путать с протоколом «Ratchet» в криптовалютах (например, Monero), который также использует односторонние функции, но для других целей.

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →