El algoritmo de Luhn o fórmula de Luhn , también conocido como algoritmo « módulo 10» o «mod 10» , llamado así por su creador, el científico de IBM Hans Peter Luhn , es una fórmula de dígito de control simple que se utiliza para validar una variedad de números de identificación. Se describe en la patente estadounidense 2950048A, otorgada el 23 de agosto de 1960. [1]
El algoritmo es de dominio público y su uso está muy extendido en la actualidad. Está especificado en la norma ISO/IEC 7812-1 . [2] No está pensado para ser una función hash criptográficamente segura ; fue diseñado para proteger contra errores accidentales, no contra ataques maliciosos. La mayoría de las tarjetas de crédito y muchos números de identificación gubernamentales utilizan el algoritmo como un método simple para distinguir números válidos de números mal escritos o incorrectos.
El dígito de control se calcula de la siguiente manera:
Supongamos un ejemplo de un número de cuenta 1789372997 (solo la "carga útil", dígito de control aún no incluido):
La suma de los dígitos resultantes es 56.
El dígito de control es igual a .
Esto hace que el número de cuenta completo sea 17893729974.
El algoritmo de Luhn detectará todos los errores de un solo dígito, así como casi todas las transposiciones de dígitos adyacentes. Sin embargo, no detectará la transposición de la secuencia de dos dígitos del 09 al 90 (o viceversa). Detectará la mayoría de los posibles errores gemelos (no detectará 22 ↔ 55 , 33 ↔ 66 o 44 ↔ 77 ).
Otros algoritmos de dígitos de control más complejos (como el algoritmo de Verhoeff y el algoritmo de Damm ) pueden detectar más errores de transcripción. El algoritmo Luhn mod N es una extensión que admite cadenas no numéricas.
Debido a que el algoritmo opera con los dígitos de derecha a izquierda y los dígitos cero afectan el resultado solo si provocan un cambio de posición, rellenar con ceros el comienzo de una cadena de números no afecta el cálculo. Por lo tanto, los sistemas que rellenan con un número específico de dígitos (al convertir 1234 en 0001234, por ejemplo) pueden realizar la validación de Luhn antes o después del relleno y lograr el mismo resultado.
El algoritmo apareció en una patente de los Estados Unidos [1] para un dispositivo mecánico portátil y simple para calcular la suma de comprobación. El dispositivo tomaba la suma módulo 10 por medios mecánicos. Los dígitos de sustitución , es decir, los resultados del procedimiento de duplicación y reducción, no se producían mecánicamente. En cambio, los dígitos se marcaban en su orden permutado en el cuerpo de la máquina.
La siguiente función toma un número de tarjeta, incluido el dígito de control, como una matriz de números enteros y genera como resultado verdadero si el dígito de control es correcto, falso en caso contrario.
función isValid(númeroDeTarjeta[1..longitud]) suma := 0 paridad := longitud mod 2 para i de 1 a longitud hacer si i mod 2 != paridad entonces suma := suma + cardNumber[i] De lo contrario, si cardNumber[i] > 4 , entonces suma := suma + 2 * cardNumber[i] - 9 demás suma := suma + 2 * cardNumber[i] fin si fin para devolver cardNumber[longitud] == ((10 - (suma mod 10)) mod 10) fin función
El algoritmo de Luhn se utiliza en una variedad de sistemas, incluidos: