# Advanced Encryption Standard

O padrão de criptografia avançada - advanced encryption standard (AES), também conhecido por seu nome original Rijndael, é uma especificação para a criptografia de dados eletrônicos estabelecida pelo instituto nacional de padrões e tecnologia dos E.U.A. (NIST) em 2001.
O AES é um subconjunto da cifra de bloco Rijndael desenvolvida por dois criptógrafos belgas, Vincent Rijmen e Joan Daemen, que submeteram uma proposta ​ao NIST durante o processo de seleção do AES. A Rijndael é uma família de cifras com diferentes tamanhos de chave e bloco. Para o AES, o NIST selecionou três membros da família Rijndael, cada um com um tamanho de bloco de 128 bits, mas três comprimentos de chave diferentes: 128, 192 e 256 bits.
O AES foi adotado pelo governo dos Estados Unidos da América. Ele substitui o padrão de criptografia de dados (DES), que foi publicado em 1977. O algoritmo descrito pelo AES é um algoritmo de chave simétrica, o que significa que a mesma chave é usada para criptografar e descriptografar os dados.
Nos Estados Unidos da América, o AES foi anunciado pelo NIST como U.S. FIPS PUB 197 (FIPS 197) em 26 de novembro de 2001. Este anúncio seguiu um processo de padronização de cinco anos no qual quinze designs concorrentes foram apresentados e avaliados, antes que a cifra de Rijndael fosse selecionada como a mais adequada (consulte o processo de padrão de criptografia avançada para obter mais detalhes).
O AES está incluído no padrão ISO/IEC 18033-3. O AES tornou-se efetivo como um padrão do governo federal dos E.U.A. em 26 de maio de 2002, após a aprovação do secretário de comércio dos E.U.A. O AES está disponível em muitos pacotes de criptografia diferentes e é a primeira (e única) cifra acessível publicamente aprovada pela agência de segurança nacional dos E.U.A. (NSA) para informações ultrassecretas quando usada em um módulo criptográfico aprovado pela NSA (consulte Segurança do AES, abaixo)

## Padrões definitivos

O advanced encryption standard (AES) é definido em cada um dos seguintes:
* FIPS PUB 197: Padrão de criptografia avançado (advanced encryption standard - AES)
* ISO/IEC 18033-3: Cifras de bloco

## Descrição das cifras

O AES é baseado em um princípio de design conhecido como rede de substituição-permutação, e é eficiente tanto em software quanto em hardware. Ao contrário de seu predecessor, o DES, o AES não usa uma cifra Feistel. O AES é uma variante do Rijndael, com um tamanho de bloco fixo de 128 bits e um tamanho de chave de 128, 192 ou 256 bits. Em contraste, Rijndael "per se" é especificado com tamanhos de bloco e chave que podem ser qualquer múltiplo de 32 bits, com um mínimo de 128 e um máximo de 256 bits.
O AES opera em um arranjo de bytes de ordem principal de linha e de coluna 4 × 4, denominada estado. A maioria dos cálculos AES são feitos em um determinado campo finito.
Por exemplo, 16 bytes, $b_{0},b_{1},...,b_{15}$ são representados como este arranjo bidimensional:
       ${\begin{bmatrix}b_{0}&b_{4}&b_{8}&b_{12}\\b_{1}&b_{5}&b_{9}&b_{13}\\b_{2}&b_{6}&b_{10}&b_{14}\\b_{3}&b_{7}&b_{11}&b_{15}\end{bmatrix}}$
O tamanho de chave usado para uma cifra AES especifica o número de rodadas de transformação que convertem a entrada, chamada de texto simples, na saída final, chamada de texto cifrado. O número de rodadas é o seguinte:
* 10 rodadas para chaves de 128 bits.
* 12 rodadas para chaves de 192 bits.
* 14 rodadas para chaves de 256 bits.
Cada rodada consiste em várias etapas de processamento, incluindo uma que depende da própria chave de criptografia. Um conjunto de rodadas reversas é aplicado para transformar o texto cifrado de volta ao texto plano original usando a mesma chave de criptografia.

