Proteja sus datos a la velocidad de la luz con gKrypt, Parte 1

Acelere el cifrado de su aplicación con el motor gKrypt activado por GPU

Conozca el motor gKrypt, el primer paquete en el mundo que utiliza unidades gráficas con propósitos generales (GPGPU) para el cifrado de datos, una herramienta importante para la seguridad de la información. Utiliza un Advanced Encryption Standard (AES) basado en un cifrado de bloques de 256 bits para ofrecer una seguridad sólida. En esta primera parte de esta serie de dos partes, exploraremos el AES, el puerto de GPU del algoritmo Rijndael para Linux®, la paralelización del algoritmo de AES y el uso de la Arquitectura de Dispositivos de Cómputo Unificado (CUDA) compatible con el motor gKrypt para las GPU basadas en NVIDIA.

Jawad Masood, Ingeniero líder, gKrypt Data Security Solutions

Jawad Masood es el desarrollador líder de gKrypt Data Security Solutions, una empresa emergente que se especializa en ofrecer soluciones rentables de seguridad de datos mediante una combinación de procesadores de varios núcleos y de núcleos múltiples para brindar un cifrado masivo de datos acelerado y un rendimiento en la compresión.



12-11-2012

Introducción

En el mundo actual, las personas y las instituciones almacenan casi todos los tipos de información, la procesan de manera electrónica y la transmiten con frecuencia mediante redes locales o Internet. Como resultado, el riesgo de que alguien acceda sin autorización a esa información ha aumentado en gran medida, por lo que también han crecido los desafíos para la seguridad de información. El acceso sin autorización a transmisiones interceptadas puede comprometer la información financiera y personal confidencial de personas y organizaciones, lo que provoca una grave infracción de seguridad. En el ámbito de los negocios, una infracción implica generalmente enormes multas financieras, costosas demandas judiciales y pérdida de la reputación y negocios. En cuanto a las personas, una infracción puede provocar un robo de identidad y afectar el historial financiero o la clasificación crediticia. La recuperación de estas infracciones de información puede llevarle años, además de ser muy costosa. El cifrado es una solución eficaz para proteger la información vital y confidencial de personas y organizaciones de las infracciones de seguridad; esto lo convierte en un elemento fundamental en los sistemas de seguridad de datos.

La tecnología de cifrado masivo proporciona un método para cifrar grandes cantidades de datos durante la transmisión o el almacenamiento. Sin embargo, en los últimos años, el crecimiento de la cantidad de información confidencial que debe cifrarse de manera simultánea ha superado el crecimiento de la potencia de computación de las CPU. Actualmente los requisitos de la potencia de procesamiento para el cifrado masivo se cumplen mediante soluciones de hardware especializadas, como los aceleradores criptográficos (consulte la sección Recursos). Muchos de los algoritmos de cifrado como el Estándar de cifrado de datos (DES) y el Estándar de cifrado avanzado (AES) cuentan con un alto nivel inherente de paralelismo de datos y de densidad de computación, lo que les permite realizar implementaciones paralelas en GPU y reemplazar eficazmente las soluciones criptográficas de hardware dedicadas (consulte la sección Recursos).


Motor gKrypt

El motor gKrypt es un módulo criptográfico de vanguardia que ofrece una API simple para usar el Rijndael Advanced Encryption Standard con GPU (consulte la sección Recursos). Aprovecha el hardware en paralelo subyacente como las tarjetas gráficas y los procesadores de computación, para reducir la carga de trabajo del cifrado con una computación intensiva. La interfaz simple en C/C++ de gKrypt con enlaces para las interfaces Java™ y C# ofrece una gran ventaja a los desarrolladores que desean implementar una solución para GPU con conocimiento mínimos de los lenguajes en paralelo como CUDA y OpenCL.

El marco soporta GPU basadas en AMD y en NVIDIA, como también CPU con múltiples núcleos; esto facilita la adaptación a los beneficios de los procesadores en paralelo. La siguiente sección explica el enfoque subyacente con el desglose en paralelo del AES.


Algoritmo Advanced Encryption Standard (AES)

El Advanced Encryption Standard (AES) es el estándar de cifrado aprobado por el National Institute of Standards and Technology (NIST), basado en el cifrado Rijndael (consulte la sección Recursos). Rijndael es un cifrado de bloques de claves simétricas propuesto por los criptógrafos belgas Joan Daemen y Vincent Rijmen, para el proceso de selección del AES iniciado por el NIST(consulte la sección Recursos). Rijndael recibió la aprobación del NIST como el Advanced Encryption Standard (AES) en noviembre de 2001, y reemplazó de manera eficaz al anticuado Data Encryption Standard (DES). El AES reúne tres cifrados de bloques con tamaños de claves de 128, 192 y 256 bits, cada una con los mismos bloques de datos de 128 bits. Por lo tanto, se denominan AES-128, AES-192 y AES-256, respectivamente.

El cifrado de bloques del AES funciona con una matriz bidimensional de bytes llamada el estado, indicada con la letra "s". El tamaño de la matriz de estado es de 16 bytes (128 bits), con una disposición de cuatro filas y cuatro columnas. Esto se representa como Nb = 4, que es básicamente la cantidad de columnas en una matriz de estado. Los tamaños de las claves compatibles con AES son 128, 192 y 256 bits, representados respectivamente como Nk = 4, 6 o 8. El AES aplica las transformaciones orientadas a bytes (comúnmente referidas como las transformaciones de AES) para cifrar o descifrar la matriz de estado. Estas transformaciones se aplican para una cantidad específica de rondas Nr, que depende del tamaño de la clave. Para las claves de 128, 192 y 256 bits, Nr = 10, 12 y 14, respectivamente.

La Figura 1 muestra varias fases del algoritmo del AES.

Figura 1. Fases del algoritmo del AES
Diagram of AES algorithm phases

Antes de comenzar con las transformaciones del AES, la clave de cifrado proporcionada por el usuario se expande mediante la programación de claves de Rijndael. El paso de expansión de claves, que se muestra en la Figura 1, implementa la programación de claves y proporciona una clave expandida para todas las rondas de las etapas posteriores. El tamaño de la clave expandida se calcula como Nb(Nr + 1), que es la cantidad de palabras de 32 bits (columnas). Una porción diferente de la clave expandida se usa en el paso AddRoundKey en cada ronda.

El primer paso en el proceso de cifrado del AES es la transformación AddRoundKey , donde cada byte del estado se combina con la clave de ronda que usa operaciones OR exclusivas (xor) bit a bit, como se define la ecuación en la Figura 2.

Figura 2. Primer paso en el proceso de cifrado del AES
Formula showing the first step of AES encryption process

Esto se demuestra en la Figura 3 a continuación. El estado, el nuevo estado y la clave de ronda están representados como matrices de 4 x 4, mientras que los bytes (128 bits) como Nb = 4. Los datos de bytes se muestran en la forma de palabras hexadecimales.

Figura 3. Transformación AddRoundKey
Diagram of the AddRoundKey transformation

En la próxima fase del AES, las cuatro transformaciones se aplican repetidamente Nr - 1 veces, comenzando con Nr = 1 hasta llegar a Nr - 1, en el orden que se muestra en la Figura 3. Explicaré cada una de estas transformaciones en el mismo orden que aparecen.

La transformación SubBytes es un paso de sustitución de bytes no linear, donde cada byte del estado se reemplaza de acuerdo con una tabla de búsqueda llamada S-Box. Cada byte del estado se reemplaza con una entrada de S-Box que tenga el mismo índice que el valor hexadecimal del byte que reemplazará. Figura 4 ilustra el proceso de manera más clara.

Figura 4. Transformación SubBytes
Diagram of the non-linear byte-substitution step

Aquí, el primer byte del estado tiene un valor hexadecimal. El valor de sustitución se determina por la intersección de la fila con el índice 1 y de la columna con el índice 9. De manera similar, el byte {be} se sustituirá con el byte de S-Box con un índice de fila b y el índice de columna e.

En la transformación ShiftRows , cada fila de la matriz de state se mueve de manera cíclica con un desplazamiento diferente, según las convenciones de la ecuación en la Figura 5.

