Sebastien Rousseau

ТАИНСТВЕННЫЕ

Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса

Вопрос, остававшийся открытым после того, как единственный человек, способный на него ответить, умер в 2023 году, имел прозаический ответ: генератор случайных чисел 1990-х годов, инициализированный по часам. Авторы говорят, что этот ответ укрепляет, а не ослабляет их уверенность в честном выборе кривых.

12 мин. чтения
Banner for: Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса

Вопрос, остававшийся открытым после того, как единственный человек, способный на него ответить, умер в 2023 году, имел прозаический ответ: генератор случайных чисел 1990-х годов, инициализированный по часам. Авторы говорят, что этот ответ укрепляет, а не ослабляет их уверенность в честном выборе кривых.

Резюме для руководителей

  • Алгоритм ECDSA был принят NIST в 2000 году как часть Стандарта цифровой подписи FIPS 186-2. В спецификациях публиковались параметры "начального значения" (seed), хеш-значение которых должно было определять коэффициент b кривой. АНБ (NSA) предоставило эти начальные значения без каких-либо объяснений или обоснований.
  • В октябре 2026 года сотрудник Anthropic попросил внутреннюю исследовательскую модель выяснить, как именно генерировались эти значения, не давая никаких подсказок. Менее чем за полчаса Claude обнаружил, что ни одно из начальных значений не было выходом хеш-функции. Они были результатом работы lrand48 - распространенного генератора псевдослучайных чисел, инициализированного по системным часам.
  • Это открытие не является криптографическим взломом, новой атакой или уязвимостью в кривых ECDSA. Авторы отмечают, что оно укрепляет их уверенность в том, что кривые выбирались без бэкдоров или преднамеренных слабых мест.
  • Claude также объяснил базовые точки шести кривых от мая 1997 года как полученные из генератора случайных чисел во FreeLIP - пакете длинной целочисленной арифметики Арьена Ленстры. Насколько известно авторам, ни одна базовая точка NIST ранее не имела объяснения.
  • Открытыми остаются вопросы: как выбирались базовые точки кривых P-224, P-256, P-384 и P-521 и какие критерии (если они вообще были) стояли за пропуском кривых-кандидатов.

Коэффициент, выглядевший производным, и начальное значение, которое никто не мог объяснить #

Алгоритм ECDSA был принят NIST в 2000 году как часть Стандарта цифровой подписи FIPS 186-2. Спецификации его кривых содержали параметр "начального значения" (seed), хеш-значение которого используется для определения коэффициента b кривой. На бумаге это успокаивающая конструкция. Согласно аргументу, если коэффициент получается из хеша опубликованного начального значения, никто не мог подогнать кривую вручную.

Этот аргумент надежен ровно настолько, насколько надежно само начальное значение. Начальные значения были предоставлены АНБ без каких-либо объяснений или обоснований, и в этом пробеле заключается вся проблема. Хеш - это дверь в одну сторону: он доказывает, что коэффициент следует из начального значения, но ничего не говорит о том, откуда взялось само начальное значение. Годами эти значения оставались в стандарте как необъясненные константы.

Существовала легенда, заполнявшая этот пробел. По самой известной версии, Джерри Солинас, давний сотрудник АНБ, сгенерировал эти начальные значения из хеша некой шутливой парольной фразы. Далее в источнике говорится, что это оказалось неправдой. В подобные истории обычно верят, потому что они конкретны и немного забавны, а еще потому, что никто не может их опровергнуть. Однако в качестве доказательства они не годятся. Практическим следствием было то, что никто не мог проверить это утверждение, а поиски самой фразы, построенные на слухах, закончились ничем.

Очевидным человеком, которого стоило спросить, был сам Солинас. Джерри умер в 2023 году, а другие коллеги того времени не выходили на связь. Это оставило открытым вопрос о том, как эти начальные значения были получены изначально.

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