### Descrição de alto nível do algoritmo

* KeyExpansion – as chaves das rodadas são derivadas da chave de cifragem usando o planejamento de chave AES. O AES requer uma rodada, de bloco, de chave de 128 bits separada para cada rodada mais um.
* Adição da chave da rodada inicial:
** AddRoundKey – cada byte do estado é combinado com um byte da chave da rodada usando operações bit a bit xor.
* 9, 11 ou 13 rodadas:
** SubBytes – uma etapa de substituição não linear onde cada byte é substituído por outro de acordo com uma tabela de pesquisa.
** ShiftRows – uma etapa de transposição em que as três últimas linhas do estado são deslocadas ciclicamente em um certo número de etapas.
** MixColumns – uma operação de mistura linear que opera nas colunas do estado, combinando os quatro bytes em cada coluna.
** AddRoundKey
* Rodada final (fazendo 10, 12 ou 14 rodadas no total):
** SubBytes
** ShiftRows
** AddRoundKey

### A etapa SubBytes

Na etapa SubBytes, cada byte $a_{i,j}$ no arranjo de estado é substituído por um SubByte $S(a_{i,j})$ usando uma caixa de substituição de 8 bits. Esta operação fornece a não linearidade na cifra. A caixa de substituição usada é derivada do inverso multiplicativo sobre GF(2$^8$), conhecido por ter boas propriedades de não linearidade. Para evitar ataques baseados em propriedades algébricas simples, a caixa de substituição é construída combinando a função inversa com uma transformação afim invertível. A caixa de substituição também é escolhida para evitar quaisquer pontos fixos (e assim é um desarranjo), ou seja, $S(a_{i,j})\neq a_{i,j}$, e também quaisquer pontos fixos opostos, ou seja, $S(a_{i,j})\oplus a_{i,j}\neq {\text{FF}}_{16}$. Ao realizar a descriptografia, a etapa InvSubBytes (o inverso de SubBytes) é usada, o que requer primeiro pegar o inverso da transformação afim e então encontrar o inverso multiplicativo.

### A etapa ShiftRows

A etapa ShiftRows opera nas filas de estado. Ela desloca ciclicamente os bytes em cada linha por um certo offset. Para o AES, a primeira linha permanece inalterada. Cada byte da segunda linha é deslocado um para a esquerda. Da mesma forma, a terceira e a quarta linha são deslocadas por deslocamentos de duas e três, respectivamente. Desta forma, cada coluna de saída de estado da etapa ShiftRows é composta de bytes de cada coluna de entrada de estado. A importância desta etapa é evitar que as colunas sejam criptografadas de forma independente, caso em que o AES degeneraria em quatro cifras de bloco independentes.

### A etapa MixColumns

Na etapa MixColumns, os quatro bytes de cada coluna de estado são combinados usando uma transformação linear invertível. A função MixColumns leva quatro bytes como entrada e produz quatro bytes, onde cada byte de entrada afeta todos os quatro bytes de saída. Junto com o ShiftRows, o MixColumns fornece difusão na cifra.
Durante esta operação, cada coluna é transformada usando uma matriz fixa (a matriz multiplicada à esquerda pela coluna fornece o novo valor da coluna no estado):
       ${\begin{bmatrix}b_{0,j}\\b_{1,j}\\b_{2,j}\\b_{3,j}\end{bmatrix}}={\begin{bmatrix}2&3&1&1\\1&2&3&1\\1&1&2&3\\3&1&1&2\end{bmatrix}}{\begin{bmatrix}a_{0,j}\\a_{1,j}\\a_{2,j}\\a_{3,j}\end{bmatrix}}\qquad 0\leq j\leq 3$
A multiplicação da matriz é composta pela multiplicação e adição das entradas. As entradas são bytes tratados como coeficientes de polinômio de ordem $x^{7}$. A adição é simplesmente XOR. A multiplicação é um polinômio modulo irredutível $x^{8}+x^{4}+x^{3}+x+1$. Se processado bit a bit, então, após o deslocamento, um condicional XOR com 1B$_{16}$ deve ser executado se o valor deslocado for maior que FF$_{16}$ (o estouro deve ser corrigido pela subtração do polinômio gerador). Estes são casos especiais da multiplicação usual em $\operatorname {GF} (2^{8})$.
Em um sentido mais geral, cada coluna é tratada como um polinômio sobre $\operatorname {GF} (2^{8})$ e é então o módulo multiplicado ${01}_{16}\cdot z^{4}+{01}_{16}$ com um polinômio fixo $c(z)={03}_{16}\cdot z^{3}+{01}_{16}\cdot z^{2}+{01}_{16}\cdot z+{02}_{16}$. Os coeficientes são exibidos em seus hexadecimais equivalentes da representação binária de polinômios de bits de $\operatorname {GF} (2)[x]$. A etape MixColumns também pode ser vista como uma multiplicação pela matriz MDS particular mostrada no campo finito $\operatorname {GF} (2^{8})$. Este processo é descrito mais detalhadamente no artigo Rijndael MixColumns.

### A etapa AddRoundKey

Na etapa AddRoundKey, a subchave é combinada com o estado. Para cada rodada, uma subchave é derivada da chave principal usando o planejamento de chave AES e cada subchave tem o mesmo tamanho que o estado. A subchave é adicionada combinando cada byte de estado com o byte correspondente da subchave usando o XOR bit a bit.

### Otimização da cifra

Em sistemas com palavras de 32 bits ou mais, é possível acelerar a execução desta cifra combinando as etapas SubBytes e ShiftRows com a etapa MixColumns, transformando-as em uma sequência de pesquisas de tabela. Isso requer quatro tabelas de 32 bits de 256 entradas (ocupando, juntas, 4096 bytes). Uma rodada pode então ser realizada com 16 operações de pesquisa de tabela e 12 operações XOR de 32 bits, seguidas por quatro operações XOR de 32 bits na etapa AddRoundKey. Como alternativa, a operação de pesquisa de tabela pode ser realizada com uma única tabela de 32 bits de 256 entradas (ocupando 1024 bytes) seguida por operações de rotação circular.
Usando uma abordagem orientada a bytes, é possível combinar as etapas SubBytes, ShiftRows e MixColumns em uma operação de rodada única.

## Segurança

A Agência de Segurança Nacional (National Security Agency - NSA) analisou todos os finalistas do AES, incluindo Rijndael, e afirmou que todos eles eram seguros o suficiente para dados não classificados do governo dos Estados Unidos da América. Em junho de 2003, o governo dos EUA anunciou que o AES poderia ser usado para proteger informações classificadas:
   O projeto e a força de todos os comprimentos de chave do algoritmo AES (ou seja, 128, 192 e 256) são suficientes para proteger as informações classificadas até o nível secreto. As informações ultrassecretas exigirão o uso de chaves de comprimento 192 ou 256. A implementação de AES em produtos destinados à proteção de sistemas e/ou informações de segurança nacional deve ser revisada e certificada pela NSA antes de sua aquisição e uso.
O AES tem 10 rodadas para chaves de 128 bits, 12 rodadas para chaves de 192 bits e 14 rodadas para chaves de 256 bits.
Em 2006, os ataques mais conhecidos foram em 7 rodadas para chaves de 128 bits, 8 rodadas para chaves de 192 bits e 9 rodadas para chaves de 256 bits.

## Validação NIST/CSEC

