El algoritmo de suma de comprobación BSD era un algoritmo de suma de comprobación heredado de uso común . Se ha implementado en BSD antiguo y también está disponible a través de la utilidad de línea de comandos de suma .
Este algoritmo es inútil desde una perspectiva de seguridad y es más débil que el CRC-32 cksum para la detección de errores. [1] [2]
Cálculo de la suma de comprobación BSD
A continuación se muestra la parte relevante del código fuente de suma de GNU (con licencia GPL ). Calcula una suma de comprobación de 16 bits sumando todos los bytes (palabras de 8 bits) del flujo de datos de entrada. Para evitar muchas de las debilidades de simplemente agregar los datos, el acumulador de suma de verificación es circular girado a la derecha un bit en cada paso antes de agregar el nuevo carácter.
int bsdChecksumFromFile ( FILE * fp ) / * El identificador de archivo para los datos de entrada * / { int checksum = 0 ; / * La suma de comprobación mod 2 ^ 16. * / for ( int ch = getc ( fp ); ch ! = EOF ; ch = getc ( fp )) { checksum = ( checksum >> 1 ) + (( checksum & 1 ) << 15 ); suma de comprobación + = ch ; suma de comprobación & = 0xffff ; / * Manténgalo dentro de los límites. * / } return checksum ; }
Descripción del algoritmo
Como se mencionó anteriormente, este algoritmo calcula una suma de verificación segmentando los datos y agregándolos a un acumulador que es circular desplazado a la derecha entre cada suma. Para mantener el acumulador dentro de los límites del valor de retorno, se realiza el enmascaramiento de bits con unos.
Ejemplo: cálculo de una suma de comprobación de 4 bits utilizando segmentos de 4 bits ( big-endian )
Entrada: 101110001110 -> tres segmentos: 1011, 1000, 1110.
Iteración 1:
segmento: 1011 suma de comprobación: 0000 máscara de bits: 1111
a) Aplicar desplazamiento circular a la suma de comprobación:
0000 -> 0000
b) Agregue la suma de verificación y el segmento juntos, aplique la máscara de bits al resultado obtenido:
0000 + 1011 = 1011 -> 1011 y 1111 = 1011
Iteración 2:
segmento: 1000 suma de comprobación: 1011 máscara de bits: 1111
a) Aplicar desplazamiento circular a la suma de comprobación:
1011 -> 1101
b) Agregue la suma de verificación y el segmento juntos, aplique la máscara de bits al resultado obtenido:
1101 + 1000 = 10101 -> 10101 y 1111 = 0101
Iteración 3:
segmento: 1110 suma de comprobación: 0101 máscara de bits: 1111
a) Aplicar desplazamiento circular a la suma de comprobación:
0101 -> 1010
b) Agregue la suma de verificación y el segmento juntos, aplique la máscara de bits al resultado obtenido:
1010 + 1110 = 11000 -> 11000 y 1111 = 1000
Suma de comprobación final: 1000
Referencias
Fuentes
- código fuente de suma oficial de FreeBSD
- página oficial del manual de suma de GNU
- página de descarga de coreutils --- busque y descomprima la versión más reciente del paquete coreutils, lea src / sum.c