• No results found

Achieving Confidentiality in Cloud Storage

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.