stihl не предоставил(а) никакой дополнительной информации.
Взлом хешей методом перебора — одно из ключевых хакерских занятий. Главное в этом деле — эффективность, а чтобы ее добиться, нужно разбираться в железе. Сегодня вспомним, как устроен CPU, как можно использовать GPU, с какой стороны подступиться к GPGPU, CUDA и OpenCL.
Хешкрекинг (от английского hash cracking — буквально «раскалывание хешей») — это область криптоанализа (или информационной безопасности, смотря с какой стороны подойти), где цель — найти значение сообщения, которое было пропущено через хеш‑функцию. Для нас хешкрекинг актуален именно из‑за того, что самый распространенный способ хранения паролей именно в хешах. Поэтому его часто называют восстановлением паролей.
Сразу отметим, что хешкрекинг — это тема строго офлайновая, она никак не связана со спреингом паролей (password spraying) или брутфорсом (brute force) при атаках на системы аутентификации.
Для хешкрекинга нужно иметь некий хеш, для которого мы будем подбирать исходное значение. Вообще, сам термин вводит нас в заблуждение: в реальности никто хеши не раскалывает. Хеш‑функция необратима, и наша задача — перебирать потенциальные пароли и считать хеши от них, а потом сравнивать с тем хешем, что у нас есть.
Наши шансы крайне малы, но есть методы, которые помогут начать систематически выигрывать в этом бою. Но, как ни крути, нам придется вычислять хеши, сотни или даже сотни тысяч хешей.
В девяностые и начале нулевых никому бы и в голову не пришло спорить о том, что является вычислительным сердцем компьютера, ответ был бы очевиден — центральный процессор (он же ЦП или CPU). Но сегодня все не так однозначно: графические процессоры (ГП или GPU) стали такими мощными, что в некоторых задачах ЦП уже сложно конкурировать.
Здесь важно понять, что ЦП — это просто машина для выполнения написанных людьми инструкций. Сам он не знает, что делает, и в конечном итоге просто переключает состояние ячеек по сложным правилам. При этом немалая часть чипа занята не конкретно вычислениями, а их администрированием.
Внутри ядра процессы подчинены архитектуре фон Неймана: извлечение из памяти → декодирование → выполнение → запись в память. За первые два этапа отвечает фронтенд ядра (он, помимо прочего, содержит еще и модули ветвления и параллелизации команд) и модуль внеочередного выполнения команд.
Дальше в бой вступает ядерный бэкенд, где инструкции попадают в вычислительное сердце ЦП — арифметико‑логическое устройство (ALU). Одно ALU может выполнять одну или несколько операций смещения или перехода, арифметических или логических операций, а иногда и целые выражения (FMA, DIV, MUL). Также ALU может работать с целыми числами (приставка INT), с десятичными (FPU или приставка FP) и с числами разных размеров (FP32, FP64, ...).
Представляешь, какое количество разношерстных ALU должно уместиться в одно маленькое ядро? Но в ядре есть еще и разные уровни памяти, а также дорожки коммуникации между всем этим добром.
Поскольку ЦП должен раз за разом выполнять любые инструкции, то его ядра большие и универсальные: с громоздким фронтендом и ALU всех типов. Площадь на кристалле ограничена, поэтому число таких ядер тоже ограничено.
или Зарегистрируйся
В 1984 году компания IBM выпустила PGC, который состоял из трех отдельных плат, каждая — со своим чипом и памятью. По сути, это был первый GPU. А разработчики компьютера Amiga 1000 в 1985 году полностью сняли с ЦП вычисление графики. Впервые термин GPU появился только в 1994 году в документации к первой PlayStation, а популяризировала термин Nvidia, выпустив GeForce 256, которая считается первым GPU, каким мы его знаем сегодня. То есть современный GPU — это довольно молодое изобретение.
В общем, ЦП способен считать графику, но ГП делает это быстрее и эффективнее, давая ЦП больше времени заниматься другими задачами.
ГП бывает интегрированным (iGPU) и дискретным (dGPU). iGPU занимает примерно 40% всего чипа ЦП и делит с ядрами общие память, питание и охлаждение.
Все ЦП производства Intel без суффикса F имеют iGPU, у AMD все более запутанно, но это лишний раз указывает нам на то, что большая часть чипа ЦП занята совсем не ядрами. dGPU находится на видеокарте, имеет свою память, которая быстрее, чем у ЦП, свое питание и охлаждение.
Важно понять, что GPU не выполняет работу CPU, а выступает сопроцессором. При получении задачи ЦП делегирует ее на внешний для себя GPU, при этом продолжая контролировать ее исполнение.
Представь: прораб может сам сделать ремонт, а может нанять маляра и электрика, чтобы они выполнили специализированные задачи качественнее и быстрее. Именно в силу таких соображений в GPU нет многоуровневого кеша и шин связи с другими устройствами, а фронтенд его ядра не имеет предсказателей ветвления, как и самого ветвления, модулей внеочередного выполнения команд и многих других вещей, ведь за них продолжает отвечать ЦП.
Ядро GPU маленькое и простое: легкий фронтенд, ALU, выполняющие только арифметические и логические команды, что значительно сокращает их номенклатуру, и плата без характерных для ЦП элементов, поэтому количество ядер в GPU может достигать десятков тысяч.
Чтобы добавить контекста, возьмем двух ровесников: CPU AMD Ryzen 5 7600 (начало 2023 года) и GPU Nvidia GeForce RTX 4090 (конец 2022-го). У ЦП размер одного ядра примерно 3,8 мм2, что при шести ядрах дает 22,8 мм2 площади под вычисления.
У ГП же размер ядра около 0,003 мм2 при общем количестве CUDA-ядер 16 384. Это дает нам 49,2 мм2 площади кристалла. Даже закрыв глаза на двукратную разницу в общей площади, отведенной под ядра, представь, что в одном ядре ЦП поместилось бы 1267 ядер ГП!
И нельзя не сказать, что ядра, о которых мы здесь говорим, называются «шейдерными», они классические для GPU. В погоне за развитием технологий производители позже стали добавлять в GPU еще «тензорные» ядра, адаптированные под операции с матрицами в ИИ, «текстурные» (TMU), которые помогают масштабировать объекты в 3D-пространстве, и «ядра для трассировки лучей» (RT), отвечающие за повышенный FPS в играх. Но нам это не важно.
Для просмотра ссылки Войдиили Зарегистрируйся
Подходящая для GPU задача должна состоять из последовательности арифметических операций с большим объемом независимых данных. Задачи с сильным ветвлением или зависящие от сложной логики гораздо эффективнее выполнять на ЦП. Считать на ГП один хеш было бы неэффективно, а вот тысячи или миллионы он посчитает куда лучше, чем ЦП.
Но никто не запрещает нам задействовать сильные стороны ЦП и ГП — готовить данные на CPU, а на GPU выполнять сами арифметические операции, ведь для каждого хеша они будут считаться независимо. При таком разделении труда мы получаем кратное увеличение производительности. Осталось только найти способ заставить ЦП и ГП делать ровно то, что мы от них хотим.
GPGPU (general-purpose computing on graphics processing units, неспециализированные вычисления на графических процессорах) — это метод ускоренных вычислений с переложением части вычислительных операций задачи с CPU на GPU. При этом ГП остается ГП, а GPGPU — это софтверная концепция. Термин GPGPU покрывает любые вычисления на GPU, не предназначенные для обсчета графики.
В начале 2000-х игровая индустрия стремилась привнести реализма в игровую графику, поэтому в 2001 году на картах Nvidia GeForce 3 появились первые программируемые шейдеры. Любознательный студент из Стэнфорда Ян Бак со своими друзьями задумался, можно ли применить это новшество и для других задач. После долгих поисков им удалось заставить ГП перемножать матрицы, что было намного быстрее, чем решать задачи линейной алгебры на ЦП.
или Зарегистрируйся).
Сложность была в том, что для выполнения общей задачи на ГП ее сначала требовалось перевести в векторную форму, а затем задействовать набор команд GPU, реализуемый через API DirectX или OрenGL. Все это требовало знаний не только профильной дисциплины, но и разных аспектов 3D-моделирования, что, мягко говоря, встречается редко, да и просто неудобно.
В результате Бак и его команда в 2004 году разработали компилятор Brook (Для просмотра ссылки Войдиили Зарегистрируйся), который стал этаким переводчиком общих задач на язык трехмерного программирования. Появление Brook обратило внимание компаний на зарождающуюся область, и, по невероятному стечению обстоятельств, Ян Бак пришел на работу в Nvidia, которая в 2006 году выпустила программно‑аппаратную архитектуру параллельных вычислений CUDA (compute unified device architecture).
CUDA упрощает дело еще сильнее. Она не только включает готовые библиотеки для работы с ГП, но и подразумевает поддержку GPGPU на аппаратном уровне. В противовес проприетарной CUDA консорциум Khronos Group выпустил в 2008 году открытую спецификацию OpenCL, разработанную Apple.
Существуют и другие фреймворки, например OpenACC или AMD APP, но их используют редко. На сегодняшний день программе, которая вычисляет на GPU, необходимо реализовывать либо вызовы CUDA для карт Nvidia, либо вызовы OpenCL на картах других производителей. Последние карты Nvidia, кстати, поддерживают и OpenCL тоже.
Это, собственно говоря, и объясняет, почему VRAM быстрее, чем RAM. Хотя здесь все уже зависит от применения. Да, VRAM быстрее, но при атаках по словарю или по радужным таблицам весь массив данных будет загружен именно в RAM, к тому же RAM хранит частичную копию VRAM для удобства ЦП, а вдобавок еще и всю остальную систему.
То есть видеопамять нужна только для тех данных, которые сейчас вычисляет ГП, и просто от увеличения ее количества никакого прироста в скорости работы мы не увидим. Возьмем за правило, что RAM нам понадобится как минимум столько же, сколько VRAM, а лучше — больше, желательно в полтора‑два раза. Например, для GeForce RTX 5090 с 32 Гбайт VRAM нам потребуется компьютер с 32 или 64 Гбайт RAM.
Теперь самое сложное — какой GPU выбрать? Ответ не столь однозначный. В целом и обычный ноутбук с iGPU, если он поддерживает технологию GPGPU, позволит попробовать себя в хешкрекинге. Но лучше все же иметь дискретную видеокарту, если ты хочешь действительно добиться успеха.
Причина — в той самой видеопамяти, а также в том, что dGPU имеет свою систему питания и охлаждения, что позволяет контролировать нагрев независимо от других компонентов компьютера. В конце концов, iGPU может позволить себе меньше ядер, чем dGPU. Например, Intel Core 7 251E поставляется с iGPU Intel UHD Graphics 770 с 256 шейдерными ядрами, тогда как у dGPU NVIDIA GeForce RTX 5090 аж 21 760 шейдерных ядер, хотя оба продукта выпущены в первом квартале 2025-го. Причина — все та же нехватка места.
ASIC — это чип, который выполняет строго определенные операции, например дважды пропускает сообщение через SHA-256, как в случае с Bitcoin ASIC, но кроме этого они ничего делать не могут.
FPGA конфигурируют под конкретную задачу, но эта настройка легко меняется.
Итого ASIC и FPGA могут выполнять только конкретную задачу, GPU — любую; ASIC очень дорогой, поскольку производится в малых объемах, FPGA дешев, а GPU где‑то между ними; ASIC работает «из коробки», FPGA требует знаний программирования, а GPU как может работать «из коробки», так и поддается частичному программированию.
CPU при этом самый недооцененный компонент хешкрекинга — о нем забывают на фоне всей суматохи вокруг GPU. Дело в том, что многие процессы продолжают выполняться ЦП. Например, при атаках по словарю ЦП обрабатывает словарь, применяет правила, организует передачу данных в GPU, а в конце сравнивает результат.
Но вопрос не в том, нужно ли больше ядер или тактовой частоты (скорости), — и то и то важно до определенной степени. Представь: для переезда нужны помощники. Если ты подрядишь с десяток дошкольников тащить шкаф, то они это будут делать целый день, тогда как ребята из соседней качалки — слишком круто для погрузки одежды.
Во всем нужен баланс, поэтому если ты планируешь заняться хешкрекингом, то тебе потребуется современный CPU в среднем ценовом диапазоне. Рекомендую иметь как минимум одно ядро CPU на один GPU, при условии, что у нас есть еще одно‑два ядра в запасе для выполнения других задач ОС. Поэтому, если у нас, например, четыре видеокарты Nvidia GeForce RTX 5090, наш ЦП должен быть пяти- или шестиядерным.
И здесь мы возвращаемся к нашей троице: ВМ получает виртуальные CPU, с которыми особых проблем не возникает, — каждая задача выполняется на отдельном ядре просто в рамках очереди основной ОС, а вот к GPU и памяти у ВМ доступа нет вовсе. Если гостевая ОС сможет записывать что‑то напрямую в память, то все сломается, так как адресами памяти распоряжается основная ОС, а гостевая понятия не имеет о том, как устроен маппинг выделенной ей оперативки к реальной.
Для прямого доступа к GPU можно использовать GPU API remoting, которая перехватывает команды GPGPU из ВМ на уровне основной ОС и распределяет их на реальный GPU, но здесь появляется ненужная задержка из‑за посредника. Как опцию можно предложить виртуальные GPU, но эта технология сделана для другого: она позволяет выделить часть ресурсов GPU для ВМ, но только часть. К тому же не все ВМ это поддерживают.
Самый многообещающий вариант — это GPU PassThrough. Этот механизм позволяет выделить целый GPU одной ВМ. Основная проблема в том, что хосту все равно нужно выполнять свои задачи, поэтому тебе понадобятся либо два GPU — один для основной, а другой для гостевой ОС, — либо dual boot, но тогда какой смысл?
Для последней опции также нужно, чтобы CPU поддерживал технологию IOMMU — единственное решение, которое даст доступ к памяти (VRAM и RAM) нашей ВМ.
Получается, что для прямого доступа к памяти нам требуется поддержка со стороны аппаратной части; для прямого доступа к GPU необходимо, чтобы технологию поддерживал используемый нами гипервизор. Плюс нужен еще один ГП, либо это уже будет не прямой доступ, а виртуальный или с задержкой через посредника; для прямого доступа к CPU у нас вообще нет вариантов, он в любом случае будет виртуальным (но работать будет, если все правильно настроить, как реальный).
Согласись, все это сложновато для начинающего хешкрекера и не очень обнадеживающе для продвинутого, а пользоваться всеми благами CPU, GPU и памяти нам хочется здесь и сейчас. Поэтому нам остается либо пользоваться имеющимся у нас ноутом без виртуальных машин, либо повернуться в сторону наиболее пряморуких облачных провайдеров VPS, которые как раз таки могут настроить и GPU PassThrough, и правильную комбинацию железа.
info
Я не ставлю перед собой цель точно и детально описать работу таких сложных систем, как центральный и графический процессоры или их ядра. Все описания упрощены, но без отхода от реальности. Короче, мы будем разбирать только те аспекты, которые помогут нам принимать решения при бруте хешей.Хешкрекинг (от английского hash cracking — буквально «раскалывание хешей») — это область криптоанализа (или информационной безопасности, смотря с какой стороны подойти), где цель — найти значение сообщения, которое было пропущено через хеш‑функцию. Для нас хешкрекинг актуален именно из‑за того, что самый распространенный способ хранения паролей именно в хешах. Поэтому его часто называют восстановлением паролей.
Сразу отметим, что хешкрекинг — это тема строго офлайновая, она никак не связана со спреингом паролей (password spraying) или брутфорсом (brute force) при атаках на системы аутентификации.
Для хешкрекинга нужно иметь некий хеш, для которого мы будем подбирать исходное значение. Вообще, сам термин вводит нас в заблуждение: в реальности никто хеши не раскалывает. Хеш‑функция необратима, и наша задача — перебирать потенциальные пароли и считать хеши от них, а потом сравнивать с тем хешем, что у нас есть.
Наши шансы крайне малы, но есть методы, которые помогут начать систематически выигрывать в этом бою. Но, как ни крути, нам придется вычислять хеши, сотни или даже сотни тысяч хешей.
В девяностые и начале нулевых никому бы и в голову не пришло спорить о том, что является вычислительным сердцем компьютера, ответ был бы очевиден — центральный процессор (он же ЦП или CPU). Но сегодня все не так однозначно: графические процессоры (ГП или GPU) стали такими мощными, что в некоторых задачах ЦП уже сложно конкурировать.
Как работает CPU?
Современный ЦП — это кремниевая пластина, на которой в первую очередь размещаются вычислительные ядра, а остальное пространство отдано под многоуровневую кеш‑память, модули безопасности (они следят, чтобы разные ядра не занимались одним и тем же и не перегревались) и шины соединения с периферийными устройствами.Здесь важно понять, что ЦП — это просто машина для выполнения написанных людьми инструкций. Сам он не знает, что делает, и в конечном итоге просто переключает состояние ячеек по сложным правилам. При этом немалая часть чипа занята не конкретно вычислениями, а их администрированием.
Внутри ядра процессы подчинены архитектуре фон Неймана: извлечение из памяти → декодирование → выполнение → запись в память. За первые два этапа отвечает фронтенд ядра (он, помимо прочего, содержит еще и модули ветвления и параллелизации команд) и модуль внеочередного выполнения команд.
Дальше в бой вступает ядерный бэкенд, где инструкции попадают в вычислительное сердце ЦП — арифметико‑логическое устройство (ALU). Одно ALU может выполнять одну или несколько операций смещения или перехода, арифметических или логических операций, а иногда и целые выражения (FMA, DIV, MUL). Также ALU может работать с целыми числами (приставка INT), с десятичными (FPU или приставка FP) и с числами разных размеров (FP32, FP64, ...).
Представляешь, какое количество разношерстных ALU должно уместиться в одно маленькое ядро? Но в ядре есть еще и разные уровни памяти, а также дорожки коммуникации между всем этим добром.
Поскольку ЦП должен раз за разом выполнять любые инструкции, то его ядра большие и универсальные: с громоздким фронтендом и ALU всех типов. Площадь на кристалле ограничена, поэтому число таких ядер тоже ограничено.
Почему не делают большие CPU
Резонный вопрос: почему бы не сделать CPU большего размера?- Во‑первых, ЦП — это монолитный блок. Чипы производятся на пластинах диаметром ~30 см, у которых всегда есть дефекты. Цена ошибки довольно высока: иногда приходится выбрасывать весь чип. Поэтому чем больше чипов мы сможем разместить на пластине, тем больше у нас останется качественных изделий. Ничего личного, просто бизнес.
- Во‑вторых, обычному пользователю более чем достаточно текущих мощностей, поэтому смысла вкладываться в разработку кардинально новой архитектуры нет (для желающих существуют ЦП более чем со 100 ядрами, но они, очевидно, сильно дороже).
- Наконец, больший чип означает большее расстояние и большее сопротивление для сигнала, что влияет на скорость и ограничивает тактовую частоту, не говоря уже о тепле, которое нужно отводить.
Великий и могучий GPU
Компьютеры продолжали бы весело молотить числа на своих процессорах, но в семидесятые начали появляться дисплеи для вывода графики. Просчет геометрии сначала выполняли полностью на ЦП, но постепенно он становился узким горлышком при работе с графикой. Поэтому стали появляться отдельные чипы для ускорения 2D- и 3D-графики.В 1984 году компания IBM выпустила PGC, который состоял из трех отдельных плат, каждая — со своим чипом и памятью. По сути, это был первый GPU. А разработчики компьютера Amiga 1000 в 1985 году полностью сняли с ЦП вычисление графики. Впервые термин GPU появился только в 1994 году в документации к первой PlayStation, а популяризировала термин Nvidia, выпустив GeForce 256, которая считается первым GPU, каким мы его знаем сегодня. То есть современный GPU — это довольно молодое изобретение.
В общем, ЦП способен считать графику, но ГП делает это быстрее и эффективнее, давая ЦП больше времени заниматься другими задачами.
О GPU
Давай внесем ясность: графический процессор (ГП или GPU) — не то же самое, что и видеокарта. Так же как ЦП — не то же самое, что и материнская плата. Поэтому говорить мы будем именно о ГП, чтобы сравнение с ЦП было корректным.ГП бывает интегрированным (iGPU) и дискретным (dGPU). iGPU занимает примерно 40% всего чипа ЦП и делит с ядрами общие память, питание и охлаждение.
Все ЦП производства Intel без суффикса F имеют iGPU, у AMD все более запутанно, но это лишний раз указывает нам на то, что большая часть чипа ЦП занята совсем не ядрами. dGPU находится на видеокарте, имеет свою память, которая быстрее, чем у ЦП, свое питание и охлаждение.
Важно понять, что GPU не выполняет работу CPU, а выступает сопроцессором. При получении задачи ЦП делегирует ее на внешний для себя GPU, при этом продолжая контролировать ее исполнение.
Представь: прораб может сам сделать ремонт, а может нанять маляра и электрика, чтобы они выполнили специализированные задачи качественнее и быстрее. Именно в силу таких соображений в GPU нет многоуровневого кеша и шин связи с другими устройствами, а фронтенд его ядра не имеет предсказателей ветвления, как и самого ветвления, модулей внеочередного выполнения команд и многих других вещей, ведь за них продолжает отвечать ЦП.
Ядро GPU маленькое и простое: легкий фронтенд, ALU, выполняющие только арифметические и логические команды, что значительно сокращает их номенклатуру, и плата без характерных для ЦП элементов, поэтому количество ядер в GPU может достигать десятков тысяч.
Чтобы добавить контекста, возьмем двух ровесников: CPU AMD Ryzen 5 7600 (начало 2023 года) и GPU Nvidia GeForce RTX 4090 (конец 2022-го). У ЦП размер одного ядра примерно 3,8 мм2, что при шести ядрах дает 22,8 мм2 площади под вычисления.
У ГП же размер ядра около 0,003 мм2 при общем количестве CUDA-ядер 16 384. Это дает нам 49,2 мм2 площади кристалла. Даже закрыв глаза на двукратную разницу в общей площади, отведенной под ядра, представь, что в одном ядре ЦП поместилось бы 1267 ядер ГП!
Ядра
Давай разберемся с понятием ядра. В картах Nvidia они называются CUDA, у Apple — Execution Units, у AMD — Streaming Processors, на немаркетинговом английском просто cores. Nvidia заявляет о наличии десятков тысяч ядер в своих картах, а, например, Apple говорит всего о десятках. Здесь Nvidia учитывает сами конечные ядра, а Apple делает финт ушами и говорит о секциях с ядрами, что в неокрепших умах создает представление о 100-кратном превосходстве чипов Apple над Nvidia, что в корне неверно.И нельзя не сказать, что ядра, о которых мы здесь говорим, называются «шейдерными», они классические для GPU. В погоне за развитием технологий производители позже стали добавлять в GPU еще «тензорные» ядра, адаптированные под операции с матрицами в ИИ, «текстурные» (TMU), которые помогают масштабировать объекты в 3D-пространстве, и «ядра для трассировки лучей» (RT), отвечающие за повышенный FPS в играх. Но нам это не важно.
Для просмотра ссылки Войди
При чем здесь хеши?
Хеш‑функция, грубо говоря, состоит из функции сжатия, которая позволяет принимать на вход сообщение произвольной длины, и арифметико‑логических раундов, которые запутывают сжатое сообщение. Если ты знаком с криптографией, то знаешь, что большинство классических хеш‑функций последовательны, то есть каждое следующее действие зависит от результата предыдущего. Но не все хеш‑функции таковы, некоторые созданы специально для параллельного вычисления, а у других можно распараллелить отдельные этапы — сжатие или раунды.Подходящая для GPU задача должна состоять из последовательности арифметических операций с большим объемом независимых данных. Задачи с сильным ветвлением или зависящие от сложной логики гораздо эффективнее выполнять на ЦП. Считать на ГП один хеш было бы неэффективно, а вот тысячи или миллионы он посчитает куда лучше, чем ЦП.
Но никто не запрещает нам задействовать сильные стороны ЦП и ГП — готовить данные на CPU, а на GPU выполнять сами арифметические операции, ведь для каждого хеша они будут считаться независимо. При таком разделении труда мы получаем кратное увеличение производительности. Осталось только найти способ заставить ЦП и ГП делать ровно то, что мы от них хотим.
Когда используется CPU, а когда GPU?
Распределением задач, как ты знаешь, занимается ОС, но операционка — это всего лишь обертка, которая не вдается в суть вещей, ей тоже нужно подсказать, куда направить задачу. Делается это с помощью API-вызовов. А их должна делать программа, которую запускает пользователь.GPGPU (general-purpose computing on graphics processing units, неспециализированные вычисления на графических процессорах) — это метод ускоренных вычислений с переложением части вычислительных операций задачи с CPU на GPU. При этом ГП остается ГП, а GPGPU — это софтверная концепция. Термин GPGPU покрывает любые вычисления на GPU, не предназначенные для обсчета графики.
В начале 2000-х игровая индустрия стремилась привнести реализма в игровую графику, поэтому в 2001 году на картах Nvidia GeForce 3 появились первые программируемые шейдеры. Любознательный студент из Стэнфорда Ян Бак со своими друзьями задумался, можно ли применить это новшество и для других задач. После долгих поисков им удалось заставить ГП перемножать матрицы, что было намного быстрее, чем решать задачи линейной алгебры на ЦП.
www
Подробности ты найдешь в работе Ray tracing on programmable graphics hardware (Для просмотра ссылки ВойдиСложность была в том, что для выполнения общей задачи на ГП ее сначала требовалось перевести в векторную форму, а затем задействовать набор команд GPU, реализуемый через API DirectX или OрenGL. Все это требовало знаний не только профильной дисциплины, но и разных аспектов 3D-моделирования, что, мягко говоря, встречается редко, да и просто неудобно.
В результате Бак и его команда в 2004 году разработали компилятор Brook (Для просмотра ссылки Войди
CUDA упрощает дело еще сильнее. Она не только включает готовые библиотеки для работы с ГП, но и подразумевает поддержку GPGPU на аппаратном уровне. В противовес проприетарной CUDA консорциум Khronos Group выпустил в 2008 году открытую спецификацию OpenCL, разработанную Apple.
Существуют и другие фреймворки, например OpenACC или AMD APP, но их используют редко. На сегодняшний день программе, которая вычисляет на GPU, необходимо реализовывать либо вызовы CUDA для карт Nvidia, либо вызовы OpenCL на картах других производителей. Последние карты Nvidia, кстати, поддерживают и OpenCL тоже.
info
В 2018 году (с выходом macOS Mojave) в Apple перестали активно поддерживать OpenCL в своих устройствах. Теперь, чтобы программировать на GPU, нужно пользоваться Metal API. Вот так, даже не дождались совершеннолетия своего детища.Все в сборе: CPU, GPU и память
Давай начнем с памяти, о ней мы еще сегодня не говорили. Речь пойдет и о RAM, обычной оперативке, которой пользуется ЦП и iGPU, и о VRAM (Video RAM) у dGPU. VRAM доступна только ГП, находится с ним на одной видеокарте и имеет прямое соединение, тогда как RAM в традиционном варианте подключена к микросхемам материнской платы, а не к ЦП напрямую.Это, собственно говоря, и объясняет, почему VRAM быстрее, чем RAM. Хотя здесь все уже зависит от применения. Да, VRAM быстрее, но при атаках по словарю или по радужным таблицам весь массив данных будет загружен именно в RAM, к тому же RAM хранит частичную копию VRAM для удобства ЦП, а вдобавок еще и всю остальную систему.
То есть видеопамять нужна только для тех данных, которые сейчас вычисляет ГП, и просто от увеличения ее количества никакого прироста в скорости работы мы не увидим. Возьмем за правило, что RAM нам понадобится как минимум столько же, сколько VRAM, а лучше — больше, желательно в полтора‑два раза. Например, для GeForce RTX 5090 с 32 Гбайт VRAM нам потребуется компьютер с 32 или 64 Гбайт RAM.
Теперь самое сложное — какой GPU выбрать? Ответ не столь однозначный. В целом и обычный ноутбук с iGPU, если он поддерживает технологию GPGPU, позволит попробовать себя в хешкрекинге. Но лучше все же иметь дискретную видеокарту, если ты хочешь действительно добиться успеха.
Причина — в той самой видеопамяти, а также в том, что dGPU имеет свою систему питания и охлаждения, что позволяет контролировать нагрев независимо от других компонентов компьютера. В конце концов, iGPU может позволить себе меньше ядер, чем dGPU. Например, Intel Core 7 251E поставляется с iGPU Intel UHD Graphics 770 с 256 шейдерными ядрами, тогда как у dGPU NVIDIA GeForce RTX 5090 аж 21 760 шейдерных ядер, хотя оба продукта выпущены в первом квартале 2025-го. Причина — все та же нехватка места.
ASIC
Строго говоря, для подсчета хешей есть еще более специализированные инструменты. Ты наверняка слышал про ASIC (интегральные схемы специального назначения), которыми майнят Bitcoin, и про FPGA — программируемые пользователем вентильные матрицы.ASIC — это чип, который выполняет строго определенные операции, например дважды пропускает сообщение через SHA-256, как в случае с Bitcoin ASIC, но кроме этого они ничего делать не могут.
FPGA конфигурируют под конкретную задачу, но эта настройка легко меняется.
Итого ASIC и FPGA могут выполнять только конкретную задачу, GPU — любую; ASIC очень дорогой, поскольку производится в малых объемах, FPGA дешев, а GPU где‑то между ними; ASIC работает «из коробки», FPGA требует знаний программирования, а GPU как может работать «из коробки», так и поддается частичному программированию.
CPU при этом самый недооцененный компонент хешкрекинга — о нем забывают на фоне всей суматохи вокруг GPU. Дело в том, что многие процессы продолжают выполняться ЦП. Например, при атаках по словарю ЦП обрабатывает словарь, применяет правила, организует передачу данных в GPU, а в конце сравнивает результат.
Но вопрос не в том, нужно ли больше ядер или тактовой частоты (скорости), — и то и то важно до определенной степени. Представь: для переезда нужны помощники. Если ты подрядишь с десяток дошкольников тащить шкаф, то они это будут делать целый день, тогда как ребята из соседней качалки — слишком круто для погрузки одежды.
Во всем нужен баланс, поэтому если ты планируешь заняться хешкрекингом, то тебе потребуется современный CPU в среднем ценовом диапазоне. Рекомендую иметь как минимум одно ядро CPU на один GPU, при условии, что у нас есть еще одно‑два ядра в запасе для выполнения других задач ОС. Поэтому, если у нас, например, четыре видеокарты Nvidia GeForce RTX 5090, наш ЦП должен быть пяти- или шестиядерным.
Виртуальные машины
Сегодня невозможно представить себе ИБ без виртуальных машин. Если кратко, то использовать их для хешкрекинга не стоит. Если длинно, то... Эффективное выполнение задач хешкрекинга требует прямого доступа к железу, но в ВМ такого доступа быть не может! Основная ОС хоста только выделяет им часть ресурсов.И здесь мы возвращаемся к нашей троице: ВМ получает виртуальные CPU, с которыми особых проблем не возникает, — каждая задача выполняется на отдельном ядре просто в рамках очереди основной ОС, а вот к GPU и памяти у ВМ доступа нет вовсе. Если гостевая ОС сможет записывать что‑то напрямую в память, то все сломается, так как адресами памяти распоряжается основная ОС, а гостевая понятия не имеет о том, как устроен маппинг выделенной ей оперативки к реальной.
Для прямого доступа к GPU можно использовать GPU API remoting, которая перехватывает команды GPGPU из ВМ на уровне основной ОС и распределяет их на реальный GPU, но здесь появляется ненужная задержка из‑за посредника. Как опцию можно предложить виртуальные GPU, но эта технология сделана для другого: она позволяет выделить часть ресурсов GPU для ВМ, но только часть. К тому же не все ВМ это поддерживают.
Самый многообещающий вариант — это GPU PassThrough. Этот механизм позволяет выделить целый GPU одной ВМ. Основная проблема в том, что хосту все равно нужно выполнять свои задачи, поэтому тебе понадобятся либо два GPU — один для основной, а другой для гостевой ОС, — либо dual boot, но тогда какой смысл?
Для последней опции также нужно, чтобы CPU поддерживал технологию IOMMU — единственное решение, которое даст доступ к памяти (VRAM и RAM) нашей ВМ.
Получается, что для прямого доступа к памяти нам требуется поддержка со стороны аппаратной части; для прямого доступа к GPU необходимо, чтобы технологию поддерживал используемый нами гипервизор. Плюс нужен еще один ГП, либо это уже будет не прямой доступ, а виртуальный или с задержкой через посредника; для прямого доступа к CPU у нас вообще нет вариантов, он в любом случае будет виртуальным (но работать будет, если все правильно настроить, как реальный).
Согласись, все это сложновато для начинающего хешкрекера и не очень обнадеживающе для продвинутого, а пользоваться всеми благами CPU, GPU и памяти нам хочется здесь и сейчас. Поэтому нам остается либо пользоваться имеющимся у нас ноутом без виртуальных машин, либо повернуться в сторону наиболее пряморуких облачных провайдеров VPS, которые как раз таки могут настроить и GPU PassThrough, и правильную комбинацию железа.
