domingo, 3 de março de 2013

Calculando CRC-32

Vocês já tiveram que calcular o CRC alguma vez? Eu precisei implementar poucas vezes. É digo que é bem chato de fazer a conta na mão e só um pouco melhor de implementar um algoritmo eficiente. Mas o Java já fornece isto para nós, o mais difícil é perceber que a classe está em java.util.zip!!

Dêem uma olhada na documentação no site.

Para quem ainda não sabe o que é CRC - ele é uma sigla que vem do inglês Cyclic redundancy check (quer dizer: verificação de redundância cíclica). É uma espécie de código detector de erros, que gera um valor expresso em poucos bits em função de um bloco maior de dados (que é o que queremos verificar, no nosso caso um arquivo). Com isto se transmitimos um arquivo para alguém e mandamos junto o CRC, o destinatário pode detectar erros de transmissão ou armazenamento comparando o valor que ele calcula no arquivo recebido com o CRC que também recebeu.

Notem que isto não garante qualquer integridade da mensagem. Não estamos falando de segurança de dados. Um atacante pode facilmente forjar uma mensagem, gerar um CRC e mandar para você. A única coisa que você consegue é saber se os bytes foram recebidos ok.

Se você quiser saber mais sobre o CRC dê uma olhada neste link da wikipedia (é o texto em inglês, o em português é muito pobre). Você pode ainda dar uma olhada na RFC 1952.

Vamos a nossa classe. O processo em Java é bastante simples e consiste de três etapas:

  1. criamos a classe
  2. chamamos uma (ou diversas vezes) o método update()
  3. chamamos getValue() para obter o CRC

Abaixo a nossa classe comentada:

Queria destacar aqui um método que ainda não utilizei neste blog. É Files.readAllBytes() - ele permite ler todos os bytes de um arquivo na forma de um array. Com isto economizo a chamada para java.io.FileInputStreamjava.io.BufferedInputStream.

Vamos rodar sobre os nossos arquivos:

PS: para aqueles curiosos, estou usando um ambiente muito light feito em Java chamado DrJava toda vez que desenvolvo uma classe pequena e simples. É um único arquivo jar que deixo no meu Skydrive, assim quando vou escrever algo para este blog, basta acessá-lo, rodar e pronto... funciona no linux (estou agora nesta plataforma), em windows e mac.

Nenhum comentário:

Postar um comentário