Figura 5. Cada fila de la matriz de estado se mueve de manera cíclica con un desplazamiento diferente
Diagram showing each row of the state array as it shifts cyclically through a different offset

El valor del movimiento shift(r, Nb) depende del número de fila r, como se muestra en la ecuación en la Figura 6.

Figura 6. El valor del movimiento depende del número de fila
diagram of equation showing the shift value depends on the row number

Una vez que se resuelven estas ecuaciones para cada fila, se revela que la primera fila no se movió, mientras que los bytes de la segunda, tercera y cuarta fila se movieron hacia la izquierda con un desplazamiento de uno, dos y tres bytes, respectivamente. Figura 7 que se muestra a continuación explica la manera en que cada fila se movió junto con la nueva matriz de estado resultante.

Figura 7. Transformación ShiftRows
diagram of the ShiftRows transformation

Piense en el modelo de movimiento como bytes que se desplazan hacia posiciones inferiores en una fila y envían los bytes en las últimas posiciones nuevamente hacia la parte superior de la fila.

La transformación MixColumns trabaja con las columnas del estado y considera cada columna como un polinomio de cuatro términos en un campo finito (28). Por lo tanto, cada columna se multiplica como el módulo x4 + 1 por la ecuación polinómica con coeficiente, como se muestra en la Figura 8.

Figura 8. La ecuación polinómica con coeficiente
Diagram of the coefficient polynomial

Esto equivale a reemplazar cada columna del estado con la multiplicación de la matriz de esa columna con la matriz de coeficiente, como se muestra en la Figura 9.

Figura 9. Transformación MixColumns transformation
Diagram of the MixColumns transformation

Paralelización del algoritmo del AES para la arquitectura CUDA

Ahora cuenta con algunos conocimientos del algoritmo de cifrado del AES. Está listo para comenzar una implementación con el marco de la CUDA. En las siguientes secciones analizaré brevemente el marco de la CUDA, para luego continuar con un análisis detallado del enfoque de diseño y del mecanismo de implementación. Este es un trabajo de preparación para que pueda llevar a cabo un ejemplo en la segunda parte de esta serie.

La arquitectura CUDA

CUDA es una arquitectura de computación paralela, presentada en 2006, que desarrolló NVIDIA para acelerar el rendimiento de computación mediante el aprovechamiento de las GPU en NVIDIA (consulte la sección Recursos). Más de cien millones de GPU instaladas en el mercado soportan CUDA, de manera que las aplicaciones que se ejecutan con CUDA ya cuentan con una gran base de usuarios potenciales. Desde su lanzamiento, los desarrolladores han logrado una gran aceleración en diferentes aplicaciones, especialmente en aquellas relacionadas con el procesamiento de imágenes y la reproducción de videos en alta definición (consulte la Figura 10).

Figura 10. Modelo de subprocesos de CUDA
Diagram of the CUDA thread model with two serial code CPUs and two GPU parallel kernels

El concepto del modelo de programación con CUDA es generar cientos de subprocesos que funcionan como una aplicación Single Program Multiple Data (SPMD), cada uno trabaja con una pequeña porción de datos en paralelo. Dado que las GPU tienen más núcleos que las CPU (aunque el núcleo de una GPU es mucho más limitado que el de una CPU), son ideales para ejecutar miles de subprocesos en paralelo, con cada uno computando una pequeña porción de datos. Estos subprocesos se organizan en bloques y cuadrículas, los bloques son una colección de subprocesos y las cuadrículas son una colección de bloques. La arquitectura CUDA, con todas sus funciones y la jerarquía de memoria, es mucho más compleja, pero eso está fuera del alcance de este artículo.

Estrategia de diseño

Como se mencionó, el AES es un algoritmo de cifrado de bloques que trabaja con bloques de datos de 128 bits (estado) de manera independiente. Dado que el cifrado del AES realiza las mismas operaciones en cada bloque del estado sin depender de los otros (modo ECB), esto ofrece un nivel alto de paralelismo de datos. Implementé una estrategia de división y unión (fork-and-join) para explotar este paralelismo de nivel de datos en un cifrado de bloques del AES. En este enfoque, los diferentes bloques del estado se pueden cifrar en simultáneo, un bloque de estado por cada subproceso, lo que permite una capacidad de procesamiento más alta. A medida que aumenta el tamaño de los datos, también aumenta el nivel de paralelismo; esto es lo que hace más eficaces a las GPU para el cifrado masivo.

Figura 11 Muestra la división de trabajo Host-Device y describe la naturaleza de varios de los constituyentes del AES. Como puede ver, la única operación en serie del AES es la programación de claves que proporciona claves de ronda para las rondas del AES subsecuentes. Todas las transformaciones del AES operan en paralelo, dado que se aplican a cada bloque del estado de 128 bits de manera independiente. Por lo tanto, puede dividir el trabajo entre el procesador de Host de la CPU y el dispositivo de la GPU, para obtener la máxima capacidad de procesamiento de la implementación. Además, la programación de claves se realiza una vez en el dispositivo de la CPU y se transmite al dispositivo de la GPU como un argumento del kernel. El algoritmo del AES del núcleo, o sea las transformaciones del AES, se implementa usando la CUDA para aprovechar al máximo los recursos de computación en paralelo de la GPU.

Figura 11. División de trabajo Host-device
Diagram of the host-device work division

En la implementación que se trata en la segunda parte de esta serie, cada subproceso de la CUDA toma un bloque del estado (16 bytes) como dato de entrada y lo convierte en texto cifrado mediante la aplicación de las transformaciones del AES orientadas a bytes, durante una cantidad específica de rondas. De esta forma, el cifrado de un estado de 128 bits permanece en serie; sin embargo, se usan técnicas de optimización específicas para GPU, como desenredar bucles para optimizar el código. Cuando se accede a los datos de entrada y se escriben nuevamente los datos cifrados, se produce un desplazamiento de red de 16 bytes (un bloque del estado) por cada subproceso de la CUDA. Figura 12 muestra la división de trabajo entre los subprocesos y el modelo de asignación de subprocesos que seguirá esta implementación.

Figura 12. Asignación de subprocesos en la CUDA
Diagram of the CUDA thread assignment

Ejecución de subprocesos en el dispositivo de la CUDA