O programa de validação de módulo criptográfico (CMVP) é operado, em conjunto, pela divisão de segurança informática do governo dos Estados Unidos instituto nacional de padrões e tecnologia (NIST) e o estabelecimento de segurança de comunicações (CSE) do governo do Canadá. O uso de módulos criptográficos validados para NIST FIPS 140-2 é exigido pelo governo dos Estados Unidos para a criptografia de todos os dados que tenham uma classificação de "sensível, mas não classificado (SBU) ou superior". Do NSTISSP #11, política nacional que rege a aquisição de garantia de informações: “Os produtos de criptografia para proteção de informações classificadas serão certificados pela NSA e os produtos de criptografia destinados à proteção de informações confidenciais serão certificados de acordo com o NIST FIPS 140-2.”
O governo do Canadá também recomenda o uso de módulos criptográficos validados FIPS 140 em aplicações não classificadas de seus departamentos.
Embora a publicação NIST 197 ("FIPS 197") seja o documento único que cobre o algoritmo AES, os fornecedores normalmente abordam o CMVP sob o FIPS 140 e pedem para ter vários algoritmos (como o DES triplo ou o SHA-1) validados ao mesmo tempo. Portanto, é raro encontrar módulos criptográficos que sejam validados exclusivamente pelo FIPS 197 e o próprio NIST, geralmente, não se preocupa em listar os módulos validados pelo FIPS 197 separadamente em seu site público. Em vez disso, a validação FIPS 197 é, normalmente, listada apenas como uma notação "FIPS aprovado: AES" (com um número de certificado FIPS 197 específico) na lista atual de módulos criptográficos validados FIPS 140.
O programa de validação de algoritmo criptográfico (CAVP) permite a validação independente da implementação correta do algoritmo AES. A validação bem-sucedida resulta em ser listado na página de validações NIST. Este teste é um pré-requisito para a validação do módulo FIPS 140-2 descrito abaixo. No entanto, a validação CAVP bem-sucedida não implica de forma alguma que o módulo criptográfico que implementa o algoritmo seja seguro. Um módulo criptográfico sem validação FIPS 140-2 ou aprovação específica da NSA não é considerado seguro pelo governo dos EUA e não pode ser usado para proteger dados governamentais.
A validação do FIPS 140-2 é um desafio técnico e fiscal. Existe uma bateria padronizada de testes, bem como um elemento de revisão do código-fonte que deve ser aprovado por um período de algumas semanas. O custo para realizar esses testes por meio de um laboratório aprovado pode ser significativo (por exemplo, bem mais de US $ 30.000) e não inclui o tempo que leva para escrever, testar, documentar e preparar um módulo para validação. Após a validação, os módulos devem ser reenviados e reavaliados se forem alterados de alguma forma. Isso pode variar de simples atualizações de papelada, se a funcionalidade de segurança não foi alterada, à um conjunto mais substancial de novos testes, se a funcionalidade de segurança foi afetada pela alteração.

## Vetores de teste

Os vetores de teste são um conjunto de cifras conhecidas para uma determinada entrada e chave. O NIST distribui a referência de vetores de teste AES como vetores de teste de resposta conhecida (known answer test - KAT) AES.

## Desempenho

Os requisitos alta velocidade e baixo RAM foram os critérios do processo de seleção do AES. Como o algoritmo escolhido, o AES teve um bom desempenho em uma ampla variedade de hardware, desde smart cards de 8 bits à computadores de alto desempenho.
Em um Pentium Pro, a criptografia AES requer 18 ciclos de clock por byte, equivalente à uma taxa de transferência de cerca de 11 MiB / s para um processador de 200 MHz.
Em CPUs Intel Core e AMD Ryzen que suportam extensões do conjunto de instruções AES-NI, a taxa de transferência pode ser de vários GB/s (mesmo acima de 10 GB/s).
Onde o hardware da CPU não suporta aceleração AES, ChaCha é uma cifra alternativa com melhor desempenho e sem sacrificar a segurança.