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!