Proteja seus dados à velocidade da luz com o gKrypt, Parte 1

Acelere a criptografia de seu aplicativo com o mecanismo gKrypt ativado por GPU

Apresentamos o mecanismo gKrypt, o primeiro pacote do mundo a empregar unidades gráficas para fins gerais (GPGPUs) na criptografia de dados, uma ferramenta importante para a segurança da informação. Ele utiliza um Padrão de Criptografia Avançado (AES) com base em cifra de blocos de 256 bits para fornecer uma segurança robusta. Nesta Parte 1, de uma série de duas partes, explore o AES, a porta de GPU do algoritmo Rijndael para Linux®, a paralelização do algoritmo do AES e o uso do Mecanismo gKrypt no suporte ao CUDA para GPUs com base em NVIDIA.

Jawad Masood, Lead Engineer, gKrypt Data Security Solutions

Photo of Jawad MasoodJawad Masood é o desenvolvedor líder na gKrypt Data Security Solutions, uma startup focada em fornecer soluções de segurança de dados com custo reduzido usando uma combinação de processadores de diversos núcleos para oferecer uma criptografia de dados em massa e desempenho de compactação acelerados.



30/Abr/2012

Introdução

Atualmente, as pessoas e as instituições armazenam quase todo tipo de informações, as processam eletronicamente e as transmitem frequentemente em redes locais ou na Internet. Como resultado, o risco do acesso não autorizado a essas informações aumentou radicalmente e os desafios para a segurança da informação cresceram. O acesso não autorizado a transmissões interceptadas pode comprometer informações pessoais e financeiras sensíveis de indivíduos e organizações, resultando em uma séria violação de segurança. Para os negócios, uma violação geralmente acarreta em enormes penalidades financeiras, processos jurídicos caros e uma perda da reputação e dos negócios. Para indivíduos, uma violação pode levar a furto de identidade e danos ao histórico financeiro ou a uma classificação de crédito. A recuperação dessas violações de informações pode levar anos e os custos são enormes. A criptografia é uma solução efetiva para proteger as informações sensíveis e vitais de indivíduos e organizações contra violações de informações, tornando-se, assim, um elemento essencial dos sistemas de segurança de dados.

A tecnologia de criptografia em massa fornece um método para criptografar grandes quantidades de dados durante a transmissão ou o armazenamento. Mas nos últimos anos, o crescimento da quantidade de informações sensíveis que deve ser criptografada simultaneamente ultrapassou o crescimento na eficiência da computação das CPUs. Atualmente, os requisitos da energia de processamento para criptografia em massa estão sendo atendidos por soluções de hardware especializadas, na forma de aceleradores criptográficos (consulte Recursos). A maioria dos algoritmos de criptografia, como o Padrão de Criptografia de Dados (DES) e o Padrão de Criptografia Avançado (AES), possui um nível alto e inerente de paralelismo de dados e densidade computacional, tornando-os adequados para implementações paralelas nas GPUs e substituindo as soluções criptográficas de hardware dedicadas (consulte Recursos).


Mecanismo gKrypt

O mecanismo gKrypt é um módulo de criptografia de prateleira que fornece uma API simples para usar Padrão de Criptografia Avançado Rijndael com GPUs (consulte Recursos). Ele pode aproveitar o hardware paralelo subjacente na forma de placas gráficas e processadores de computação, transferindo a carga de trabalho de criptografia de computação intensiva. A interface C/C++ simples do gKrypt com ligações para interfaces Java™ e C# oferece uma grande vantagem aos desenvolvedores que desejam implementar uma solução de GPU com conhecimento minimalista das linguagens paralelas, como CUDA e OpenCL.

A estrutura é compatível com GPUs baseadas em AMD e NVIDIA, assim como CPUs de diversos núcleos, facilitando a adaptação aos benefícios de processadores paralelos. A próxima seção explica a abordagem subjacente com a pane paralela do AES.


