Ровно восемнадцать лет назад, задолго до того, как термин «аппаратное ускорение на GPU» вошёл в повседневный обиход, а обычные видеокарты стали рассматривать в качестве мощных универсальных вычислителей, одна маленькая, но гордая компания изменила мир. По крайней мере, ту часть мира, в которой взламывают пароли. «А что, если видеокарту как-то приспособить для перебора паролей?» Сказано — сделано.
В 2007 году произошло два взаимосвязанных события: компания NVIDIA официально выпустила фреймворк для разработчиков CUDA, а наша компания подала патентную заявку на метод ускорения перебора паролей с использованием графических ускорителей. Это сегодня ускорением на видеокартах никого не удивишь; это сегодня энтузиасты устанавливают по несколько игровых видеокарт в ряд, чтобы запустить на них языковую модель; это сегодня капитализация NVIDIA составляет 4.38 триллиона долларов. Восемнадцать лет назад всего этого не было, а NVIDIA была всего лишь одним из игроков на рынке видеокарт с капитализацией в скромные 18.9 миллиардов долларов. И одной из причин такого взрывного роста стал именно выход NVIDIA CUDA — мощной платформы, разработанной NVIDIA для выполнения вычислений на графических процессорах, которые до того использовались почти исключительно в играх и в качестве ускорителей в задачах 3D-рендеринга.
Наша разработка и наш продукт Elcomsoft Distributed Password Recovery (EDPR) стали первыми в мире коммерческими решениями, использующими всю мощь графических ядер для решения задач криптоанализа. Задачи, для которых раньше требовались месяцы, представленный нами метод решал за дни или часы — и эта пропорция мало изменилась со временем. Видеокарты становились мощнее, центральные процессоры не слишком отставали в развитии, но и криптографическая защита — за несколькими исключениями — не стояла на месте. Да, новых алгоритмов для защиты паролей появилось не так много, зато производители хорошо освоили принцип массовости, в котором пароль защищается постоянно растущим с годами числом итераций (раундов шифрования или хеширования).
Когда в 2007 году оказалось, что видеокарты можно использовать не только для видеоигр, идея казалась новаторской. Шло время, узкая специализация видеокарт осталась в прошлом; само название «видеокарта» совершенно не отражает содержимого. Да, в этих устройствах сохранились полноценные видеовыходы, их по-прежнему можно использовать для игр, но любители компьютерных игр не в состоянии поднять капитализацию компании-производителя до триллионных значений.
Сегодня графические процессоры — если их всё ещё можно назвать графическими, — применяются практически во всех областях, требующих вычислительных мощностей. В искусственном интеллекте и машинном обучении GPU используются для обучения нейросетей, генерации и распознавания изображений, работы больших языковых моделей. В науке — для моделирования физических процессов, анализа молекулярных структур и разнообразных симуляций. В области видеомонтажа GPU обеспечивают быструю обработку и рендеринг видео в реальном времени. Криптография также не может обойтись без графических ускорителей — достаточно посмотреть на майнинговые фермы. Видеоускорители используются и для анализа больших данных.
Сегодня принципы, на которых основаны вычисления на графических процессорах, стали не просто неотъемлемой, но самой важной частью мощных компьютеров. О каких именно принципах идёт речь, и что именно выделяет GPU-ускорители от прочих типов процессоров?
Итак, мы уже выяснили, что видеокарта — сердце мощной рабочей станции, её самый мощный вычислитель. Почему же, образно говоря, видеокарты до сих пор не захватили мир?
Во-первых, захватили. В этот самый момент по всему миру (а в особенности — в США и Китае) строятся гигантские центры для обработки данных, и основной и самой дорогой их частью являются именно подобные ускорители. Назвать их «графическими» уже не поворачивается язык: видеовыхода в них зачастую уже нет, хотя какие-то рудименты в некоторых моделях могут сохраняться.
А во-вторых… вычисления на видеокартах принципиально отличаются от вычислений на обычных процессорах, CPU. Если центральный процессор способен выполнять команды в любой последовательности на любом из множества ядер, то вычислительные ядра видеокарт работают по принципу SIMD — Single Instruction, Multiple Data, когда все (а их, напомним — тысячи) ядра выполняют одну и ту же инструкцию, пусть и с разными данными. Таким образом, за условную единицу времени центральный процессор проверит столько паролей, сколько у него ядер (допустим, 24), а видеокарта — столько, сколько ядер у неё на борту (например, 21,760 у видеокарт NVIDIA GeForce RTX 5090). Однако, когда речь заходит о выполнении самой обычной задачи в один поток, видеокарта всё так же выполняет ровно одну команду — а центральный процессор намного больше.
Разумеется, это сравнение условно: центральный процессор способен обработать больше одной команды за такт, да и частота его, как правило, выше, чем у видеокарты, поэтому реальная разница в производительности между 24-ядерным Intel Core Ultra 9 285K и NVIDIA GeForce RTX 5090 с 21,760 ядрами CUDA будет меньше. Насколько именно меньше — зависит от множества факторов, один из которых — алгоритм шифрования или хеширования и то, насколько хорошо его можно переложить на GPU.
На практике просто переложить задачу на GPU оказывается гораздо сложнее, чем кажется. Разное «железо» демонстрирует разную производительность, которая может меняться в зависимости от алгоритма хеширования, пропускной способности памяти и текущей загрузки системы. Чтобы достичь максимальной скорости, необходимо тщательно сбалансировать работу всех вычислительных узлов. В Elcomsoft Distributed Password Recovery для решения этой задачи реализован механизм Intelligent Load Balancing, который автоматически анализирует характеристики всех доступных устройств — центрального процессора, дискретных и встроенных графических адаптеров, — и распределяет нагрузку так, чтобы обеспечить максимальную производительность. Система оценивает эффективность в реальном времени: мощные GPU получают основную часть вычислений, а CPU подключается только тогда, когда это действительно ускоряет процесс (напомним, его основная задача — всё-таки не прямой перебор, а подготовка пачек паролей для подачи на видеокарту).
Сложности возникают и при работе с особенно быстрыми алгоритмами, где счёт идёт на миллионы паролей в секунду. Если генерация паролей для проверки выполняется на центральном процессоре, именно этот этап становится узким местом. Поэтому даже такие, казалось бы, простые операции, как перебор комбинаций в режиме полного перебора, нередко приходится переносить на GPU. Однако реализовать это в параллельной среде непросто: нужно тщательно продумать синхронизацию потоков, управление памятью и передачу данных между устройствами, чтобы не потерять преимущество скорости. Ещё больше усложняют задачу словарные атаки и правила подстановок — распределение и обработка огромных списков слов между тысячами потоков требует точного планирования и продуманной архитектуры.
Некоторые форматы создают дополнительные проблемы. В алгоритмах, используемых, например, в WPA или Lotus Notes, часть вычислений хорошо ложится на GPU, но другие этапы требуют обязательной обработки на CPU. В таких случаях графический ускоритель не может работать автономно — он вынужден ждать, пока процессор подготовит необходимые данные. Если центральный процессор недостаточно мощный или плохо оптимизирован, GPU просто простаивает, теряя эффективность. Добиться сбалансированной производительности можно только при тесной координации работы обоих устройств, и часто именно быстрый CPU выходит на первые роли.
Важную роль в производительности играет и среда разработки. На видеокартах NVIDIA максимальная эффективность достигается при использовании CUDA — специализированной проприетарной платформы, обеспечивающей низкоуровневый доступ к архитектуре NVIDIA и позволяющей применять уникальные оптимизации, недоступные универсальным фреймворкам. Такой подход жертвует кроссплатформенностью, но взамен даёт ощутимый прирост вычислительной скорости. Однако у CUDA есть и оборотная сторона: каждая новая серия видеокарт требует обновлённой версии CUDA, вместе с которой приходят и новые зависимости и ограничения. Так, поколение Blackwell (видеокарты серии RTX 5000, включая GeForce RTX 5090 и RTX PRO 6000 Blackwell) требует CUDA версии 12.8 или новее. Начиная с этой версии, NVIDIA окончательно отказалась от поддержки 32-битных приложений, и теперь все программы, работающие с CUDA, должны компилироваться под 64-битную архитектуру. Именно поэтому нынешняя версия Elcomsoft Distributed Password Recovery, построенная на 32-битной платформе, не поддерживает последние версии CUDA и, соответственно, самые новые GPU NVIDIA.
Работа над 64-битной версией EDPR ведётся уже более трёх лет. Это не просто обновление интерфейса — фактически, это полная модернизация внутренней архитектуры. Помимо сервера, консоли и клиентской части — той, которую видит и с которой взаимодействует пользователь, — продукт состоит ещё и из сотен плагинов, каждый из которых отвечает за работу с определённым форматом данных. Многие из них создавались ещё под 32-битные системы и содержат сложные низкоуровневые оптимизации на ассемблере. Переписать и адаптировать эти модули под 64-битные процессоры — задача трудоёмкая и, как оказалось, весьма длительная.
Почему CUDA настолько быстрее на видеокартах NVIDIA, чем открытые API вроде Vulkan или OpenCL, которые на других платформах показывают отличные результаты? Ответ кроется в закрытой природе экосистемы NVIDIA. Компания предоставляет разработчикам мощный инструментарий — CUDA, но при этом не раскрывает внутреннюю систему команд, а точнее — ISA (Instruction Set Architecture) своих ускорителей. Код CUDA компилируется не напрямую, а в промежуточное представление PTX (Parallel Thread Execution), которое затем преобразуется в машинный код закрытым драйвером NVIDIA. Поскольку низкоуровневая архитектура, поведение планировщика и структура инструкций недокументированны, сторонние фреймворки не имеют доступа к тем оптимизациям, которые использует CUDA. Более того, лицензионное соглашение NVIDIA прямо запрещает реверс-инжиниринг, блокируя попытки создать альтернативные инструменты.
В результате открытые и кроссплатформенные API вроде Vulkan или OpenCL оказываются в невыгодном положении. Не имея доступа к внутренним оптимизациям и документации NVIDIA, они вынуждены использовать более высокоуровневые абстракции и общие принципы, местами — реверс-инжиниринг. Всё это приводит к ощутимым потерям производительности: одинаковые задачи часто выполняются в Vulkan медленнее, чем в CUDA, и особенно — на сложных и масштабных задачах. По сути, NVIDIA сознательно выстраивает экосистему, в которой CUDA позиционируется как «единственно правильный» инструмент, способный раскрыть весь потенциал GPU.
Быстро — это сколько? Мы протестировали Distributed Password Recovery на разных форматах.
Итак, бенчмарки ясно показывают: даже видеокарта среднего уровня способна дать колоссальный прирост скорости перебора. Так будет всегда? Мы в этом сомневаемся. Современные криптографические алгоритмы всё чаще проектируются с учётом противодействия GPU-ускорению. Например, схемы на базе алгоритмов scrypt и Argon2 требуют большого объёма памяти на каждый поток. А если потоков — десять или двадцать… тысяч? Никакой памяти не хватит, и преимущество параллельного перебора исчезает. Подобные алгоритмы пока не снискали большой популярности, но мы ожидаем их постепенного проникновения в мейнстрим.
Не будем забывать и о классических способах противостоять перебору. С одной стороны, некоторые алгоритмы — например, MD5, SHA-1, как, к примеру, в паролях NTLM (для входа в Windows), — идеально «ложатся» на видеокарту. Но есть и более сложные функции, которые плохо поддаются распараллеливанию. Наконец, производители регулярно увеличивают число итераций хеширования для проверки пароля, чтобы компенсировать рост скорости компьютеров, использующихся для атаки.
Совсем скоро, ещё до конца этого года, мы планируем выпустить крупное обновление Distributed Password Recovery. Продукт полностью пересобран под 64-разрядную архитектуру; в нём поддерживается актуальная версия CUDA, позволяющая использовать новейшие ускорители с архитектурой Blackwell. На практике от перехода с NVIDIA RTX 4090 на RTX 5090 (Blackwell) ожидается приблизительно полуторакратный прирост скорости перебора (в зависимости от формата), а переход с NVIDIA RTX 4080 на всё ту же 5090 удвоит производительность.
Восемнадцать лет назад мы придумали, как использовать видеокарты для взлома паролей. Сегодня подобными методами пользуются многие. Более того, видеоускорители постепенно теряют приставку «видео» — теперь это просто «ускорители», которые миллионами устанавливают в гигантские центры обработки информации. Мы стояли в истоках этого процесса, успешно используя методику и по сей день.
Производительное решение для восстановление паролей к десяткам форматов файлов, документов, ключей и сертификатов. Аппаратное ускорение с использованием потребительских видеокарт и лёгкое масштабирование до 10,000 рабочих станций делают решение Элкомсофт оптимальным для исследовательских лабораторий и государственных агентств.
Официальная страница Elcomsoft Distributed Password Recovery »