En teoría, la cantidad de tiempo necesario para cifrar 100 MB de datos debería ser igual a la cantidad de tiempo necesario para cifrar 128 bits, dado que todos los subprocesos se realizan de manera simultánea; sin embargo, este no es el caso. Como bien sabe, los subprocesos se encuentran agrupados en bloques que se ejecutan en el dispositivo de la CUDA. En la generación actual de la arquitectura CUDA, los recursos de ejecución (núcleos) se dividen en multiprocesadores de transmisión por secuencias (SM); cada SM puede ejecutar 112 bloques a la vez. (consulte la Figura 13. Si el dispositivo tiene 14 SM, como el Tesla C2050 con 32 núcleos cada uno, entonces se ejecutarán solo 16 bloques a la vez, siempre y cuando no exista otro factor de limitación. Si la cantidad de bloques es mayor que 16, entonces los restantes deberán esperar. Este es un ejemplo simple de la ejecución de subprocesos en un dispositivo. Existen muchos otros factores: la cantidad de hilvanaciones por SM, el uso de los registros por subproceso, la memoria compartida por bloque, y demás. Si desea obtener más información sobre la manera en que la CUDA asigna bloques de subprocesos a los SM, consulte el calculador de ocupación de la CUDA (consulte la sección Recursos).

Figura 13. Asignación de bloques de subprocesos para los multiprocesadores de transmisión por secuencias (SM)
Diagram of thread blocks assignment to streaming multiprocessors (SMs)

Una vez que se asigna un bloque de subprocesos a un multiprocesador de transmisión por secuencias, se fragmenta en hilvanaciones, cada una de ellas es un ensamblado de 32 subprocesos en la generación actual de la arquitectura CUDA en constante evolución. Si bien estas hilvanaciones tal vez no se ejecutan en paralelo, funcionan de una forma muy eficaz. Por ejemplo, si una hilvanación está esperando una transferencia de memoria, la siguiente realiza una ejecución de datos durante ese tiempo en el mismo núcleo. Si existe más de una hilvanación lista para ejecutarse, el controlador establece un mecanismo de prioridad entre ellas. A pesar de que la cantidad de núcleos puede ser menor a la cantidad de subprocesos que se iniciaron en un kernel, la arquitectura CUDA y el controlador comprueban que se utilizan todos los recursos de hardware para proporcionar el máximo rendimiento.


Configuración de la CUDA en Linux

El marco de la CUDA requiere de unidades de procesamiento de gráficos (GPU) basadas en NVIDA para aprovechar el hardware paralelo subyacente y generar rendimiento. El tiempo de ejecución de la CUDA viene con un controlador de video del desarrollador NVIDIA. Para usar una tarjeta gráfica compatible con CUDA, el primer paso es reconfigurar el controlador de video básico. Abra el terminal y ejecute el siguiente comando: $ sudo apt-get --purge remove nvidia*.

El próximo paso es denegar el acceso al nuevo controlador predeterminado que genera conflicto con el controlador del desarrollador de CUDA. Cree un archivo nuevo en /etc/modprobe.d y escriba lo que se muestra en el Listado 1.

Listado 1. Denegación de acceso al nuevo controlador predeterminado que genera conflicto con el controlador del desarrollador de CUDA

Haga clic para ver la lista de códigos

Listado 1. Denegación de acceso al nuevo controlador predeterminado que genera conflicto con el controlador del desarrollador de CUDA

# /etc/modprobe.d/blacklist-nouveau.conf blacklist nvidiafb blacklist nouveau blacklist rivafb blacklist rivatv blacklist vga16fb options nouveau modeset=0

Para actualizar el archivo del kernel, ejecute este comando: $ sudo update-initramfs -u

Luego, reinicie el sistema para permitir que la modificación tenga efecto. Una vez que se reinicia, podrá instalar el controlador del desarrollador de CUDA.

Instalación del controlador de CUDA

Puede descargar la versión oficial del controlador compatible con CUDA más reciente directamente desde el sitio web de NVIDA (consulte la sección Recursos). Debe desactivar el administrador de visualización de gráficos antes de comenzar con la instalación. Para cambiar al modo de consola, presione CTRL+ALT+F2. Ahora, inicie la instalación automática del archivo del controlador desde la consola: $ sudo sh devdriver_4.1_linux_32_285.05.32.run.

Una vez que se completó la instalación del controlador, simplemente reinicie el sistema y verifique que el servidor X se ejecuta desde el menú Administration y muestra las GPU instaladas.

Ahora puede ejecutar las técnicas de optimización que aparecen en la segunda parte de esta serie.


Conclusión

El motor gKrypt está integrado con archivos binarios de plataformas y con fragmentos de código que guían la integración con proyectos basados en C/C++. Es evidente que el uso correcto de los recursos del sistema es fundamental. El objetivo es utilizar los complementos optimizados que aumentarán el rendimiento de manera instantánea, sin sacrificar la compatibilidad ni la facilidad de uso. En la segunda parte, obtendrá detalles de las técnicas de optimización que resaltan algunas integraciones; además, se muestra un ejemplo en ejecución.

Recursos

Aprender

Obtener los productos y tecnologías

  • Evalúe el motor gKrypt para su aplicación.
  • Obtenga los controladores compatibles con CUDA más recientes de NVIDIA.
  • Descargue el CUDA Occupancy Calculator, que permite computar la ocupación de los multiprocesadores de una GPU con un kernel de CUDA específico.
  • Evaluate IBM products de la manera que le convenga: descargue una evaluación de producto, pruebe un producto online, úselo en un entorno de nube o pase algunas horas en SOA Sandbox aprendiendo a implementar con eficiencia la Arquitectura Orientada a Servicios.

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Linux
ArticleID=845308
ArticleTitle=Proteja sus datos a la velocidad de la luz con gKrypt, Parte 1
publish-date=11122012