Um algoritmo de bloco é, na verdade, uma novidade trazida pelo uso do computador. De fato, todos os algoritmos históricos, até mesmo os usados em guerras como o implementado pela máquina Enigma, não podem ser considerados como de bloco, mas sim como de fluxo.
Em um algoritmo de bloco um bloco de determinado tamanho deve ser cifrado de cada vez. Não é possível cifrar menos do que o tamanho de um bloco.
Em outras palavras, se estou usando um algoritmo de bloco e neste algoritmo o bloco possui 16 letras de tamanho, eu só posso cifrar 16 letras, nem 15 e nem 17. Se ocorrer o fato de precisar cifrar 15 letras ou eu espero a chegada de mais uma letra para ser cifrada ou serei obrigado a inserir uma letra a mais de lixo (chamada de
padding).
Se neste hipotético algoritmo de 16 letras como tamanho de bloco eu precisar cifrar 35 letras, terei que dividí-las em pedaços de 16, criando três blocos, os dois primeiros com 16 letras (o que somam 32 letras) e um terceiro bloco com 3 letras + 13 de
padding.
A característica de um algoritmo simétrico de bloco é que ele é executado igualmente bloco a bloco, ou seja, o conjunto de operações matemáticas envolvendo a chave é repetido a cada bloco, como demonstra a Figura 1 no caso de um arquivo.
No caso da cifra da Figura 1, o tamanho do bloco é 64 bits (8 bytes ou, se for um texto ascii normal, seriam 8 letras). Como o arquivo não é múltiplo de 64 bits, uma "sujeira", chamada de padding, precisou ser inserida para que ele fosse formado por exatos 5 blocos. Cabeçalhos inseridos no arquivo cifrado devem informar qual foi o algoritmo de cifra usada, qual o tamanho de bloco e qual o tamanho real do arquivo para que no ato da decifragem o padding seja descartado.
Como exemplos de algoritmos simétricos pode-se citar o DES e o AES. O DES é um algoritmo de bloco de 64 bits, ou seja, cifra-se 64 bits de cada vez. A chave usada no DES é de 56 bits, mas para que ela fique do mesmo tamanho de um bloco, 8 bits adicionais de paridade são inseridos. Como estes bits são previsíveis eles não aumentam em nada a complexidade de um força bruta que no caso é de 2
56 possíveis chaves. O DES já é considerado ultrapassado devido ao seu tamanho de chave muito reduzido que. embora ainda demorado para quebrar em um PC caseiro, já não fornece mais segurança.
O AES é um algoritmo de bloco de 128, 192 ou 256 bits. Em sua versão mais "fraquinha", a informação é dividida em blocos de 128 bits de tamanho (16 bytes) e o esquema segue do mesmo jeito como apresentado na Figura 1.
Os algoritmos de bloco possuem um inconveniente quando se pensa em utilizá-los para a comunicação de dados. Se minha intenção é cifrar um arquivo que já se encontra em meu disco, não há problema algum. Porém considere a utilização do AES de bloco (16 bytes) como parte de um protocolo de comunicação instantânea, como ICQ por exemplo. O usuário digita: "OI" e pressiona ENTER.
Neste momento eu tenho apenas três bytes para serem enviados que são 'O' 'I' '\n', ou seja, as duas letras digitadas e a informação da quebra de linha. São apenas 3 bytes, mas eu preciso de 16 para poder cifrar, no mínimo o tamanho de um bloco. Esperar mais caracteres não é uma solução, pois o usuário pode só voltar a digitar depois de obter uma resposta ao seu "OI". Se realmente estivermos usando um algoritmo de bloco, só nos resta a desagradável solução de preencher 12 bytes de lixo, compondo o padding para formar um bloco cifrável. Posso, a título de exemplo e baseado em C, cifrar a string
'O' 'I' '\n' 0 'X' 'X' 'X' 'X' 'X' 'X' 'X' 'X' 'X' 'X' 'X' 'X'
Ou ou seja, indicando através de um ZERO que acabou e colocando outras letras até fecharem 16, letras estas que serão ignoradas na decifragem.
A técnica descrita acima, embora perfeitamente viável, consome muitos recursos, sejam de largura de banda ou de processamento para cifrar e decifrar lixo. Ai entram os algoritmos de fluxo para nos salvar.