Что скрывается внутри "зашифрованного thinking" Claude: signature по байтам без мифов
В последнее время всё чаще обсуждают кражу chain of thought у закрытых моделей: берут зашифрованный фрагмент рассуждений сильной модели, передают его "младшей" модели того же провайдера и просят пересказать максимально дословно. На бумаге это выглядит как эффектный взлом цепочек рассуждений Claude - вплоть до риска, что в размышления случайно попадут пароли, токены или ключи. Но у этой истории есть важная деталь: "подпись" (signature), которую Claude прикрепляет к thinking-блокам, вовсе не является цельным непрозрачным контейнером.
Я ещё прошлой зимой собирал такие подписи пачками - около полутора тысяч блоков из локальных сессий агента. Тогда и выяснилось главное: внешний конверт читается без каких-либо ключей, а по-настоящему закрыт там лишь один вложенный фрагмент - именно текст мысли. Недавний разбор в духе анализа зашифрованного блока рассуждений Claude подтолкнул меня прогнать парсер по свежим данным: за полгода протокол успел "подрасти" на несколько версий схемы, и некоторые выводы стоит формулировать точнее.
Начинается всё с того, что в JSON-истории сессии поле `thinking` может выглядеть пустым - буквально `""`. Это не означает, что модель не рассуждала: рядом лежит signature на сотни символов. Важный нюанс: сама подпись заканчивается на `==` и использует алфавит base64 - намёк слишком очевидный, чтобы его игнорировать. Декодирование даёт несколько сотен байт бинарных данных, и дальше внезапно становится скучно: никакой "магии", сообщение стартует с нулевого байта, а первые значения выглядят как типичный след protobuf.
Если разбирать по wire type, то байт `0x08` мгновенно узнаётся как protobuf-тег: поле 1, тип varint. Следом идёт значение (например, `0x02`). Внешняя обёртка оказывается простой: пара скалярных флажков по краям (значения стабильны, назначение не всегда очевидно) и одно вложенное сообщение в поле 2 - именно там находится всё интересное. И вот это уже похоже на нормальный "конверт" вокруг рассуждения, где часть данных открыта, а часть - действительно шифротекст.
Дальше картина повторяется: снова protobuf-структура, снова поля разной длины. Но в середине обнаруживаются три поля с константными размерами, которые стабильно встречались во всех виденных блоках (и тогда, и сейчас). Они не похожи ни на паддинг, ни на блочное выравнивание. Скорее это узнаваемая криптографическая раскладка: `nonce(12)` + ещё один 12-байтный фрагмент (nonce/AAD-зависимая часть) + `tag/signature(48)`. А вот поле с переменной длиной - это и есть единственное место, где лежит зашифрованный текст: собственно "мысль", тот самый шифротекст.
Самый неожиданный поворот - заголовок вложенного сообщения. Его тоже можно распарсить тем же protobuf-подходом без ключей. И там в открытую оказываются вещи, которые многие не ожидают увидеть внутри "подписи": имя модели (вроде `claude-opus-5`, буква в букву), тип контента (`thinking`, а при наличии - и маркеры вроде `redacted_thinking`), а также UUID, который, как выясняется, может совпадать с идентификатором организации аккаунта в локальной конфигурации. То есть один и тот же организационный идентификатор способен тянуться через разные сессии и меняться лишь при смене аккаунта. На практике это означает простую вещь: даже если сам текст рассуждений зашифрован, метаданные могут оставаться достаточно "говорящими", чтобы связывать блоки с конкретной организацией и моделью.
Именно поэтому вопрос "как расшифровать signature Claude по байтам" на деле распадается на две разные задачи. Первая - тривиальная: декодировать base64, распарсить protobuf и получить незашифрованные поля. Вторая - принципиально другая: вскрыть поле с шифротекстом, где без ключей уже не обойтись. И когда обсуждают атаки, важно не смешивать эти уровни: Claude signature разбор формат и структура показывает, что "закрыто" там далеко не всё, но это ещё не означает автоматического доступа к самой мысли.
Теперь - несколько выводов, которые обычно остаются за кадром, но важны на практике.
Во‑первых, риски утечек живут не только в plaintext рассуждениях. Даже "невинные" идентификаторы, стабильно повторяющиеся в заголовках, - это потенциальные маркеры корреляции: ими проще связывать логи, сессии и фрагменты данных, особенно если подписи где-то сохраняются или пересылаются между системами.
Во‑вторых, защита от сценариев, где "младшая модель пересказывает старшую", должна рассматриваться отдельно от шифрования. Если внутри провайдера существует путь, при котором один сервис способен интерпретировать и пересказывать чужие скрытые рассуждения, это уже вопрос разграничения доступа и политики обработки, а не только криптографии.
В‑третьих, разработчикам инструментов и агентов стоит относиться к signature как к чувствительным данным. Даже если вы уверены, что там "просто мусор", практика показывает обратное: часть полей читается без ключей, а значит, подпись может содержать то, что вы не планировали раскрывать при обмене логами или при публикации примеров.
Наконец, полезно смотреть на эту историю не как на охоту за "секретным thinking", а как на аудит протокола: где именно проходит граница между открытыми метаданными и закрытым содержимым, и не остаётся ли в открытом виде лишнего. Такой взгляд лучше всего помогает трезво оценить заявления про кражу цепочек рассуждений у закрытых моделей: иногда сенсация начинается не с расшифровки, а с того, что "конверт" изначально был куда прозрачнее, чем принято думать.
