• Tutoriais Alunos

Criptografia em Hardware Fpga

Começando

Para seguir esse tutorial é necessário:

Motivação

   Segurança de dados é um dos principais pilares da Tecnologia da Informação, e existem várias formas em que ela está presente no nosso cotidiano, desde autenticações com usuário e senha, limite de tentativas de acesso, reconhecimento facial entre muitos outros métodos utilizados hoje em dia.
   A criptografia tem como principal motivo oferecer segurança algum dado ou fluxo de dados, fazendo com que só quem tenha a devida permissão consiga ler e modificar esses dados.


Tipos de Encriptografia

  • Simetrica:

    O processo de encripto grafia simétrico é caracterizado pelo fato de que ambas as operações tanto encriptar quanto decriptar utilizam a mesma chave, um fator crítico desse processo é o fato de que para isso acontecer é necessário que a chave seja transferida junto ao montante de dados que está sendo transferido, deixando o processo mais vulnerável

 

  • Assimetrica:

   Por consequência o processo assimétrico se caracteriza pelo fato de utilizar duas chaves sincronizadas. Nesse processo são criadas duas chaves uma privada que será mantida com o dono do arquivo e outra publica que estará exposta para o mundo ver. O ponto é que o único método de decriptar a chave pública é com a chave privada que esta resguardada pelo responsável da encriptação.

 

  Nesse tutorial a criptografia que iremos apresentar será em hardware, pois tem a capacidade de oferecer um nível de segurança muito alto, já que os métodos utilizados na encriptografia, como a chave de segurança pode estar muito menos acessível a um possível invasor.
  Além disso, um fator muito relevante para utilização de encriptografia e decriptografia em hardware é a velocidade que o algoritmo vai levar para realizar tal ações. Isso acontece porque haverá a utilização de um processador dedicado que alivia a carga do resto do dispositivo.

 

Implementação

   Nosso hardware vai funcionar como um dispositivo que recebe um arquivo via USB, e devolve esse arquivo encriptado, também sendo capaz de fazer a operação inversa. Para isso utilizaremos uma FPGA, que tem a capacidade de formar hardwares dinâmicos e programáveis. Após finalizado o projeto, conseguimos criar essa estrutura estática para o uso sem a necessidade de toda a FPGA.
   Para essa implementação utilizaremos um dispositivo de criptografia disponibilizado pela INTEL

 

Platform Designer como achar e utilizar um core de criptografia

Como achar um componente:

   A própria interface possui o chamado IP cores (integrating custom IP components) fornece componentes bem encapsulados que são justamente feitos para serem facilmente conectados e inicializados.

   Permitindo importar componentes personalizados produzidos pela comunidade e amplamente utilizado no mercado.

No site: https://opencores.org/

   Também é possível por exemplo, encontrar componentes diversos ja prontos para utilizar e com documentação de uso.

   Componentes estes disponibilizados e mantidos pela comunidade.

Imagem referente a Aba https://opencores.org/projects:

Note

Como podemos perceber existem

77 cores diferentes somente na aba de Criptografia.

Utilizando um core de criptografia

   Uma boa forma de filtrar e encontrar algo bem estruturado e bem documentado é utilizando o filtro disponível pelo OpenCores:

Atencao

Perceba que a quantidade de cores disponíveis diminui bruscamente.

Isso não significa que os outros 75 cores não possam ser uteis para você.

Apenas que os mesmos ainda não foram de certa forma revisados pela OpenCores.

Avalon AES ECB-Core (128,192,256 Bit)

   Vamos pegar de exemplo este "Avalon AES ECB-Core (128,192,256 Bit)"

   Baixar a pasta e analisar algumas informações relevantes.

    Umas das partes mais importantes ao pegar um componente novo é a documentação dele.

    No caso deste componente a pasta "doc".

   Onde encontramos dois segmentos importantes da documentação:

manual ("avs_aes.pdf")

   Sessões importantes do pdf:

- Configuration Generics

   Mostra as opções genéricas que podem ser modificadas no componente.

   Neste caso, por exemplo, KEYLENGTH pode 128,192 ou 256 que são os tamanhos de chaves que o componente está preparado para receber.
-Signals

   Tabela que mostra todos os barramentos que o Avalon irá utilizar e para que serve cada um deles. Os mesmos devem ser conectados corretamente no PD (platform designer).

   Imagem de exemplo da intel:

-Memory Map

   Mapa de memória.

   Normalmente isso é útil para quando queremos saber em qual offset do base adresses atribuído pelo PD (plataform designer) as informações podem ser lidas ou escritas.
-Control Register

   Descrição melhor dos pontos de controle (CTRL da tabela de Mapa de memória)

sw (manual do driver para uso do componte via C++ pelo barramento Avalon)

   Basicamente nesta pasta possui um docHTML da "API" do driver disponibilizado pelo fabricante do componente.

   O driver pode ser localizado na pasta SW:

   Parte do arquivo do driver:

void avs_aes_init(avs_aes_handle* context){
    context->key    = (unsigned int*) KEY_ADDR;
    context->payload= (unsigned int*) DATA_ADDR;
    context->result = (unsigned int*) RESULT_ADDR;
    context->control    = (unsigned int*) AESCTRLWD;
    *(context->control) = 0x00000000;
}


void avs_aes_setKey(avs_aes_handle* context, unsigned int* key){
    int i=0;
    unsigned int* target_ptr = (unsigned int* )context->key;
    /* Invalidate old key; */
    *(context->control) &= (~KEY_VALID);
    asm __volatile("sync" :::);
    for(i=0; i<KEYWORDS; i++){
        *(target_ptr++) = *(key++);
    }
    asm __volatile("sync" :::);
    /* validate key */
    *(context->control) |= KEY_VALID;
}

Final

   Com o driver em mãos, o arquivo de Teste "AEStester.c" e o platform design corretamente conectado. Você teoricamente já tem seu componente pronta para encriptar e decriptar em FPGA.