Тридцать минут, никаких подсказок и результат, оказавшийся не хешем #

В октябре 2026 года любознательный сотрудник Anthropic спросил внутреннюю исследовательскую модель, сможет ли она выяснить, как были сгенерированы эти начальные значения, не давая ей никакой зацепки. Формулировка имеет значение. Модели не сказали, что именно искать, и не дали готового ответа для подтверждения.

Менее чем за полчаса Claude открыл происхождение начальных значений NIST P-192, P-224, P-256, P-384 и P-521. Результат прямолинеен: ни одно из начальных значений не было результатом работы какого-либо алгоритма хеширования. Они были выходом генератора случайных чисел lrand48 из стандартной библиотеки C.

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

Механизм прост для описания. Каждая итерация алгоритма берет 20 байтов из генератора в качестве начального значения-кандидата. Количество итераций является интересной деталью, поскольку показывает, что процесс был поиском, а не однократной выборкой. Например, для P-256 потребовалось 1842 итерации, чтобы выдать стандартизированное начальное значение. Тот, кто запускал эту программу, позволил ей перебирать кандидатов, пока один из них не породил кривую, отвечавшую предъявленным требованиям.

Авторы осторожны в отношении того, что это означает и чего не означает, и их формулировку стоит повторить. Это не криптографический взлом, не новая атака и не уязвимость в кривых ECDSA. Никаких мер предпринимать не нужно. Они идут на шаг дальше и говорят, что это делает их более уверенными в том, что кривые выбирались без каких-либо бэкдоров или преднамеренных уязвимостей. Это осторожный вывод, и таким он должен оставаться. Источник подает это как уверенность авторов, а это иная вещь, нежели строгое доказательство невинности кривых. То, что дает эта находка - это будничный, проверяемый отчет вместо непроверяемой байки.

Как сканер нашел отпечаток генератора 1990-х годов #

Метод заслуживает внимания, потому что это та часть, которую могут повторно использовать другие.

Claude предположил, что программное обеспечение, генерировавшее кривые, использовало ГПСЧ (PRNG), поставлявшийся с библиотеками C 1990-х годов. Источник трактует это как догадку, и она оказалась удачной. Она сузила неограниченный поиск до короткого списка кандидатов одной эпохи.

Затем Claude написал сканер. Он проходил вдоль каждого опубликованного начального значения бит за битом и проверял, являются ли соседние фрагменты последовательными выходами генератора образца 1990-х годов. Сканирование охватило 34 комбинации генераторов и срезов выходных данных. Совпадение проявилось как паттерн в старших битах - такой, который случайно возникает с вероятностью 1/5810.

Этот паттерн был характерной подписью линейного конгруэнтного генератора lrand48, который возвращает только старшие 31 бит из 48-битного состояния. Именно здесь конструкция генератора выдает себя. Поскольку lrand48 скрывает 17 битов своего 48-битного состояния при каждом вызове, выходные данные обладают регулярностью, которой не показала бы истинно случайная строка, и сканер, созданный для поиска этой регулярности, способен ее обнаружить.

Чтобы восстановить состояние, Claude взял первое машинное слово и перебрал все 2^17 значений 17 скрытых битов. Это небольшой перебор, и он дешев, поскольку сам генератор чрезвычайно прост. Каждое состояние-кандидат можно было проверить на следующем фрагменте начального значения, и правильное состояние заставило всю последовательность сойтись.

Начальные значения кривых над простыми полями оказались сложнее, хотя и ненамного. Они происходили из того же генератора lrand48, но сохраняли меньше битов каждого выхода. Меньше видимых битов означает меньше точек опоры для догадки, так что трюк с прямым перебором уже не работает столь же аккуратно. Ответ источника заключается в том, что восстановление состояния усеченного линейного конгруэнтного генератора - это хрестоматийная задача на решетках (lattice problem), решаемая с помощью алгоритма редукции базиса Ленстры-Ленстры-Ловаса (LLL). Модель смогла распознать это и применить стандартный инструмент без всякой экзотики.

