Criptografia AES

Resumão

A criptografia AES é um padrão de criptografia simétrica em blocos.

A criptografia tem o objetivo de esconder uma mensagem de uma pessoa que não deve lê-la. Uma função criptográfica possui uma chave e uma função inversa. Existem dois tipos de criptografia: simétrica e assimétrica.

Criptografia simétrica tem a característica de que todas as pessoas realizando a comunicação devem possuir a mesma chave.

Mesma chave = Criptografia simétrica.

Atualmente existem dois padrões de função criptográfica simétrica considerados seguros: AES e 3DES (DES triplo). Recomenda-se sempre utilizar AES, pois é mais rápido e mais seguro que 3DES.

O padrão AES trabalha em blocos de dados de 128 bits (16 bytes), ou seja, a entrada e a saída da função criptográfica tem este tamanho, e pode utilizar chaves criptográficas de 128, 192 e 256 bits, dependendo do nível de segurança necessário para a aplicação.

O padrão 3DES trabalha com blocos de 64 bits (8 bytes) e possui chaves de 112 bits.

Se a aplicação exige n bits de segurança, utilize uma função criptográfica de segurança equivalente. Na dúvida ou se não estiver especificado, utilize 128 bits de segurança.

Na dúvida ou se não estiver especificado, utilize 128 bits de segurança.

Função criptográficaTamanho do bloco (Entrada/Saída)Tamanho da chave (Segurança)Função hash equivalente
3DES (DES triplo)64 bits (8 bytes)112 bitsSHA-224
SHA3-224
AES-128128 bits (16 bytes)128 bitsSHA-256
SHA3-256
AES-192128 bits (16 bytes)192 bitsSHA-384
SHA3-384
AES-256128 bits (16 bytes)256 bitsSHA-512
SHA3-512
Funções criptográficas simétricas seguras AES e 3DES, tamanho do bloco, tamanho da chave, segurança e funções hash de segurança equivalente.

Hash e Criptografia

Funções Hash e Funções de Criptografia tem objetivos diferentes.

A hash serve para gerar um valor associado a uma mensagem. Qualquer outra pessoa pode calcular esse valor a partir da mensagem, desde que conheça qual algoritmo usar.

A criptografia serve para esconder uma mensagem de quem não possua a chave utilizada para encriptar. Mesmo sabendo o algoritmo utilizado, sem saber a chave deve ser muito difícil (praticamente impossível) determinar qual a mensagem a partir dela encriptada.

Ainda, diferente de uma função hash, uma função de criptografia possui uma chave e uma função inversa. Uma função hash é utilizada por todos da mesma maneira para dar o mesmo resultado, enquanto uma função criptográfica pode ser utilizada com chaves diferentes, dando resultados diferentes. A operação inversa é importante pois quem recebe a mensagem criptografada deve ser capaz de, através da chave, reverter ela para a mensagem original.

Para uma função criptográfica ser considerada segura: sua segurança deve depender apenas da chave; a mensagem criptografada deve ser indistinguível de valores gerados aleatoriamente; e conhecendo a mensagem e a mensagem criptografada, não deve ser possível determinar a chave.

Padrão de Criptografia AES

O padrão AES (Advanced Encryption Standard – Padrão de Criptografia Avançado) é um padrão de criptografia simétrica de blocos.

“Simétrica” significa que a mesma chave é utilizada para encriptar e para decriptar. “Blocos” significa que ela opera em um número fixo de bits.

A criptografia AES opera em blocos de 128 bits (16 bytes), ou seja, pega um bloco como entrada e gera como saída outro bloco de mesmo tamanho, com os bits misturados de acordo com a chave utilizada.

A chave utilizada na criptografia AES pode ser de três tamanhos: 128, 192, 256 bits. O tamanho da chave é escolhido a partir do nível de segurança exigido pela aplicação.

Encriptar um bloco com o algoritmo da criptografia AES consiste em executar diversas rodadas (turnos) de quatro operações: AddRoundKey, SubBytes, ShiftRows, MixColumns. Cada uma dessas operações possui uma função dentro do algoritmo.

Cada uma dessas operações tem uma operação inversa, utilizada na decriptação.

Adicionar chave da rodada (AddRoundKey)

Faz-se XOR do bloco com um a chave da rodada.

Essa é a única parte do algoritmo AES onde a chave criptográfica é utilizada e é ela que faz cada chave dar uma saída diferente.

A “chave da rodada” é um valor obtido a partir da chave de criptográfica, utilizando o algoritmo de escalonamento de chaves (key sechedule).

Adição ou XOR?

Note que no nome “AddRoundKey” falamos em “adicionar”, mas a operação utilizada é XOR. Eis a explicação:

O padrão AES não pensa nos bytes como números, mas como polinômios em GF(28).

Cada bit representa um coeficiente do polinômio. Por exemplo o byte 00001001, em vez do número 1×23 + 1×20 = 9, é o polinômio 1×x3 + 1×x0 = x3 + 1.

Os coeficientes só podem ser 0 ou 1 e, quando fazemos adição, consideramos sempre módulo 2, ou seja 0+0=0, 1+0=1, 0+1=1 e 1+1=0, o que é igual a operação binária XOR.

Por que usar essa matemática esquisita? Ela tem vantagens, características interessantes, que são utilizadas!

Substituição não-linear (SubBytes)

