O sistema AES (Advanced Encryption Standard) é o algorítimo de cifra simétrica padrão para a comunicação entre órgãos governamentais dos EUA, estabelecido pelo National
Institute of Standards and Technology (NIST), o órgão oficial do padronização daquele
país, em 2001. Trata-se de uma variante do sistema Rijndael, proposto por Joan Daemen and Vincent Rijmen, que foi vencedor do concurso lançado pelo NIST em 1997 para definir um substituto para o sistema DES [31]. O AES é também uma das cifras de bloco do padrão ISO/IEC 18033-3 [62]. Devido a sua importância como padrão de comunicação, pode-se afirmar que o AES é parte de qualquer biblioteca criptográfica atual.
O sistema Rijndael consiste em um circuito do tipo SPN (Substitution-Permutation
Network) com tamanho variável entre 128 e 256 bits (em múltiplos de 32). O padrão AES
fixa o bloco em 128 bits, e pode operar com três tamanhos de chave: 128, 192 e 256 bits. O tamanho da chave determina o número de rodadas a serem executadas no circuito. Para a chave de 256 bits (AES-256), são executadas 14 rodadas [88].
O sistema pode ser descrito a partir das seguintes rotinas:
Setup: A entrada do circuito é disposta numa matriz 4x4 de bytes, dispostos em colunas primeiro, que é chamada de matriz de estado (StateMatrix).
Então, uma subchave de 128 bits é derivada para cada rodada, utilizando o algoritmo de key scheduling (derivação cíclica de chave) KeyExpantion() de Rijndael.
Rodada inicial: a rodada inicial, consiste apenas na execução da sub-rotina AddRound- Key, usada para adicionar o conteúdo do bloco à subchave gerada para a primeira rodada. Essa sub-rotina é definida como uma caixa de mistura, na qual cada byte da matriz de estado é combinado com um bloco da subchave da rodada por meio de um xor bit-a-bit.
Rodadas intermediárias: em cada uma das próximas 13 rodadas, as seguintes sub- rotinas são executadas:
SubBytes uma caixa de substituição, na qual cada byte na matriz de estado é substituído de acordo com uma tabela fixa (uma matriz de substituição de dimensões iguais às de estado);
ShiftRows uma caixa de substituição, na qual as três últimas linhas da matriz de estado são a transpostas ciclicamente um dado número de vezes;
MixColumns uma caixa de mistura, que combina os quatro bytes de cada coluna; AddRoundKey definido acima.
Rodada final: semelhante às rodadas intermediárias, com exceção da sub-rotina Mix- Columns, que não é executada na rodada final.
O algoritmo 4.1 dá uma visão mais dinâmica dessas rotinas:
Para cifrar uma entrada menor que o tamanho da entrada do circuito, a solução trivial é preencher a sequência de bits com zeros. A segurança da cifra não pode ser afetada por esse padrão de preenchimento. Para cifrar uma sequência maior que o circuito, a primeira providência é dividi-la em blocos de tamanho igual ao da cifra, preenchendo a última parte, caso necessário. A maneira como a cifra será utilizada para cifrar esses blocos é chamada de ‘modo de operação’ da cifra e afeta drasticamente a segurança do sistema resultante.
O modo de operação mais trivial, conhecido como Electronic CodeBook ou ECB, sim- plesmente cifra cada bloco individualmente. Esse modo de operação é bastante inseguro, pois a cifra de bloco é uma função determinística e a cifragem de blocos iguais com a mesma chave resulta em resultados iguais, o que revela padrões importantes no texto plano e permite ataques de criptoanálise triviais. No modo CBC (Cipher Block Chain-
ning), o primeiro bloco é misturado a um vetor de inicialização (IV), com xor bit-a-bit,
e o resultado da cifra do primeiro bloco é utilizado como IV para o bloco seguinte, e assim por diante. Esse modo de operação é mais seguro que o modo ECB, desde que o IV introduzido no primeiro passo tenha entropia alta.
O modo de operação escolhido para este trabalho é o GCM (Galois/Counter Mode), uma extensão do modo CTR (Counter Mode), introduzido por Diffie e Hellman [34], que
Algoritmo 4.1. Rijndael
Require: fixed SubstituionMatrix
1: Nk ← 8 ⊲Número de palavras de 32 bits na chave
2: Nb ← 4 ⊲Número de palavras de 32 bits na matriz de estado
3: Nr ← 14 ⊲Número de rodadas
4: function Rijndael(StateMatrix, CipherKey)
5: subkeys ← KeyExpantion(CipherKey)
6: StateMatrix ← AddRoundKey(StateMatrix, subkeys[0]) ⊲Rodada inicial
7: for(i = 1; i < Nr; i + +) do
8: StateMatrix ← SubBytes(StateMatrix, SubstituionMatrix)
9: StateMatrix ← ShifRows(StateMatrix)
10: ifi < (Nr – 1) then
11: StateMatrix ← MixColumns(StateMatrix) ⊲Não é executada na rodada final
12: end if
13: StateMatrix ← AddRoundKey(StateMatrix, subkeys[i])
14: end for
15:
16: returnStateMatrix
17: end function
18:
19: function KeyExpantion(Key)
20: fori ← 0, (Nk – 1) do
21: W[i] ← [Key[4*i], Key[4*i+1], Key[4*i+2], Key[4*i+3]];
22: end for
23: fori = 4; i < Nb * (Nr + 1); i++ do
24: temp ← W[i - 1];
25: ifi mod Nk = 0 then
26: temp ← SubByte(RotByte(temp)) ∧ Rcon[i / Nk];
27: else if i mod Nk = 4 then
28: temp ← SubByte(temp)
29: end if
30: W[i] ← W[i - Nk] ∧ temp;
31: end for
32:
33: returnW
transforma a cifra de bloco numa cifra de fluxo com uma técnica de keystream baseada no sucessivo ciframento da combinação entre o vetor de inicialização e um contador. O CTR diminui significativamente os riscos introduzidos pela necessidade de produzir um IV forte para cada mensagem cifrada, mas deve ser implementado com cuidado, pois o
nonce que substitui o vetor de inicialização, embora não necessite de entropia alta, jamais
pode ser repetido, sob pena de enfraquecer significativamente a segurança do sistema [51]. O modo GCM adiciona à segurança do modo CTR uma função de autenticação baseada numa multiplicação sobre o campo de Galois executada a cada iteração, logo após o XOR do bloco de mensagem com o bloco de chave. A combinação dessas funções resulta num sistema robusto de criptografia autenticada. Esse modo tem outra vantagem específica, que é a capacidade de paralelização da operação de deciframento, o que o torna um sistema ideal para a leitura de grandes arquivos.
Para suprir a necessidade de geração de um nonce na implementação deste trabalho, foi adotada uma função sobre o identificador unívoco dos registros na tabela relacional onde são gravados. Note que a segurança do sistema só depende da unicidade do nonce, que é público.