Пять начальных значений кривых NIST над простыми полями плюс еще пять из стандарта ANSI X9.62 имели одинаковый шаблон: lrand48() >> 23. Десять начальных значений, разделяющих одно правило извлечения битов - это весомое доказательство единого процесса за ними.

Далее следует проверка, отделяющая случайное совпадение от настоящего. Каждое восстановленное 48-битное состояние заново генерирует все 160 битов своего начального значения, а такое не случается по воле случая. Частичное совпадение могло бы быть случайностью. Полная регенерация каждого бита - это вещь, которую гораздо труднее списать на совпадение, и именно поэтому результат можно утверждать прямо.

Прокрутка генератора назад, чтобы прочитать показания часов #

Восстановление состояния говорит вам, как было получено начальное значение. Оно еще не говорит, когда именно. Для этого Claude использовал свойство генератора: он работает в обратном направлении так же легко, как и в прямом. Для каждого начального значения Claude отматывал состояние назад, пока не достигал формы, которую дает инициализация srand48, где младшие 16 битов равны 0x330E.

Эта форма сама по себе является отпечатком пальца. Если восстановленное состояние можно отмотать назад до значения с младшими 16 битами, равными 0x330E, значит генератор был запущен стандартным образом - из начального значения, переданного в srand48. А начальным значением в данном случае было время. Начальные значения генерировались с помощью слабого ГПСЧ, инициализированного временной меткой Unix.

Внутренние рассуждения Claude в тот момент зафиксировали миг узнавания: все старшие биты были нулевыми, 20 битов, с вероятностью случайности 1e-6. Это мелкая деталь, но она показывает, что логика работала с числами по мере их появления, а не с историей, сочиненной задним числом.

Не все даты оказались чистыми. Четыре инициализации двоичных кривых читались как февраль 1984 года, а это явно не та дата, которой кто-либо ожидал бы для генератора, использовавшегося в конце 1990-х. После удвоения временных меток инициализации двоичных кривых отображаются на 17 апреля 1998 года - через две недели после запуска для P-224. Источник делает вывод, что программа, возможно, делила показания часов пополам. Это сформулировано осторожно, и так и должно быть: это предложенное объяснение того, почему сырые значения читаются как 1984 год, а удвоение, попадающее ровно на две недели после другого запуска, весьма показательно, хотя и не является прямым подтверждением внутреннего кода программы.

Я считаю это самой убедительной частью всего рассказа по причине, не связанной с криптографией. Выдуманная история дала бы аккуратные даты. А эта дала неуклюжую дату, а затем поправку, выстроившую двоичные кривые в согласованную последовательность с запуском P-224. Неопрятные данные, которые упорядочиваются с помощью простой гипотезы - вот как выглядит подлинная история происхождения.

У базовых точек тоже есть рецепт #

Начальные значения определяют сами кривые. Базовые точки - это отдельное дело, и источник рассматривает их отдельно.

Базовые точки шести кривых, сгенерированных в мае 1997 года (P-192 и пять демонстрационных кривых ANSI X9.62: prime192v2, prime192v3 и prime239v1 - v3), происходят из генератора случайных чисел во FreeLIP - пакете длинной целочисленной арифметики Арьена Ленстры. Ранние версии библиотеки NTL Виктора Шупа содержали тот же код. Этот второй факт важен для проверки: генератор существует как опубликованный код, который могут прочитать другие, а не как закрытый частный инструмент.

Рецепт короток. Инициализировать генератор малым целым числом. Отбросить семь первых выходов. Сгенерировать кандидаты x-координат из 26-битных выходов по модулю p. Повторять эту генерацию кандидатов, пока x не окажется на кривой.

