Ключи от цифрового мира

от автора

Поднимая очередной VDS для небольшого личного проекта, я решил провести эксперимент. Последнее время я всё чаще делегирую рутинные задачи AI-агентам: сравнить пару таблиц, написать обоснование, разобрать логи. Задачи шаблонные — и агенты справляются с ними достаточно хорошо. Первоначальная настройка нового сервера как раз из этого ряда: действия известные, последовательность одна и та же, с небольшими вариациями по месту.

Мне досталась абсолютно чистая виртуальная машина. Типовой список задач выглядит шаблонно: обновить пакеты, сменить хостнейм, создать непривилегированного пользователя, настроить sudo, закрыть SSH для root, выключить авторизацию по паролю и оставить только ключи, поднять файрвол — разрешить нужные порты, запретить остальное, установить защиту от брутфорса. Всё это вместе называется «первые десять минут на сервере» и кочует из статьи в статью примерно с начала времен.

Я наблюдал за работой агента вполглаза, подтверждая команды — всё-таки новым чудесным технологиям я пока ещё доверяю не до конца. В какой-то момент взгляд зацепился за нетипичное: настраивая SSH-доступ, я привычно ввожу в терминал ssh-keygen -t rsa -b 4096 — уже много лет, не задумываясь, на уровне доведённой до автоматизма мышечной памяти.

Агент предложил мне нечто иное.

Я решил разобраться — и это увело меня на полчаса в мир криптографии и шифрования. Результатами этого погружения мне хочется поделиться в этой статье.


Начнём издалека: зачем вообще нужны ключи, если можно защититься паролем? Ведь, казалось бы: можно просто выбрать пароль подлиннее, и защита сработает не хуже…

Пароль — это секрет, который знаете только Вы. Логика простая и всем понятная, со времен детских сказок: «Сезам, откройся!». Правильная комбинация, ключ к замку — и нужная дверь открыта. Чем комбинация длиннее — тем сложнее подобрать ее случайным образом, тем крепче защита.

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

Это первый, и, пожалуй, самый очевидный, способ защиты информации изобретенный человечеством — симметричное шифрование. Идея проста: у обоих участников один и тот же ключ. Зашифровал им — расшифровал им же. Именно так работает, например, архив с паролем, или зашифрованная флешка.

Симметричное шифрование прекрасно работает — если у обоих уже есть ключ, или если канал передачи такого ключа абсолютно надежен и безопасен.

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

Допустим Ваш пароль — это ключ к шифру, и Вы зашифровали им свое послание. Чтобы получающая сторона могла его расшифровать — Вам нужно передать ей этот пароль. Проблема в том, что для того чтобы зашифровать пароль, Вам потребуется еще один дополнительный ключ шифрования — и это не решает проблему, а просто воспроизводит ее на новом витке. Вот вам и фундаментальный парадокс, с которого начинается вся современная криптография: чтобы установить защищённое соединение, нужен защищённый канал — которого ещё нет.

Ответ на этот вопрос появился в 1976 году, и он произвёл революцию. Уитфилд Диффи и Мартин Хеллман предложили идею, которая легла в основу современной ассиметричной криптографии: что если для шифрования и расшифровки использовать разные ключи?

Так родилась асимметричная криптография — два математически связанных ключа. Один — публичный: его можно раздавать всем желающим, публиковать в газетном объявлении, передавать в открытом виде. Второй — приватный: хранится только у владельца и никогда никуда не передаётся. На языке аналогий: представьте, что я раздаю всем открытые навесные замки — незакрытые, без ключа. Каждый может взять такой замок, положить в него письмо и защёлкнуть. Открыть его — только я, потому что ключ один и хранится он только у меня.

Именно это происходит каждый раз, когда вы видите в браузере значок замка перед адресом сайта. Ваш браузер и сервер «обмениваются замками» и договариваются о временном общем секрете — так, что перехватить этот процесс и получить содержимое переписки практически невозможно. Это происходит за доли секунды и совершенно незаметно для пользователя.

Та же механика — в SSH, который используется для подключения к серверам. В мессенджерах с end-to-end шифрованием. В электронной подписи документов. В Bitcoin. Асимметричная криптография — невидимый фундамент, на котором стоит весь цифровой мир.

Теперь самое интересное: как это вообще работает? Откуда берётся математическая магия, которая позволяет шифровать так, чтобы расшифровать мог только владелец приватного ключа?

Всё держится на одной математической идее — односторонней функции. Это операция, которую легко выполнить в одну сторону и практически невозможно — в обратную. Смешать два цвета краски просто. Разделить получившийся цвет обратно на составляющие — невозможно.

Можно использовать различные односторониие функции. На практике — используется несколько хорошо зарекомендовавших себя алгоритмов.

RSA

Перемножить два простых числа — задача тривиальная. Возьмём 17 и 19, получим 323. Быстро, просто, справится почти любой школьник.

А теперь обратная задача: вам дают число 1147 и просят найти, из каких двух простых множителей оно состоит. Уже сложнее — приходится перебирать. Ответ, кстати, 31 × 37.

Теперь представьте, что число не трёхзначное, а состоит из 600 цифр. Перемножить два больших простых числа такого масштаба — тривиальная задача для любого компьютера. Разложить результат обратно на множители — задача, которая при сегодняшних вычислительных мощностях потребует времени, сравнимого с возрастом вселенной. Вот на этой асимметрии и стоит RSA. Публичный и приватный ключи RSA математически порождаются из пары больших простых чисел. Публичный ключ — продукт их перемножения, который можно раздавать всем. Приватный ключ — знание самих множителей, которое позволяет расшифровать. Пока никто не умеет быстро решать задачу факторизации — система держится.

В 1977 году авторы алгоритма опубликовали в Scientific American задачу: разложить на множители 129-значное число — RSA-129. По их оценке, на это уйдёт 40 квадриллионов лет. В 1994-м задачу решили за восемь месяцев — с помощью распределённых вычислений на 1600 компьютерах по всему миру, подключённых через интернет. В 1977 году авторы немного недооценили с прогресс.

Отсюда и необходимость в длинных ключах. Чем больше число, тем дольше его разбирать на множители. 1024 битные числа считались нормой в 2000-х — сейчас это уже не выглядит безопасным. 2048 бит — рекомендованный минимум сегодня. 4096 бит — длина ключа, которую я привычно генерирую, не задумываясь.

Эллиптические кривые

Математики давно заметили: RSA — не единственная возможный способ. Можно построить криптосистему на совершенно других задачах, которые станут ещё более сложными для взлома — при ключах значительно меньшего размера.

Эллиптические кривые — это семейство математических объектов вида:

y² = x³ + ax + b

Выглядят они как плавные симметричные линии, и на первый взгляд непонятно, какое отношение они имеют к шифрованию. Но у точек на такой кривой есть интересное свойство: их можно «складывать» по специальным правилам.

Возьмём точку G на кривой и прибавим её к себе d раз. Получим точку H. Эта операция — быстрая. Обратная задача: зная G и H, найти d — вычислительно неразрешима при достаточно большом числе d.

Именно здесь и кроется главное отличие от RSA: математическая задача на эллиптических кривых значительно сложнее факторизации. Это означает, что для эквивалентного уровня защиты ключ нужен намного короче. 256-битный ключ на эллиптических кривых примерно соответствует 3072-битному RSA. А 32 байта — это и есть 256 бит.

Именно поэтому Ed25519 — это не просто «другой алгоритм». Это другая математика, более элегантная и более эффективная. Те же гарантии безопасности, ключ в шестнадцать раз короче, операции быстрее. И — отдельный бонус — детерминированная подпись: алгоритм не требует качественного источника случайных чисел при каждой операции, в отличие от некоторых предшественников, которые именно из-за этого и ломались.

Число 25519 в названии — не случайное. Это показатель степени в числе 2²⁵⁵ − 19, по модулю которого работает кривая. Простое число такого вида выбрано специально: с ним арифметика выполняется особенно эффективно на современных процессорах.

Алгоритм Curve25519 был разработан в 2005 году Дэниелом Бернштейном — математиком и криптографом, мало известным широкой публике, однако в профессиональных кругах это культовая фигура. Он создал ChaCha20 — потоковый шифр, который сегодня защищает ваш трафик в современном TLS и QUIC, и Poly1305 — алгоритм проверки целостности данных. Вместе они образуют связку ChaCha20-Poly1305, которую Google в своё время продвинула как альтернативу AES в мобильных устройствах — там, где аппаратного ускорения AES нет, а скорость критична. Сегодня эта связка работает в миллиардах устройств ежедневно. В 1995 году Бернштейн подал в суд на правительство США, оспорив законы об экспортном контроле над криптографией — и выиграл. После этого решения американские криптографические разработки перестали считаться «военным экспортом».

В 2013 году документы Сноудена подтвердили то, о чём давно шептались: АНБ целенаправленно внедряло закладки в криптографические стандарты. Наиболее скандальный случай — генератор случайных чисел Dual_EC_DRBG, принятый NIST как официальный стандарт в 2006 году. Бернштейн ещё в 2007-м публично указал на подозрительную структуру его параметров. После Сноудена стало ясно: он был прав. По данным Reuters, АНБ заплатило компании RSA Security 10 миллионов долларов за то, чтобы тот стал генератором по умолчанию в их продуктах. NIST отозвал стандарт. RSA Security принесла извинения клиентам.

Стандартные кривые NIST — P-256, P-384, P-521 — вызывают немало вопросов. Их параметры порождены из некоего «случайного» начального значения, происхождение которого никто и никогда официально не объяснил. В криптографии это называется принципом «ничего в рукаве» — и именно им принято описывать алгоритмы, где каждое число имеет открытое и проверяемое обоснование. Кривые NIST этому критерию не соответствуют. Curve25519 — соответствует полностью. Именно поэтому сообществу приняло их в качестве альтернативы, в которой нет ни одного числа, появившегося из ниоткуда. И именно поэтому работы Бернштейна пользуются таким доверием у тех, кто профессионально занимается безопасностью и криптографией.

Ed25519 вошел в OpenSSH в версии 6.5 — в январе 2014 года. Двенадцать лет назад. Всё это прошло мимо меня. В 2014 году я генерировал RSA-ключи, не задумываясь. В 2024-м — тоже. И в 2026-м. Мышечная память оказалась сильнее любопытства. Впрочем, говорить о том что RSA устарел и вытеснен Ed25519, пожалуй, рановато. Скорее, можно констатировать, что современный ландшафт криптографических решений предлагает несколько альтернатив, имея при этом ряд вершин, среди которых:

RSA — ветеран, которому в этом году исполняется 48 лет. Алгоритм описан в 1977-м, назван по первым буквам фамилий авторов: Rivest, Shamir, Adleman. Работает. Проверен временем. Поддерживается буквально везде — от смарт-карт до самых современных HSM. Главная проблема — тяжеловесность: для приемлемой безопасности нужны длинные ключи, операции медленнее, трафик больше. На слабых устройствах — IoT, смарт-карты, встраиваемые системы — это ощутимо. Несомненный плюс — наличие почти в любой системе.

ECDSA — попытка взять лучшее из двух миров: математику эллиптических кривых при сохранении привычного интерфейса. Короткие ключи, высокая стойкость. Широко используется в TLS, Bitcoin, документах. Есть одно «но»: алгоритм требует качественной случайности при каждой подписи.

Ed25519 — эллиптические кривые в реализации Бернштейна: детерминированная подпись без зависимости от случайных чисел, прозрачные параметры, ключ в 32 байта, скорость выше RSA в разы. На современном процессоре Ed25519 способен проверять десятки тысяч подписей в секунду на одном ядре. Поддерживается в OpenSSH с 2014 года, в современных версиях TLS, в большинстве актуальных криптобиблиотек. Де-факто стандарт для нового времени.

Казалось бы — выбор очевиден. Но у истории наверняка будет продолжение.

На горизонте — квантовые компьютеры. И RSA, и эллиптические кривые держатся на одном допущении: что перебрать все варианты за разумное время невозможно. Квантовый компьютеры ломают это допущение — они решают задачу факторизации принципиально иначе, превращая экспоненциальное время в полиномиальное. Питер Шор описал этот алгоритм ещё в 1994 году — за тридцать лет до появления машин, способных его запустить. Чтобы сломать RSA-2048, квантовому компьютеру потребуется порядка четырёх тысяч логических кубитов с исправлением ошибок — что в реальности означает миллионы физических кубитов. Лучшие машины сегодня имеют около тысячи физических кубитов с высоким уровнем ошибок. Пока далеко. Но спецслужбы уже сейчас собирают зашифрованный трафик про запас — с расчётом расшифровать его позже, когда технологии дорастут. Подход, который называется «собери сейчас, расшифруй потом».

В 2024 году NIST утвердил первые постквантовые стандарты: ML-KEM и ML-DSA — на основе решёточной криптографии, задачи которой квантовые алгоритмы решать не умеют. Конкурс на их разработку начался в 2016-м, принял 69 заявок со всего мира и занял восемь лет. Миграция уже началась: крупные браузеры, облачные провайдеры и правительственные системы постепенно добавляют поддержку новых алгоритмов.

Криптография — не застывший монумент. Это живая гонка между теми, кто строит замки, и теми, кто пытается их взломать. Ed25519 — возможно, лучший замок на сегодня, а что будет лучшим лет через десять — вопрос пока открыт.


Изучив всю эту теорию когда-то давно, я всегда генерировал RSA-ключи на автомате, и ни разу не задал себе вопрос: а правильно ли то, что я делаю?

Возможно, я не так уж и ошибался. Просто мир за это время успел придумать кое-что получше, и я это пропустил.

В итоге, выкурив несколько мегабайт информации и потратив некоторое количество времени на удовлетворение своего любопытства, я согласился с агентом и нажал Enter — подтвердив генерацию ключа на эллиптических кривых.

ssh-keygen -t ed25519

А как бы поступили Вы на моём месте?

ссылка на оригинал статьи https://habr.com/ru/articles/1053414/