Algoritmo de Padrão de Criptografia Avançado (AES)

O Padrão de Criptografia Avançado (AES) é o padrão de criptografia aprovado pelo National Institute of Standards and Technology (NIST), com base na cifra Rijndael (consulte Recursos). Rijndael é uma cifra de blocos de chave simétrica proposta pelos criptógrafos belgas, Joan Daemen e Vincent Rijmen, para um processo de seleção do AES iniciado por NIST (consulte Recursos). O Rijndael foi aprovado pelo NIST como o Padrão de Criptografia Avançado (AES) em novembro de 2001 e substituiu efetivamente o Padrão de Criptografia de Dados (DES) antigo. O padrão AES é composto por três cifras de blocos com tamanhos de chave de 128, 192 e 256 bits e cada um com os mesmos blocos de dados de 128 bits, por isso, os nomes AES-128, AES-192 e AES-256, respectivamente.

A cifra de blocos do AES é operada em uma matriz bidimensional de bytes chamados de estado, denotados por s. O tamanho da matriz de estado é 16 bytes (128 bits), organizados em quatro linhas e quatro colunas. Ela é representada por Nb = 4, que é basicamente o número de colunas em uma matriz de estado. Os tamanhos da chave suportados para AES são 128, 192 e 256 bits, representados, respectivamente, por Nk = 4, 6 ou 8. O AES aplica transformações orientadas a bytes (comumente mencionadas como Transformações de AES) para criptografar ou decriptografar a matriz de estado. Essas transformações são aplicadas para um número específico de Nrarredondados, o que depende do tamanho da chave. Para chaves de 128, 192 e 256 bits, Nr = 10, 12 e 14, respectivamente.

A Figura 1 abaixo mostra várias fases do algoritmo do AES.

Figura 1. Fases do algoritmo do AES
Fases do algoritmo do AES

Antes de iniciar as transformações do AES, a chave de cifra fornecida pelo usuário é expandida usando o Planejamento de Chave do Rijndael. A etapa Expansão de Chave, mostrada na Figura 1, implementa o Planejamento de Chave e fornece a chave expandida para todos os arredondamentos dos estágios subsequentes. O tamanho de chave expandido é calculado como Nb(Nr + 1), que é o número de palavras de 32 bits (colunas). Uma parte diferente da chave expandida é usada na etapa AddRoundKey de cada arredondamento.

A primeira etapa do processo de criptografia do AES é a transformação AddRoundKey , em que cada byte do estado é combinado com a chave arredondada usando operações OR Exclusivas (xor) bit a bit, conforme definido pela equação na Figura 2.

Figura 2. Primeira etapa do processo de criptografia do AES
Primeira etapa do processo de criptografia do AES

Isso é representando na Figura 3 abaixo. Estado, Novo Estado e Chave Arredondada são todos representados como matrizes 4x4 como bytes (128 bits) como Nb = 4. Os dados do byte estão na forma de palavras hexadecimais.

Figura 3. Transformação AddRoundKey
Transformação AddRoundKey

Na próxima fase do AES, todas as quatro transformações são aplicadas repetidamente Nr - 1 vezes, começando com Nr = 1 até Nr - 1, na ordem mostrada na Figura 3. Explicarei cada uma dessas transformações na mesma ordem em que são aplicadas.

A transformação SubBytes é uma etapa de substituição de byte não linear em que cada byte do estado é substituído de acordo com uma tabela de consulta chamada S-Box. Cada byte do estado é substituído por uma entrada de S-Box que tem o mesmo índice que o valor hexadecimal do byte a ser substituído. A Figura 4 ilustra melhor esse processo.

Figura 4. Transformação SubBytes
Transformação SubBytes

Aqui, o primeiro byte do estado possui um valor hexadecimal. O valor de substituição é determinado pela intersecção da linha com o índice 1 e da coluna com o índice 9. Da mesma forma, o byte {be} será substituído pelo byte do S-Box por um índice da linha b e o índice da coluna e.