Claude нашел начальные значения генератора: 20000 для P-192, 20420, 20507 и 20509 для prime239v1 - v3, а также 20512 и 20517 для prime192v2 и v3. Это малые целые числа именно такого вида, которые человек вводит в программу вручную, чего как раз и требует первый шаг рецепта.

Авторы делают здесь утверждение, которое скромно и заслуживает цитирования по духу: насколько им известно, ни одна базовая точка NIST ранее не была объяснена. Оговорка принадлежит им, и она уместна. Они не претендуют на обзор каждого когда-либо написанного документа, а лишь очерчивают границы собственных знаний.

Затем рецепт перестает работать. Базовые точки кривых P-224, P-256, P-384 и P-521 не укладываются в этот рецепт, и авторы не смогли объяснить, как именно они были выбраны. Статья, которая бы умолчала об этом, выглядела бы аккуратнее, однако авторы оставили этот факт. Объяснение охватывает шесть кривых из мая 1997 года и оставляет базовые точки четырех простых кривых NIST необъясненными.

Кандидаты, которых пропустили #

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

Для P-256 опубликованным начальным значением является кандидат 1842. Но кандидат 876 того же запуска также дает кривую простого порядка нужного размера, с параметрами, выбранными точно так же, как и для опубликованной кривой. Иными словами, процесс прошел мимо кривой, которая, на первый взгляд, была бы вполне приемлемой.

Это не единичный случай. Запуск для P-224 пропустил три такие кривые, а два запуска, стоящие за демонстрационными кривыми ANSI X9.62, пропустили еще семь.

Авторы прямо говорят о том, чего они не знают. Они не знают, какие критерии могли использоваться для пропуска кривых, и не было ли это непреднамеренным артефактом. Это ограничение, сформулированное как таковое, и осторожность в отношении "непреднамеренного артефакта" является честной позицией: данные показывают, что кандидаты пропускались, но не показывают почему.

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

Остается одна оговорка, и источник формулирует ее как возможность, а не как установленный факт. Теоретически все еще можно представить, что эти кривые выбирались ради некоего специфического свойства путем перебора временных меток, подававшихся на вход генератора случайных чисел. Это предположение, прямо помеченное как таковое. Его не следует читать как доказательство чего-либо, но и тихо отбрасывать его тоже не стоит. Добросовестное изложение оставляет его на столе как неисключенный вариант, одновременно отмечая, что сами авторы считают версию с ослабленными кривыми неправдоподобной.

Что меняет этот результат, и что он оставляет открытым #

Начнем с того, чего он не меняет. Кривые не взломаны. Источник говорит об этом дважды разными словами, и никаких мер предпринимать не нужно. Любой, кто читает это как повод срочно отказываться от P-256, понял прочитанное неправильно.

То, что он действительно меняет - это статус давнего сомнения. Пока начальные значения оставались необъясненными, фраза "предоставлены АНБ без каких-либо объяснений" висела постоянным знаком вопроса над стандартом. Теперь у этого знака вопроса есть конкретный ответ. Начальные значения не были загадочными хешами секретной фразы. Они были выходом lrand48 из программы, инициализированной по часам, который заново генерирует каждый бит каждого начального значения из восстановленного состояния. Объяснение, которое может проверить каждый, у кого есть опубликованные начальные значения, побеждает слух, который не может проверить никто.

Здесь есть важный момент для основателей и инженеров, строящих системы на базе криптографических стандартов. Заявления о происхождении дешево делать и дорого проверять, но описанная здесь проверка заняла менее получаса, как только был задан правильный вопрос. Сканер, перебор 2^17 и редукция решетки - все это стандартные приемы. Чего не хватало годами, так это кого-то, кто выполнил бы негламурную работу по их опробованию на опубликованных числах.

