Criptografia Modos de Operação

Resumão

Exitem diversos modos de operação de criptografia com os quais podemos utilizar cifras de blocos, como a Criptografia AES.

Cada um tem suas características, que os fazem mais ou menos adequados para certas aplicações.

Os modos de operação mais comuns são: ECB, CBC, OFB, CFB, CTR.

EBC – Electronic Codebook

Livro Eletrônico de Códigos.

Cada chave criptográfica possui um livro de códigos, que relaciona dados plenos com dados cifrados. Este modo de operação é o mais simples, mas dificilmente é recomendado.

Encriptar:
Ci = EK(Pi)

Para n blocos, envia-se:
C1, C2, …, Cn

Decriptar:
Pi = DK(Ci)

Note que este modo revela igualdade igualdade de blocos.

Este modo exige que as mensagens sejam de tamanho divisível pelo tamanho do bloco (16 bytes para AES). Caso contrário, a mensagem deve ser preenchida (padding). [TODO Link padding.]

CBC – Cipher Block Chaining

Cadeia de Blocos Cifrados.

Os dados plenos Pi são misturados (XOR) com a cifra Ci-1 do bloco anterior antes de encriptar.

Encriptar:
C0 = EK(IV)
Ci = EK(Pi XOR Ci-1)

Para n blocos, envia-se:
IV, C1, C2, …, Cn

Decriptar:
C0 = EK(IV)
Pi = DK(Ci) XOR Ci-1

Este modo utiliza um vetor de inicialização (IV) que deve ser um número utilizado apenas uma vez (nonce) para cada chave K, ou seja, cada mensagem criptografada com a chave K precisa de um IV diferente. O IV não precisa ser secreto, pode ser transmitido junto com a mensagem.

Se repetir o mesmo IV os dados cifrados revelam igualdade dos primeiros blocos e a diferença (XOR) do primeiro bloco diferente. Conhecendo uma mensagem, revela-se a outra, exceto depois do bloco diferente. Isso no melhor dos casos, ou seja, com uma cifra ideal. Algumas cifras são extremamente fracas caso houver repetição de IV.

Note que o primeiro bloco cifrado é misturado com C0, que é o IV encriptado. Não se envia C0.

Este modo, assim como ECB, também exige que as mensagens sejam de tamanho divisível pelo tamanho do bloco ou que o último bloco seja preenchido (padding).

OFB – Output Feedback

Realimentação da saída.

Este modo transforma uma cifra de blocos (block cipher) em uma cifra de corrente (stream cipher).

Os dados plenos Pi são misturados (XOR) com a fonte pseudo-aleatória Oi-1 para realizar a encriptação.

Encriptar:
O0 = EK(IV)
Oi = EK(Oi-1)
Ci = Pi XOR Oi-1

Para n blocos, envia-se:
IV, C1, C2, …, Cn

Decriptar (idêntico a encriptar):
O0 = EK(IV)
Oi = EK(Oi-1)
Pi = Ci XOR Oi-1

Este modo utiliza um vetor de inicialização (IV) que deve ser um número utilizado apenas uma vez (nonce) para cada chave K, ou seja, cada mensagem criptografada com a chave K precisa de um IV diferente. O IV não precisa ser secreto, pode ser transmitido junto com a mensagem.

Se repetir o mesmo IV os dados cifrados revelam igualdade dos blocos e a diferença (XOR) dos blocos diferentes. Conhecendo uma mensagem, revela-se a outra. [Novamente… Isso no melhor dos casos, ou seja, com uma cifra ideal. Algumas cifras são extremamente fracas caso houver repetição de IV.]

Este modo não exige preenchimento (padding). Se o último bloco não está completo com dados plenos, podemos enviar apenas estes bytes encriptados de Cn, ignorando o restante dos bytes. Note que isso revela o tamanho da mensagem. Se o tamanho da mensagem deve ser secreto ou obfuscado é necessário realizar o preenchimento (padding).

CFB – Cipher Feedback

Realimentação de cifra.

Este modo transforma uma cifra de blocos (block cipher) em uma cifra de corrente (stream cipher).

Os dados plenos Pi são misturados (XOR) com a cifra anterior Ci-1 para realizar a encriptação.

Encriptar:
C0 = IV
Ci = Pi XOR EK(Ci-1)

Para n blocos, envia-se:
IV, C1, C2, …, Cn

Decriptar (idêntico a encriptar):
C0 = IV
Pi = Ci XOR EK(Ci-1)

Este modo utiliza um vetor de inicialização (IV) que deve ser um número utilizado apenas uma vez (nonce) para cada chave K, ou seja, cada mensagem criptografada com a chave K precisa de um IV diferente. O IV não precisa ser secreto, pode ser transmitido junto com a mensagem.

Como no modo CBC, se repetir o mesmo IV os dados cifrados revelam igualdade dos primeiros blocos e a diferença (XOR) do primeiro bloco diferente. Conhecendo uma mensagem, revela-se a outra, exceto depois do bloco diferente. [Novamente… Isso no melhor dos casos, ou seja, com uma cifra ideal. Algumas cifras são extremamente fracas caso houver repetição de IV.]

Este modo não exige preenchimento (padding). Se o último bloco não está completo com dados plenos, podemos enviar apenas estes bytes encriptados de Cn, ignorando o restante dos bytes. Note que isso revela o tamanho da mensagem. Se o tamanho da mensagem deve ser secreto ou obfuscado é necessário realizar o preenchimento (padding).

Outros modos

Existem ainda outros modos de operação.

CTR (Counter): Usa um nonce (número usado apenas uma vez) em conjunto com um contador para gerar uma sequência pseudo-aleatória e realizar XOR com os dados plenos (parecido com o que acontece nos modos OFB e CFB).

CFB “parcial”: É possível usar blocos menores do que o bloco da cifra no modo CFB.

Links Externos

Wikipedia Block Cipher Modes of Operation

NIST Recommendation for Block Cipher Modes of Operation

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 *