Na transformação ShiftRows , cada linha da matriz de estado é alterada ciclicamente por meio de um deslocamento diferente de acordo com as convenções da equação na Figura 5.

Figura 5. Cada linha da matriz de estado é alterada ciclicamente por meio de um deslocamento diferente
Cada linha da matriz de estado é alterada ciclicamente por meio de um deslocamento diferente

O valor do deslocamento shift(r, Nb) depende do número da linha r, como na equação na Figura 6.

Figura 6. O valor de deslocamento depende do número da linha
O valor de deslocamento depende do número da linha

A resolução das equações acima para cada linha revela que a primeira linha não é alterada, enquanto cada byte da segunda, terceira e quarta linhas é deslocado para a esquerda por um deslocamento de um, dois e três bytes, respectivamente. A Figura 7 abaixo, explica como cada linha é deslocada com a nova matriz de estado resultante.

Figura 7. Transformação ShiftRows
Transformação ShiftRows

Pense no padrão de deslocamento ao mover os bytes para posições mais baixas na linha e no agrupamento de bytes mais baixos na parte superior da linha.

A transformação MixColumns é operada nas colunas do estado, tratando cada coluna como um polinômio de quatro termos sobre GF(28 ). Cada coluna é multiplicada modulo x 4 + 1 pela equação do polinômio do coeficiente na Figura 8.

Figura 8. O polinômio do coeficiente
O polinômio do coeficiente

Isso equivale a substituir cada coluna do estado com a multiplicação da matriz dessa coluna pela matriz do coeficiente, como na Figura 9.

Figura 9. Transformação MixColumns
Transformação MixColumns

Paralelizando o algoritmo do AES para arquitetura CUDA

Agora, você tem algum entendimento do algoritmo de criptografia do AES. Está pronto para iniciar uma implementação usando a estrutura CUDA. Nas seções a seguir, discutirei brevemente a estrutura CUDA seguida por uma discussão detalhada da abordagem de design e mecanismo de implementação. Esse é um trabalho preparatório, portanto, é possível executar um exemplo na Parte 2 desta série.

A arquitetura CUDA

O CUDA, apresentado em 2006, é uma arquitetura de computação paralela desenvolvida pelo NVIDIA que acelera o desempenho da computação ao aproveitar o poder das GPUs no NVIDIA (consulte Recursos). Mais do que cem milhões de GPUs instaladas no CUDA de suporte do mercado, portanto, os aplicativos executados no CUDA já possuem uma possível base forte do usuário. Desde sua liberação, os desenvolvedores alcançaram uma aceleração radical em inúmeros aplicativos, especialmente relacionada ao Processamento de Imagens e à reprodução de vídeo HD (consulte a figura 10).

Figura 10. Modelo de encadeamento do CUDA
Modelo de encadeamento do CUDA

O conceito do modelo de programação do CUDA é gerar milhares de encadeamentos executados na forma de Single Program Multiple Data (SPMD), cada um em um pequeno chunk de dados em paralelo. Como as GPUs superam as CPUs no número de núcleos (embora um núcleo da GPU seja muito mais fraco que o da CPU), elas são ideais para executar milhares de encadeamentos em paralelo, em que cada encadeamento é computado em um pequeno chunk de dados. Esses encadeamentos são organizados em blocos e grades, em que um bloco é uma coleção de encadeamentos e uma grade é uma coleção de blocos. A arquitetura CUDA, com todos os seus recursos e hierarquia de memória, precisa de muita explicação, mas isso está fora do escopo deste artigo.

Estratégia de design