Я бы также воздержался от соблазна переоценивать сам метод. Источник сообщает о результате одной команды на конкретном наборе начальных значений. Он не утверждает, будто такой же подход расколет каждую необъясненную константу в каждом стандарте, и я не стану утверждать этого вместо авторов. То, что он демонстрирует, уже и, на мой взгляд, полезнее: когда происхождение параметра является загадкой, внимательная модель с правдоподобной догадкой об инструментарии той эпохи может быстро проверить эту догадку и показать ход своей работы.

Незавершенные дела достаточно ясны, чтобы стать программой дальнейших исследований. Четыре базовые точки - для P-224, P-256, P-384 и P-521 - до сих пор не имеют объяснения. Пропущенные кандидаты, такие как 876 перед опубликованным 1842 для P-256, не имеют известного критерия отбора, и никто пока не знает, был ли этот пропуск преднамеренным или случайным артефактом. Сохранились ли эти ответы в старом исходном коде, в воспоминаниях живых коллег или в таком же поиске паттернов, который расколол начальные значения - это открытый вопрос. На начальные значения ушло полчаса; базовые точки уже один раз устояли перед этим подходом.

Часто задаваемые вопросы #

Ломает ли это открытие кривые NIST ECDSA, такие как P-256 или P-384?

Нет. Открытие того, что начальные значения кривых были сгенерированы функцией lrand48, а не хешем парольной фразы, не создает никакого криптографического взлома, новой атаки или математической уязвимости в кривых ECDSA, и из-за этой находки не требуется проводить никаких исправлений или миграций.

Как на самом деле генерировались начальные значения простых кривых NIST?

Каждое 160-битное начальное значение было получено путем вызова линейного конгруэнтного генератора lrand48 из стандартной библиотеки C (в частности, lrand48() >> 23 для пяти простых кривых NIST и пяти кривых ANSI X9.62), инициализированного через srand48 временной меткой Unix. Восстановление 48-битного внутреннего состояния с помощью алгоритма редукции решетки Ленстры-Ленстры-Ловаса (LLL) воспроизводит все 160 битов каждого опубликованного начального значения.

Что остается необъясненным в параметрах эллиптических кривых NIST?

Хотя базовые точки кривой P-192 и пяти кривых ANSI X9.62 удалось проследить до генератора случайных чисел в пакете FreeLIP Арьена Ленстры, инициализированного малыми целыми числами, базовые точки P-224, P-256, P-384 и P-521 не соответствуют этому рецепту, а критерии пропуска более ранних кривых-кандидатов простого порядка (таких как кандидат 876 перед кандидатом 1842 в P-256) остаются неизвестными.

Источники #

Последняя проверка .

Перепубликовать эту статью

Скопировать формат для Medium

# Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса — Sebastien Rousseau

