Ключевые слова: криптография, блочный шифр, параллельные вычисления, Cuda, NVIDIA, GPGP, криптостойкость.
С появлением новых криптографических шифров и исследованием и анализом старых наиболее важным вопросом является стойкость алгоритма – способность шифра противостоять криптоанализу[1]. К стойким алгоритмам можно отнести такие алгоритмы, для вычисления ключа которых требуются либо недостижимые ресурсы, либо большое количество перехваченных сообщений, либо такое время вычисления, при котором полученная информация уже будет неактуальной.
Какие существуют методы проверки стойкости алгоритмов? Основными из них являются:
Атака на основе открытых и шифртекстов;
Атака на основе подобранного открытого текста;
Атаки на основе подобранного ключа;
«Бандитский» криптоанализ, основанный на человеческом факторе[2].
Все вышеперечисленные методы в основном несут в себе большое количество одинаковых операций с разными наборами данных. В этом могут помочь технологии параллельных вычислений, в частности технология NVIDIA CUDA.
Cuda представляет собой программно-аппаратную архитектуру, призванную увеличить производительность вычислений при помощи использования графических процессоров NVIDIA. В основе ее архитектуры лежит язык программирования С с небольшими видоизменениями. Данная технология применятся в тех случаях, когда есть необходимость в параллельном выполнении одинаковых операций (вычислений)[3].
Общую схему работы параллельных вычислений можно увидеть на Рисунке 1[4].
Рисунок 1. Общая схема параллельного вычисления
Рассмотрим, как будут выглядеть такие программы на примерах кода.
При использовании технологии CUDA код разделяется на тот, что выполняется на CPU, и тот, то выполняется на GPU. Для того, чтобы отметить эти функции, существует несколько ключевых слов:
__host__ - функция вызывается и выполняется на CPU;
__global__ - функция вызывается на CPU, выполняется на GPU;
__device__ - функция вызывается и выполняется на GPU.
Непосредственно распараллеливание производится при работе с функциями типа __global__, при вызове которых указывается количество блоков и потоков в блоке, а внутри для навигации по параллельным структурам используются идентификатор блока (blockIdx.x), идентификатор потока (threadIdx.x) и стандартная переменная, означающая количество потоков в блоке (blockDim.x).
Также при вызове функции __global__ необходимо выделить память под переменные с передаваемыми и возвращаемыми значениями, а также выделение под них памяти на карточке. Для это существует следующий набор функций: CudaMemCpy() – функция копирования данных, в которой четвертым аргументом идет направление копирования FromHostToDevice или FromDeviceToHost; cudaMalloc() и cudaFree() – функции для выделения и освобождения памяти на видеокарте[5].
Насколько же оправданно использование параллельных вычислений? На малых объемах данных вычисления могут происходить дольше, чем на процессоре, а на больших – быстрее на порядок. При малом количестве обрабатываемой информации часто больше времени будет затрачиваться на копирование данных и выделение памяти, чем на сами вычисления. На больших же массивах данных вычисления, выполняемые параллельно, могут превосходить процессорные вычисления на несколько порядков. Это объясняется бо́льшим количеством ядер на видеокарте, и, как следствие, бо́льшим количеством одновременно выполняемых вычислений[6]. Сравнение архитектур CPU и GPU приведено на Рисунке 2.
Рисунок 2. Сравнение количества ядер CPU и GPU
Не стоит также забывать о том, что память видеокарты ограничена, и нельзя копировать больше массивы данных туда единовременно. Также существует своеобразное ограничение: при выполнении операции на карте более 1.5 секунд, драйвер считает карту зависшей и перезапускается. Поэтому большие массивы данных требуется обрабатывать за несколько вызовов.
Список использованных источников.
БАБЕНКО Л.К., Ищукова Е.А. «Современные алгоритмы шифрования и методы их анализа». Учебное пособие - Москва, «Гелиос АРВ», 2006 г.
БАБЕНКО Л.К., Ищукова Е.А. «Современные алгоритмы шифрования и методы их анализа». Учебное пособие - Москва, «Гелиос АРВ», 2006 г.
Параллельные вычисления Cuda | Что такое Cuda | NVIDIA. [Электронный ресурс] URL: http://www.nvidia.ru/object/cuda-parallel-computing-ru.html Дата обращения: 15.10.2015
Бабенко Л.К. Ищукова Е.А. Сидоров И.Д. Параллельные алгоритмы для решения задач защиты информации. - М.: Горячая линия Телеком, 2014. - 304 с.
Примеры использования CUDA. [Электронный ресурс] URL: http://sporgalka.blogspot.ru/2011/10/cuda.html Дата обращения: 16.10.2015
Cuda: аспекты производительности при решении задач. [Электронный ресурс] URL: http://habrahabr.ru/post/119435/ Дата обращения: 18.10.2015