TgWitness / Документация

Документация / 08

Как устроены доказательства

Сообщение может измениться. Запись того, что вы наблюдали, должна оставаться поддающейся проверке.

Ознакомьтесь с двумя небольшими экспериментами, приведёнными ниже. В них используются вымышленные сообщения, они работают непосредственно в вашем браузере и никогда не подключаются к Telegram.

Одно сообщение, три замечания

Когда Telegram доставляет новое сообщение, уведомление об изменении или об удалении, сборщик добавляет три отдельных записи. Изменение не заменяет первую запись. Уведомление об удалении не стирает её.

01 / ПУТЬ СООБЩЕНИЯИллюстративная последовательность
Telegram delivers an update to the collector, which appends a journal record. TelegramCollectorЖурнал обновление →добавить →
ПРОСМОТР ТЕКУЩЕГО ЧАТА Сообщение № 42
Сообщение удалено

Сообщение исчезло из окна чата.

ЖУРНАЛ НАБЛЮДЕНИЙ 3 записи
  1. 01
    message.new

    Встреча в 10:00

    ✓
  2. 02
    message.edited

    Встреча в 11:00

    ✓
  3. 03
    message.deleted

    Уведомление об удалении № 42

    ✓

Все три зафиксированных события сохраняются в журнале.

Упрощённый путь для одного уже выбранного источника. Оперативные записи также используют тот же журнал. Захват данных зависит от того, что доступно для просмотра в учётной записи и что предоставляет Telegram.

Уведомление об удалении не содержит ни достоверного времени удаления, ни информации о том, кто удалил сообщение. Сохранение этих сведений в тайне позволяет провести разграничение между фактом наблюдения и предположением.

Измените запись. Проследите хеш.

Каждая запись содержит хеш предыдущей записи. Её собственный хеш охватывает поля события, включая эту ссылку. Внешний контрольный точка фиксирует конкретную длину журнала и хеш его начала.

02 / HASH-CHAIN SANDBOXНастоящий SHA-256 · примеры записей
ЗАПИСЬ 01Сообщение полученоh₁ = SHA-256(e₁)Ссылки на 64 нуля
ЗАПИСЬ 02Встреча в 11:00h₂ = SHA-256(e₂)Включает h₁
ЗАПИСЬ 03Зафиксировано удалениеh₃ = SHA-256(e₃)Включает h₂
ХРАНИТСЯ В ДРУГИХ ИСТОЧНИКАХ3 записи · заголовок h₃Сравните эту фиксированную границу с предоставленным журналом.

Изменение события приводит к изменению его хеша. Восстановление цепочки приводит к изменению её начала. Удаление конца делает цепочку короче, чем сохраненная контрольная точка.

Данная тестовая среда вычисляет хэши, а не подписи. Реальный верификатор также проверяет подпись Ed25519, последовательность и ссылку каждого события. Простое восстановление хэшей не позволяет создать действительные подписи с использованием доверенного ключа.

Фактические правила в нескольких строках

ХЭШ + ПОДПИСЬ
h0 = 064
hi = hex(SHA-256(C(ei)))
σi = Ed25519.Sign(sk, unhex(hi))

C сериализует девять полей события в формате JSON с кодировкой UTF-8: отсортированные ключи, без лишних пробелов, без ASCII-эскейпинга и без значений NaN/бесконечности. Идентификатор события previous_hash равен hi−1. Отображаемое значение h0 означает 64 нулевых символа; подписи охватывают 32 байта исходного дайджеста.

Девять полей: seq, observed_at, source_at, kind, chat_id, message_id, actor_id, payload и previous_hash. Это задокументированная кодировка JSON в TgWitness; сам хеш и сама подпись не являются полями для ввода хеша.

СОХРАНЕННАЯ КОНТРОЛЬНАЯ ТОЧКА
Nexport ≥ Ncheckpoint
hexport[Ncheckpoint] = Hcheckpoint

Проверьте подпись контрольной точки с помощью закреплённого ключа сборщика, а затем сравните её границы с проверенным журналом. Более поздний экспорт может содержать больше записей; при этом он должен по-прежнему совпадать с данными на более ранней контрольной точке.

Три вопроса, три различных проверки

Соответствующая цепочка хэшей служит ответом на вопрос о целостности данных. Она не подтверждает полную доставку сообщения в Telegram, достоверность самого сообщения или независимо подтверждённое время наблюдения.

Следите за ходом расследования по всему аккаунту — от сбора данных до формирования материалов дела.