> Originally published at [https://sebastienrousseau.com/ru/2026-10-26-tainstvennye-nachalnye-znacheniya-krivykh-nist-nikogda/](https://sebastienrousseau.com/ru/2026-10-26-tainstvennye-nachalnye-znacheniya-krivykh-nist-nikogda/)

Начальные значения (seeds), опубликованные вместе с кривыми NIST P-192, P-224, P-256, P-384 и P-521, никогда не были результатами хеширования. Они происходили из генератора lrand48 библиотеки C.

Read the full article on sebastienrousseau.com: https://sebastienrousseau.com/ru/2026-10-26-tainstvennye-nachalnye-znacheniya-krivykh-nist-nikogda/

Скопировать формат для Mastodon

Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса — Sebastien Rousseau

Начальные значения (seeds), опубликованные вместе с кривыми NIST P-192, P-224, P-256, P-384 и P-521, никогда не были результатами хеширования. Они происходили из генератора lrand48 библиотеки C.

https://sebastienrousseau.com/ru/2026-10-26-tainstvennye-nachalnye-znacheniya-krivykh-nist-nikogda/

Копировать в формате для LinkedIn

Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса — Sebastien Rousseau

Начальные значения (seeds), опубликованные вместе с кривыми NIST P-192, P-224, P-256, P-384 и P-521, никогда не были результатами хеширования.

Вот ключевые стратегические выводы:

- Коэффициент, выглядевший производным, и начальное значение, которое никто не мог объяснить. Алгоритм ECDSA был принят NIST в 2000 году как часть Стандарта цифровой подписи FIPS 186-2.
- Тридцать минут, никаких подсказок и результат, оказавшийся не хешем. В октябре 2026 года любознательный сотрудник Anthropic спросил внутреннюю исследовательскую модель, сможет ли она выяснить, как были сгенерированы эти начальные значения, не давая ей никакой зацепки.
- Как сканер нашел отпечаток генератора 1990-х годов. Метод заслуживает внимания, потому что это та часть, которую могут повторно использовать другие.
- Прокрутка генератора назад, чтобы прочитать показания часов. Восстановление состояния говорит вам, как было получено начальное значение.

Каков подход вашей организации к вызовам, описанным в этой статье?

→ https://sebastienrousseau.com/ru/2026-10-26-tainstvennye-nachalnye-znacheniya-krivykh-nist-nikogda/

#Таинственные #Зерна #Кривые #Nist #Хеши

Sebastien Rousseau | CC-BY-4.0
Цитировать эту статью

Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса — Sebastien Rousseau

Начальные значения (seeds), опубликованные вместе с кривыми NIST P-192, P-224, P-256, P-384 и P-521, никогда не были результатами хеширования. Они происходили из генератора lrand48 библиотеки C.

BibTeX

@online{rousseau2026таинственные,
  author  = {Rousseau, Sebastien},
  title   = {{Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса — Sebastien Rousseau}},
  year    = {2026},
  url     = {https://sebastienrousseau.com/ru/2026-10-26-tainstvennye-nachalnye-znacheniya-krivykh-nist-nikogda/},
  urldate = {2026}
}

RIS

TY  - GEN
AU  - Rousseau, Sebastien
TI  - Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса — Sebastien Rousseau
PY  - 2026
UR  - https://sebastienrousseau.com/ru/2026-10-26-tainstvennye-nachalnye-znacheniya-krivykh-nist-nikogda/
ER  -

Vancouver

Rousseau S. Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса — Sebastien Rousseau. sebastienrousseau.com. 2026 Oct 26. Available from: https://sebastienrousseau.com/ru/2026-10-26-tainstvennye-nachalnye-znacheniya-krivykh-nist-nikogda/

Chicago

Rousseau, Sebastien. "Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса — Sebastien Rousseau." sebastienrousseau.com. October 26, 2026. https://sebastienrousseau.com/ru/2026-10-26-tainstvennye-nachalnye-znacheniya-krivykh-nist-nikogda/.

APA

Rousseau, S. (2026, October 26). Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса — Sebastien Rousseau. sebastienrousseau.com. https://sebastienrousseau.com/ru/2026-10-26-tainstvennye-nachalnye-znacheniya-krivykh-nist-nikogda/

Опубликовать заново

Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса — Sebastien Rousseau

Начальные значения (seeds), опубликованные вместе с кривыми NIST P-192, P-224, P-256, P-384 и P-521, никогда не были результатами хеширования. Они происходили из генератора lrand48 библиотеки C.

Эта статья распространяется по лицензии Creative Commons Attribution 4.0 International. При повторной публикации требуется указание канонической ссылки.

Таинственные начальные значения кривых NIST никогда не были хешами, и Claude выяснил это менее чем за полчаса — Sebastien Rousseau

Начальные значения (seeds), опубликованные вместе с кривыми NIST P-192, P-224, P-256, P-384 и P-521, никогда не были результатами хеширования. Они происходили из генератора lrand48 библиотеки C.

Originally published at https://sebastienrousseau.com/ru/2026-10-26-tainstvennye-nachalnye-znacheniya-krivykh-nist-nikogda/ by Sebastien Rousseau.
Licensed under CC-BY-4.0.