Cada um dos 16 bytes do bloco são trocados por outros 16 bytes, de acordo com uma tabela de substituição.

Esta é a única operação não-linear do algoritmo AES. A existência de operações não-lineares dificultam a utilização de técnicas lineares de criptanálise.

Esta substituição faz difusão dos bits dentro de um byte, ou seja, espalha os bits dentro de um byte.

DE onde veio tal tabela?

Note que a tabela não foi simplesmente inventada.

Ela foi criada a partir de uma propriedade muito legal dos polinômios GF(28). Lembra?

Todo polinômio tem um inverso multiplicativo, ou seja, todo polinômio p possui um inverso q = 1/p tal que pq = 1.

Devemos considerar a multiplicação de p e q módulo (resto da divisão por) um outro polinômio, que deve ser irredutível. Polinômio irredutível é como se fosse um “polinômio primo”, não pode ser divisível por outro polinômio, similar a números primos não serem divisíveis por outros números. O polinômio do módulo utilizado no algoritmo é x8 + x4 + x3 + x + 1.

Esta é a parte não linear: o inverso.

Depois de tirar o inverso do byte, faz-se uma multiplicação dos bits por uma matriz e uma soma (XOR) com constante. Isso serve para atrapalhar alguma criptanalise de utilizar a relação de inverso recém utilizada.

Em vez de fazer todos esses cálculos toda vez, utilizamos uma tabela.

Trocar linhas (ShiftRows)

Considerando o bloco de 16 bytes como sendo uma matriz 4×4, esta operação troca a posição dos bytes de cada linha.

A primeira linha é mantida, a segunda linha é deslizada um byte, a terceira linha é deslizada dois bytes e a quarta linha é deslizada três bytes.

Não tem segredo!

Esta substituição faz difusão dos bits nas linhas, que são blocos de 32 bits (4 bytes).

Misturar colunas (MixColumns)

Novamente consideramos o bloco de 16 bytes como sendo uma matriz 4×4, esta operação mistura cada uma das colunas.

Esta mistura faz difusão dos bits nas colunas, que também são blocos de 32 bits (4 bytes).

Por algum motivo (qual?), essa operação não é realizada na última rodada.

Mas como se calcula?

Aqui não há uma operação equivalente ou uma tabela.

Selecionamos uma coluna, cada byte dessa coluna é considerado um coeficiente GF(28) de um polinômio de terceiro grau em Z. Essa é a parte esquisita, onde todo mundo quebra a cabeça: Os coeficientes do polinômio são polinômios.

Note que estou usando o Z maiúsculo para os polinômios-coluna com coeficientes em GF(28). Anteriormente usei x minúsculo para os polinômios-byte GF(28).

Reiterando a explicação: cada coeficiente do “polinômio-coluna-em-Z” é um “polinômio-byte-em-x”.

Fazemos uma multiplicação do polinômio-coluna pelo polinômio {3}Z3 + {1}Z2 + {1}Z + {2}, módulo ao polinômio é Z4 + 1.

Como os coeficientes estão em GF(28), multiplicações são sempre calculadas módulo algum polinômio irredutível de oitavo grau. Usamos o mesmo polinômio citado anteriormente: x8 + x4 + x3 + x + 1.

Então, se a coluna é formada por 255, 1, 2 e 3, o polinômio é
{255}Z3 + {1}Z2 + {2}Z + {3}.

Lembre-se que os coeficientes são, na verdade, polinômios em GF(28). Então o polinômio acima, na verdade é…
(x7+x6+x5+x4+x3+x2+x+1)Z3 + (1)Z2 + (x)Z + (x+1)

E o polinômio multiplicador {3}Z3 + {1}Z2 + {1}Z + {2}, na verdade é…
(x+1)Z3 + (1)Z2 + (1)Z + (x)

É isso ai, os coeficientes do polinômio em Z são polinômios em x.

Fazendo a multiplicação do polinômio-coluna com o polinômio 3Z3 + Z2 + Z + 2 obtemos um polinômio de sexto grau. Então fazemos a redução módulo Z4 + 1 e obtemos um polinômio de terceiro grau {231}Z3 + {248}Z2 + {255}Z + {31}.

Assim, depois da operação MixColumns, a coluna formada pelos números 255, 1, 2 e 3 é transformada na coluna 231, 248, 255 e 31.

Existe um atalho, que evita realizar as operações de multiplicação em Z e redução módulo Z4 + 1. Basta realizar uma multiplicação de um vetor (que representa a coluna) por uma matriz (que representa o polinômio multiplicador). Relembrando que os bytes sendo multiplicados, na verdade são polinômios em GF(28) e devem ser reduzidos módulo x8 + x4 + x3 + x + 1.

Número de rodadas

As quatro operações acima (AddRoundKey, SubBytes, ShiftRows, MixColumns) são realizadas diversas vezes, com o objetivo de realizar difusão (propagação de diferenças) e tornar mais difícil um ataque de criptanálise.

O número de rodadas executadas depende do tamanho da chave. Enquanto maior a chave, mais rodadas são necessárias.

Tamanho da chaveNúmero de rodadas
128 bits10
192 bits12
256 bits14
Número de rodadas da criptografia simétrica AES em relação ao tamanho da chave.

Links externos

Wikipedia AES

Especificação AES

Leia mais:

Veja mais posts na Categoria Criptografia!

Autor: Djones Boni

Engenheiro Eletricista.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *