O QUE VAMOS APRENDER?

A segurança é algo essencial em muitos projetos, principalmente nos conectados à internet. Desde esconder senhas ou mensagens para que ninguém além do destino possa ler, a segurança faz parte do nosso cotidiano e iremos aprender a implementa-la nos queridos micro controladores. Aprenderemos usar a criptografia AES (Advanced Encryption Standard), o download dela estará ao fim do tutorial, esta biblioteca funciona no Arduino e ESP8266.

UM POUCO SOBRE SEGURANÇA DE DADOS

Antes de entrar em detalhes sobre o AES, um resumo sobre a segurança de dados.

Codificação

a codificação é possivelmente o método mais simples e antigo, trata-se da troca de uma linguagem, para outro padrão. É necessário conhecer os caracteres codificados para poder decodificar, o objetivo da codificação não é tornar a mensagem secreta. Exemplo: Morse(Fig 1), que converte os caracteres para pulsos elétricos, sons, luzes, etc.

Clique AQUI para mais informações sobre Morse.

Criptografia simétrica

A criptografia simétrica faz o uso de uma chave privada que deve ser mantida em segredo, já que é usada tanto para encriptação, quanto para desencriptação. Esta é mais simples, leve e menos segura que a criptografia assimétrica. Exemplo: AES, DES.

Clique AQUI para mais informações sobre a criptografia simétrica;

AQUI para mais informações sobre o tamanho da chave simétrica.

Criptografia assimétrica

A criptografia assimétrica faz o uso de duas chaves, uma pública e outra privada. A pública pode ser usada para encriptação e a privada para desencriptação. Esta é mais segura, porém mais pesada e lenta. Exemplo: RSA.

Clique AQUI para mais informações sobre a criptografia assimétrica.

Hash

Hash é um algorítimo de uma via, ou seja, é irreversível. É muito usado com senhas, primeiramente é gerado um Hash-code da senha e este, sera apenas comparado ao Hash-code armazenado no destino, assim, é impossível alguém com um sniffer descobrir a senha transmitida. Exemplo: MD5, SHA-1.

Clique AQUI para mais informações sobre Hash.

AES

AES (Advanced Encryption Standard), é uma criptografia de blocos com chave simétrica (cifra de bloco) e sera usado AES-128 no exemplo deste tutorial. AES trabalha com o sistema de blocos de 16 Bytes. É possível utilizar valores de entrada menores sem problemas, mas maiores sera necessário dividir em blocos de 16B.

Clique AQUI para mais informações sobre AES;

AQUI para mais informações sobre Cifra de bloco.

 Imagine que você use dois micro controladores para transmissão de mensagens (igual whatsapp, facebook…), muito provavelmente você deseja que ninguém consiga ler as mensagens, isto pode ser feito com a encriptação, que irá cifrar a mensagem e deixar ilegível para qualquer pessoa sem a chave, garantindo que apenas as pessoas com a chave, consigam ler.

Também pode ser usada para protocolos de comunicação entre dispositivos, para preservar a integridade do mesmo e evitar “curiosos de plantão”.

As aplicações da encriptação, hash e codificação são gigantescas.


MÃOS À OBRA

Programando


ENTENDENDO A FUNDO

SOFTWARE

A função que fizemos “enc128()” torna o uso muito simples, mas você deve estudar mais sobre o AES e a biblioteca usada para entender melhor o funcionamento. Aqui sera mostrado apenas a encriptação, mas também é possível fazer a desencriptação da mesma forma, este sera o desafio de vocês para aprendizado.


byte key[16], out[16], inp[32];

Criamos os vetores (ARRAYS) para alocar a CHAVE e mensagens de INPUT e OUTPUT do buffer AES.


const char pass[] = "abc";

Definindo a KEY do nosso algorítimo. Deve ter no mínimo 1 caractere, e no máximo 16 (AES 128).  0 < Key <= 16. Aqui usamos “abc”, mas é aconselhado o uso de letras e números aleatórios.


enc128("vida de silicio", 1);

enc128(texto, debug);

A função criada para encriptação dos dados torna o processo bem fácil. Os argumentos necessários para ela é o texto que deseja encriptar, e em seguida, o debug, que mostra no serial monitor possíveis erros e por fim, o HEXA da encriptação.

O texto para encriptação deve estar entre aspas e ser menor que 17 caracteres (bytes). 0 < texto <= 16.

O debug é ativado com 1 e desativado com 0, aconselhamos a sempre usar 1 para caso aconteça erros.


aes.set_key(key, 16);

Com esta função própria da biblioteca, nossa key de 128 bits que já esta dentro de uma array, anteriormente feito dentro do FOR será usada para encriptação dos dados.


aes.encrypt(inp, out);

Esta outra função, faz a encriptação dos dados que estão dentro da array INP, e retorna os valores dentro da array OUT.


Provando a encriptação

Ao testar o código que foi mostrado aqui, será gerado exatamente este código em hexadecimal “4A 38 3A 94 FC FB C4 C6 E1 4F D2 5D 34 7B B5 80”, este código hexadecimal é a nossa mensagem encriptada. Encontrei um site bem legal que faz a encriptação e desencriptação dos dados AES e usarei ele.

Coloquei a nossa chave “abc” e o código hexadecimal gerado pelo micro controlador. Após clicar para desencriptar, é mostrado a mensagem original, e como podemos ver, funcionou. 😀

o AES permite vários métodos de encriptação, a mais simples é a ECB, a biblioteca usada no tutorial também permite a CBC que é mais segura, porém mais complicada.

Clique AQUI para ir ao site.


DESAFIO

O desafio para vocês é que façam a desencriptação de um código hex, estudem sobre o assunto e veja as funções da biblioteca! Vocês podem desencriptar o próprio hex gerado da sua encriptação, ou usar o site indicado anteriormente para obter um hex e ver se a desencriptação funciona. Lembrando que esta biblioteca funciona para Arduino e ESP8266.

Download da biblioteca: https://github.com/spaniakos/AES

FINALIZANDO

Este conteúdo foi totalmente voltado para esclarecer alguns pontos à respeito da Encriptação AESEsperamos que você tenha gostado deste conteúdo, sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.

Estudante de Engenharia da computação pela USC. Pretende aprimorar e fazer a diferença nessa imensa área tecnológica.
%d blogueiros gostam disto: