Blowfish
Na criptografia, Blowfish é uma cifra simétrica de blocos que pode ser usado em substituição ao DES, algoritmo que possuía em torno de 19 anos de uso,e era vulnerável a ataques por força bruta devido ao tamanho de sua chave, ou em substituição ao IDEA. O Blowfish apresenta uma rede de Feistel de 16 iterações com tamanho de bloco de 64-bits, uma chave que pode variar entre 32 a 448-bits, e S-boxes altamente chaves-dependentes, tornando-o ideal para aplicações tanto domésticas, quanto comerciais. O Blowfish foi desenvolvido em 1993 por Bruce Schneier como uma alternativa grátis mais rápida para os algorítmos criptográficos existentes. Desde então ele vem sendo analisado de forma considerável e está conquistando a aceitação do mercado como um algoritmo forte. O Blowfish não é patenteado, tem sua licença grátis e está a disposição para todos.
Imagem: HereIsTom · BY-NC-ND · Openverse
Blowfish é uma cifra de blocos simétrica que encripta dados em blocos de tamanho 8 bytes e possui uma chave de tamanho variável entre 32 a 448 bits, com subchaves previamente computadas, cada subchave é uma hash simples da chave, não possui estruturas lineares, possui uma implementação de simples entendimento. O algoritmo faz uso da rede de Feistel de 16 iterações onde cada iteração consiste em uma permutação da chave-dependente, e uma substituição da chave-dado dependente. A rede de Feistel é uma estrutura simétrica usada na construção de cifras de blocos responsável por transformar qualquer função (normalmente denominada de função-F) em uma permutação, mapeando uma string de entrada para uma string de saída. Antes de demonstrar o funcionamento de uma rede de Feistel, deve-se mostrar duas fortes definições: Uma rede de Feistel funciona da seguinte maneira:
Imagem: Jeff Krause Photography · BY-NC-ND · Openverse
O algoritmo consiste de duas partes: expansão de chaves e encriptação dos dados. Expansão de chaves converte uma chave de até 448 bits em vários arrays de subchaves totalizando 4168 bytes. Encriptação ocorre via 16 iterações da rede de Feistel, cada iteração consiste de uma permutação da chave dependente, e uma substituição de chave-dado dependente. Todas as opraçoes são XORs e ADD em palavras de 32 bits. Cada S-box aceita um input de 8-bits e o funcionamento das quatro resulta em um output de 32-bits. Apesar do complexo algoritmo de inicialização, o Blowfish tem grande eficiência com os microprocessadores atuais. A fim de aumentar sua eficiência, foi escolhido usar na confecção deste algoritmo funções simples para os microprocessadores, tais como XOR, adição e multiplicação modular.
Sub-chaves
Blowfish faz uso de um grande número de subchaves. Estas subchaves devem ser pre-computadorizadas antes de qualquer encriptação ou desencriptação.
Criação das sub-chaves
No total, serão feitas 521 iterações apenas para gerar as sub-chaves. A fim de tornar a utilização do algoritmo mais simples, é sugerido que os aplicativos guardem essas sub-chaves geradas, ao invés de fazer esse complexo processo múltiplas vezes.
Cifragem
"Algoritmo para encriptação, input x = (plaintext de 64-bits): O texto cifrado será a união desses dois grupos (xL xR). Para encriptação/desencriptação, a função F divide o input de 32-bits em 4 pedaços de 8-bits que serão usados como entrada nas S-boxes: O processo de obtenção do texto original a partir do cifrado é feito da mesma forma, porém utilizando a matriz P em ordem inversa."
Imagem: Exobiotic · BY-SA · Openverse
Blowfish é uma das cifras mais rápidas em uso, exceto ao mudar chaves. Cada chave nova requer o pre-processamento equivalente a encriptação de aproximadamente 4 kilobytes do texto, o que é muito lento se comparado a outras cifras. Isto impede seu uso em determinadas aplicações, mas não é um problema em outras. Em algumas aplicações é realmente um benefício: o método da troca de senha usado em OpenBSD usa um algoritmo derivado de Blowfish que emprega a programação de chave lenta; a ideia é que o esforço computacional extra requerido dá a proteção de encontro aos ataques de dicionário. Em algumas execuções, Blowfish tem uma exigência relativamente grande da memória (acima de 4 kilobytes). Este não é um problema mesmo para computadores menores e mais velhos ou laptops, mas impede o uso em sistemas menores tais como smartcards. Alguns exemplos que fazem uso do Blowfish: Bibliotecas que implementam o algoritmo:


