Что выяснили Anthropic и Claude: короткий ответ
Сотрудники Anthropic с помощью внутренней исследовательской модели Claude установили происхождение seed'ов стандартных эллиптических кривых NIST: P-192, P-224, P-256, P-384 и P-521. АНБ передало эти параметры в NIST без пояснений, и около 25 лет никто не мог сказать, как именно получены константы. Подробный разбор истории опубликован на Хабре.
Ответ оказался бытовым: seed'ы - это выход генератора lrand48 из библиотеки C, инициализированного Unix-временем 1997-1998 годов. Ходившая по сообществу версия про хеш шуточной фразы не подтвердилась. Для восстановления состояния усечённого генератора исследователи применили алгоритм LLL.
Рамку авторы задают сразу: это не взлом кривых и не доказательство закладки. Результат читается наоборот, как аргумент в пользу того, что параметры выбирали без намеренных слабостей. Код воспроизведения seed'ов и части базовых точек опубликован под CC0 1.0, награда в $36 864 передана Internet Security Research Group.
Почему seed'ы NIST 25 лет считались подозрительными
В детерминированной процедуре генерации параметров кривой seed - исходное значение, из которого выводятся коэффициенты: сначала b, затем базовая точка. Если процедура известна, любой может повторить вычисление и убедиться, что константы не подбирались вручную под скрытую слабость. С кривыми NIST так не вышло: АНБ передало готовые параметры, а происхождение seed'ов не объяснило.
Отсюда десятилетия спекуляций. Версия про хеш шуточной фразы держалась на правдоподобном допущении: выход криптографического хеша выглядит как равномерный шум, и проверить её можно было, только угадав саму фразу и алгоритм. Пока фраза неизвестна, гипотеза оставалась красивой, но непроверяемой.
Отдельная сложность в том, что математическая проверка стойкости кривой и проверка провенанса её констант - разные задачи. Первую делают открыто, вторая упирается в документацию, которой не было. Отсутствие объяснений само по себе не доказывает злой умысел, но и не снимает вопросов: происхождение констант остаётся непрозрачным, пока кто-то не восстановит его по шагам.
Как Claude нашёл закономерность в старших битах seed'ов
Первый шаг сделала модель: она проанализировала значения seed'ов и заметила аномалию в старших битах. У четырёх из десяти seed'ов все 20 слов начинались с нулевого старшего бита. Для равномерно распределённых данных такая картина маловероятна, а для выхода lrand48 ожидаема: генератор отдаёт только старшие 31 бит из 48-битного состояния, и в наблюдениях проступает его сигнатура.
На поиск закономерности ушло около получаса. Роль людей при этом не исчезает: исследователи поставили задачу, отобрали данные и проверяли гипотезу, а модель выступила инструментом поиска аномалий в массиве чисел. Речь про внутреннюю исследовательскую версию Claude от Anthropic, не про публичный чат-интерфейс. Найденный шаблон дал проверяемое направление, восстановление состояния и подтверждение чисел стали следующим этапом работы.
LLM уже применяли в криптоанализе: в материале про Enigma и LLM разобрано, как модели восстановили архивные сообщения, которые не поддавались десятилетиями. Разница в способе проверки: там правильность вскрытого текста подтверждает сам текст, здесь - воспроизводимый код.
Механика: lrand48, усечение состояния и алгоритм LLL
lrand48 - генератор из библиотеки C. Внутри у него 48-битное состояние, наружу уходят только старшие биты.
- 48 бит - внутреннее состояние генератора;
- 31 бит - то, что получает вызывающий код;
- 17 бит - отбрасываются при каждом вызове.
Из-за усечения прямой перебор не работает: по одному выходу состояние не восстановить, младшая часть каждый раз теряется. Исследователи собрали наблюдения в решётку и применили LLL, алгоритм решёточного сокращения. Он ищет в решётке короткие векторы и позволяет решать задачи, где часть информации скрыта, но связана линейными соотношениями. Технические детали разбора приведены в исходной публикации.
Логика связки простая. Нулевой старший бит во всех 20 словах у четырёх seed'ов означает, что распределение выхода не похоже на равномерный хеш, зато похоже на усечённый ГСЧ. Гипотеза стала проверяемой: если это lrand48, состояние восстанавливается, а инициализация должна соответствовать Unix-времени 1997-1998 годов. Восстановленное состояние этому условию удовлетворило. Конкретные параметры решётки и код вынесены в опубликованные материалы, в пересказе они не нужны.
Базовые точки шести кривых и пакет FreeLIP
Seed объясняет коэффициент b, но у кривой есть ещё базовая точка. Для шести кривых, созданных в мае 1997 года, происхождение базовых точек тоже удалось объяснить: их выдал генератор из пакета FreeLIP Арьена Ленстры, запущенный с конкретными начальными значениями. Сами значения приведены в опубликованных материалах.
Май 1997 года согласуется с Unix-временем 1997-1998 для seed'ов: обе линии указывают на рутинную генерацию в один и тот же период, на обычном для того времени софте. Эта линия доказательства полезна тем, что не зависит от анализа старших битов: даже если отбросить статистическую находку, базовые точки всё равно укладываются в ту же картину.
Это бэкдор или нет: что находка доказывает и что нет
Авторы формулируют позицию прямо: это не взлом и не свидетельство бэкдоров. Логика такая: если seed'ы - выход массового lrand48, инициализированного текущим временем, версия о специально подобранных константах теряет опору. Подбирать значения под скрытую уязвимость через генератор с известной сигнатурой и привязкой к дате неудобно, да и бессмысленно, если цель - незаметность.
Что находка не доказывает: криптографическую стойкость самих кривых. Происхождение констант и отсутствие слабостей в группе - разные вопросы, и второй здесь не рассматривался. Доверие к параметрам складывается из анализа алгоритма и из провенанса; для части параметров теперь закрыт второй пункт.
Формулировки в духе «АНБ поймали за руку» к этому результату не подходят: они разворачивают вывод в противоположную сторону от того, что написали авторы.
Что осталось необъяснённым
- Seed кривой B-163: объяснения нет.
- Базовые точки P-224, P-256, P-384, P-521 и бинарных кривых: происхождение пока неизвестно.
- Критерии, по которым при генерации пропускали часть потенциально годных кандидатов: логика отбора не восстановлена.
Практический смысл этого списка в том, что провенанс закрыт не для всех параметров. Кривые, у которых объяснены и seed, и базовая точка, выглядят надёжнее с точки зрения истории создания. Кривые из списка остаются в том же положении, что и 25 лет назад: работают, но происхождение констант не подтверждено.
Код, лицензия и награда: как проверить результат
Код для воспроизведения seed'ов и части базовых точек опубликован под CC0 1.0. Это public domain dedication: файлы можно свободно копировать, проверять и переиспользовать, в том числе в коммерческих проектах, без оговорок об авторстве. Награда в $36 864 передана Internet Security Research Group (ISRG), организации, которая стоит за Let's Encrypt и другой открытой инфраструктурой безопасности.
Ссылки на репозиторий и исходные материалы Anthropic приведены в публикации; пересказ с деталями доступен в разборе на Хабре. Воспроизводимость здесь - главный аргумент: результат можно перепроверить независимо, не полагаясь на репутацию авторов или модели.
Практический вывод: чему учит кейс
- Константы в стандартах стоит проверять на провенанс. Магическое число, у которого нет истории, - повод для вопроса, даже если математика кривой в порядке.
- Усечённые ГСЧ оставляют следы. Нулевой старший бит во всех 20 словах у четырёх из десяти seed'ов - слабая, но заметная сигнатура; такие аномалии дешевле искать до построения гипотез, а не после.
- LLM полезна как искатель аномалий и генератор гипотез, а не как источник истины. Вывод подтверждают вычисления на LLL и опубликованный код, без них находка осталась бы догадкой.
- CC0 для кода исследований безопасности ускоряет проверку. Ограничение публикации - часть той же логики: если данные закрыты, находку нельзя подтвердить.
Как устроена работа моделей в связке с проверкой результата, разобрано в материале про 12 агентов Claude Code и научную лабораторию: там из 28 эталонных сцен совпали 7, а 4 остались под вопросом. Этот кейс устроен так же: модель предложила направление, а формальная проверка отделила совпадение от доказательства.
Границу результата стоит держать в голове: он касается конкретных кривых NIST и не заменяет общий аудит стандартов. Следующий шаг для интересующихся - взять опубликованный код, прогнать его на своих данных и посмотреть, сойдутся ли числа для тех параметров, которые в отчёте остались без объяснения.