Para que servem as checksums

Uma checksum é um número curto calculado a partir dos dados que muda se mudar um único bit. Quem recebe recalcula o valor e o compara com o transmitido: se forem diferentes, os dados se corromperam no caminho. O CRC-32 de “123456789” é CBF43926, o valor de verificação usado para testar uma implementação.

Cada algoritmo tem seu uso. CRC-32 é o do ZIP, do PNG e da Ethernet; CRC-32C o do iSCSI, ext4 e Btrfs; CRC-16/MODBUS o dos equipamentos industriais Modbus RTU; CRC-16/CCITT e XMODEM os de protocolos seriais e cartões; Adler-32 o da compressão zlib, mais rápido, porém mais fraco com dados curtos.

Existem tantas variantes de CRC-16 porque mudam o polinômio, o valor inicial, a reflexão de bits e o XOR final: por isso a mesma mensagem dá resultados diferentes. Se você tem um valor para conferir e não sabe o algoritmo, cole-o no campo do valor esperado e a calculadora procura o que corresponde.

Erros comuns

  • Calcular a checksum do texto em vez dos bytes: "0A" como texto são dois caracteres, como hexadecimal um único byte.
  • Confundir as variantes de CRC-16: MODBUS, ARC e CCITT dão resultados diferentes com os mesmos dados.
  • Usar CRC para conferir downloads de fontes não confiáveis: ele é fácil de falsificar; é preciso SHA-256.

Perguntas frequentes

Por que o CRC do Modbus parece ter os bytes invertidos?

O Modbus transmite o CRC com o byte menos significativo primeiro. Se o valor calculado é 4B37, na mensagem aparecem os bytes 37 4B.

Qual a diferença entre CRC-32 e CRC-32C?

Usam polinômios diferentes: o de Castagnoli (32C) detecta melhor certos erros e tem instruções próprias nos processadores modernos, por isso é preferido em armazenamento e redes rápidas.

Dois arquivos diferentes podem ter a mesma checksum?

Sim: 32 bits dão cerca de 4 bilhões de valores, então colisões por acaso acontecem com muitos arquivos, e criá-las de propósito é trivial.

Como funciona este cálculo

CRC: os dados são tratados como um polinômio sobre bits e divididos por um polinômio gerador; o resto é a checksum. Cada variante é definida por largura, polinômio, valor inicial, reflexão de entrada e saída e XOR final (por exemplo CRC-32: 32 bits, 0x04C11DB7, inicial 0xFFFFFFFF, refletido, XOR 0xFFFFFFFF). Adler-32: A = 1 + soma dos bytes, B = soma dos valores sucessivos de A, ambos módulo 65521, resultado B·65536 + A. Fletcher-16: o mesmo com módulo 255 e sem o 1 inicial.