Como mencionado, o AES é um algoritmo de cifra de bloco operado em blocos de dados de 128 bits (estado) independentemente. Quando a cifra do AES executa as mesmas operações em cada bloco de estado sem quaisquer dependências entre eles (modo ECB), ela fornece um alto nível de paralelismo de dados. Implementei uma estratégia fork-and-join para explorar esse paralelismo do nível de dados em uma cifra de bloco do AES. Nessa abordagem, diversos blocos de estado podem ser criptografados simultaneamente, um bloco de estado por encadeamento, resultando em um rendimento mais alto. Conforme o tamanho dos dados aumenta, aumenta também o nível de paralelismo, tornando, assim, as GPUs mais eficientes para a criptografia em massa.

A Figura 11 mostra a divisão de trabalho Host-Dispositivo e descreve a natureza de vários constituintes do AES. Como pode ver, a única operação serial no AES é a parte de planejamento de chaves que fornece as chaves arredondadas para arredondamentos subsequentes do AES. Todas as transformações do AES são altamente paralelas, uma vez que são aplicadas a cada bloco de estado de 128 bits de forma independente. Portanto, é possível dividir o trabalho entre o processador de Host da CPU e o Dispositivo da GPU para obter o máximo rendimento da implementação. Logo, o planejamento de chaves é executado uma vez no dispositivo da CPU e passado para o Dispositivo da GPU como um argumento de kernel. O algoritmo do AES do núcleo, isto é, as transformações do AES, são implementadas com o CUDA para usar completamente os recursos de computação paralelos da GPU.

Figura 11. Divisão de trabalho host-dispositivo
Divisão de trabalho host-dispositivo

Na implementação abordada na Parte 2 desta série, cada encadeamento do CUDA assume um bloco de estado (16 bytes) como entrada e o converte para cifra-texto aplicando as transformações do AES orientadas a bytes para um número especificado de arredondamentos. A criptografia de um estado de 128 bits, portanto, permanece serial; no entanto, são usadas técnicas de otimização específicas à GPU, como o desenrolamento de loops para a otimização do código. Existe um deslocamento de rede de 16 bytes (um bloco de estado) para cada encadeamento do CUDA ao acessar os dados de entrada e gravar os dados criptografados de volta. A Figura 12 mostra a divisão de trabalho entre encadeamentos e o modelo de designação de encadeamento que essa implementação seguirá.

Figura 12. Designação de encadeamento do CUDA
Designação de encadeamento do CUDA

Execução de encadeamento no dispositivo do CUDA

Teoricamente, é possível pensar que a quantia de tempo necessária para criptografar 100 MBs de dados seria igual à quantia de tempo necessária para criptografar 128 bits, uma vez que todos os encadeamentos são operados simultaneamente, mas este não é o caso. Você já sabe que os encadeamentos são compactados em blocos executados no dispositivo do CUDA. Na geração atual da arquitetura CUDA, os recursos de execução (principais) são divididos em Streaming Multiprocessors (SMs) e cada SM pode executar 112 blocos por vez. (Consulte a Figura 13. Se o dispositivo tiver 14 SMs, como no Tesla C2050 com 32 núcleos cada, apenas 16 blocos serão executados por vez contanto que não haja outros fatores limitantes. Se o número de blocos for maior que 16, eles terão de aguardar por sua vez. Essa é a representação mais simplista da execução dos encadeamentos no dispositivo. Muitos outros fatores incluem o número de warps por SM, o uso de registros por encadeamento, a memória compartilhada por bloco e assim por diante. Para obter informações adicionais sobre como o CUDA designa blocos de encadeamento a SMs, consulte a calculadora de ocupação do CUDA (consulte Recursos).

Figura 13. Designação de blocos de encadeamento a multiprocessadores de designação (SMs)
Designação de blocos de encadeamento a multiprocessadores de designação (SMs)

Quando um bloco de encadeamento for designado a um multiprocessador de fluxo, é ainda mais dividido em warps, cada um é um conjunto de 32 encadeamentos na geração atual da arquitetura CUDA de crescimento contínuo. Esses warps também podem não ser executados em paralelo, mas eles são operados de forma altamente eficiente. Por exemplo, se um warp estiver aguardando uma transferência de memória, o próximo desempenhará a execução de dados durante esse momento no mesmo núcleo. Se mais de um warp estiver pronto para execução, o driver configura um mecanismo de prioridade entre eles. Embora o número de núcleos possa ser menor que o número de encadeamentos ativados em um kernel, a arquitetura do CUDA e o driver dão a certeza de que todos os recursos de hardware estão sendo usados para oferecer o desempenho máximo.


Configurando o CUDA no Linux

A estrutura do CUDA requer Graphics Processing Units (GPUs) com base em NVIDIA para aproveitar o hardware paralelo subjacente e gerar desempenho. O Tempo de Execução do CUDA vem com um driver de vídeo de desenvolvedor de NVIDIA. Para usar sua placa gráfica do CUDA, a primeira etapa é reconfigurar o driver de vídeo básico. Abra o terminal e execute o seguinte comando: $ sudo apt-get --purge remove nvidia*.

A próxima etapa é colocar na lista de bloqueio o novo driver padrão que entra em conflito com o driver de desenvolvedor do CUDA. Faça um novo arquivo em /etc/modprobe.d e insira o que segue da Listagem 1.

Lista 1. Colocando na lista de bloqueio o novo driver padrão que entra em conflito com o driver do desenvolvedor do CUDA
# /etc/modprobe.d/blacklist-nouveau.conf 
blacklist nvidiafb 
blacklist nouveau 
blacklist rivafb 
blacklist rivatv 
blacklist vga16fb 
options nouveau modeset=0

Para atualizar o arquivo kernel, execute este comando: $ sudo update-initramfs -u

Em seguida, reinicialize o sistema e deixe a modificação entrar em vigor. Quando o sistema for reiniciado, você estará pronto para instalar o driver de desenvolvimento do CUDA.

Instalando o driver do CUDA

É possível fazer o download do release oficial do driver habilitado do CUDA mais recente diretamente do NVIDIA (consulte Recursos). É preciso desligar gerenciador de exibição de gráficos antes de a instalação prosseguir. Para alternar para o modo do console, pressione CTRL+ALT+F2. Agora, inicie a instalação automatizada do arquivo do driver a partir do console: $ sudo sh devdriver_4.1_linux_32_285.05.32.run.

Quando a instalação do driver tiver concluído, simplesmente reinicialize seu sistema e verifique se o X Server está em execução a partir do menu Administração que exibe as GPUs atualmente instaladas.

Agora, você está pronto para executar as técnicas de otimização na Parte 2 desta série.


Conclusão

O mecanismo gKrypt é enviado em um pacote configurável com binários da plataforma, bem como fragmentos de códigos que guiam a integração com projetos baseados em C/C++. É evidente que o uso correto dos recursos do sistema seja vital. A ideia é fazer uso dos plug-ins otimizados que impulsionarão instantaneamente o desempenho sem sacrificar a compatibilidade ou a facilidade de uso. Na Parte 2, obtenha detalhes sobre as técnicas de otimização que destacam algumas integrações demonstrando um exemplo em execução.

Recursos

Aprender

Obter produtos e tecnologias

  • Avalie o Mecanismo gKrypt para seu aplicativo.
  • Obtenha os mais recentes drivers habilitados para Cuda do NVIDIA.
  • Faça download da Calculadora de Ocupação do CUDA, que permite calcular a ocupação do multiprocessador de uma GPU por um determinado kernel do CUDA.
  • Avalie produtos IBM da maneira que for melhor para você: faça download da versão de testes de um produto, avalie um produto online, use-o em um ambiente de nuvem ou passe algumas horas na SOA Sandbox para saber como implementar arquitetura orientada a serviço (SOA) de maneira eficiente.

Discutir

Comentários

developerWorks: Conecte-se

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


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

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

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux, Software livre
ArticleID=812360
ArticleTitle=Proteja seus dados à velocidade da luz com o gKrypt, Parte 1
publish-date=04302012