Josep Portella
Desmitificando los números del DNI
Septiembre de 2005
Actualizado: julio y agosto de 2011
Esta obra está bajo una licencia de
Atribución-SinDerivadas 3.0 Creative Commons.
Contenido
Introducción
Todos nos hemos fijado alguna vez en los misteriosos caracteres que hay en la parte posterior de nuestro DNI:
IDESPABC123456012345678Z<<<<<<
7410150M0903226ESP<<<<<<<<<<<9
DE<TAL<Y<CUAL<<FULANITO<<<<<<<
Existe un mito que dice que el último dígito de la segunda línea indica el número de personas que tienen el mismo nombre y apellidos que el portador. La finalidad de este artículo es demostrar que no es así.
Esta zona del DNI está compuesta por caracteres OCR, es decir, está preparada para ser leída por máquinas. Ese dígito en concreto es sólo un dígito de control para verificar que se han leído correctamente los datos.
A continuación se van a identificar cada uno de los campos que forman la zona de datos OCR y se va a explicar el algoritmo utilizado para el cálculo de los dígitos de control.
Identificación de los campos
La zona de datos OCR del DNI electrónico se puede dividir en diversos campos:
1.[ID] 2.[ESP] 3.[ABC123456] 4.[0] 5.[12345678Z] 6.[<<<<<<]
7.[741015] 8.[0] 9.[M] 10.[090322] 11.[6] 12.[ESP] 13.[<<<<<<<<<<<] 14.[9]
15.[DE<TAL<Y<CUAL<<FULANITO<<<<<<<]
- Tipo de documento
- Nación
- Número de serie del soporte físico de la tarjeta
- Dígito de control del campo 3
- Número de DNI
- Relleno
- Fecha de nacimiento (
AAMMDD
) - Dígito de control del campo 7
- Sexo (
M
/F
) - Fecha de caducidad
- Dígito de control del campo 10
- Nacionalidad
- Relleno
- Dígito de control de los campos 3, 4, 5, 7, 8, 10 y 11 concatenados
- Nombre
En el DNI tradicional los campos son distintos:
1.[ID] 2.[ESP] 3.[12345678Z] 4.[3] 5.[<<<<<<<<<<<<<<<]
6.[741015] 7.[0] 8.[M] 9.[090322] 10.[6] 11.[ESP] 12.[<<<<<<<<<<<] 13.[4]
14.[DE<TAL<Y<CUAL<<FULANITO<<<<<<<]
- Tipo de documento
- Nación
- Número de DNI
- Dígito de control del campo 3
- Relleno
- Fecha de nacimiento (
AAMMDD
) - Dígito de control del campo 6
- Sexo (
M
/F
) - Fecha de caducidad
- Dígito de control del campo 9
- Nacionalidad
- Relleno
- Dígito de control de los campos 3, 4, 6, 7, 9 y 10 concatenados
- Nombre
Cálculo de los dígitos de control
Los dígitos de control se generan a partir de otros campos a los
cuales se les aplica un algoritmo sencillo. Primero se ha de separar
por caracteres, por ejemplo, si el valor del campo es
12345678Z
:
1 2 3 4 5 6 7 8 Z
Si alguno de los caracteres es una letra, se ha de cambiar por su valor numérico:
A 0 F 5 K 10 P 15 U 20 Z 25
B 1 G 6 L 11 Q 16 V 21
C 2 H 7 M 12 R 17 W 22
D 3 I 8 N 13 S 18 X 23
E 4 J 9 O 14 T 19 Y 24
Así que tenemos:
1 2 3 4 5 6 7 8 25
A estos números se les ha de aplicar el peso 7-3-1
, lo que significa
que se han de multiplicar por 7
, por 3
o por 1
dependiendo de su
posición:
1 2 3 4 5 6 7 8 25
7 3 1 7 3 1 7 3 1
--------------------------
7 6 3 28 15 6 49 24 25
A continuación se han de sumar los resultados de todas las multiplicaciones:
7 + 6 + 3 + 28 + 15 + 6 + 49 + 24 + 25 = 163
El dígito de control es el último dígito del resultado de la suma, 3
en este caso.
Implementación del algoritmo
Aquí se incluye una implementación del algoritmo escrita en el lenguaje de programación C.
La función check_digit
definida a continuación recibe un parámetro
de tipo char *
que debe apuntar a una cadena que contiene dígitos
y/o letras. Devuelve un int
entre 0
y 9
que es el dígito de
control de la cadena. En caso de encontrar un carácter no válido,
devuelve -1
.
#include <ctype.h>
int
check_digit(char *s)
{
static int m[3] = { 7, 3, 1 };
int i, n;
for (i = n = 0; s[i] != '\0'; i++)
if (isdigit(s[i]))
n += (s[i] - '0') * m[i % 3];
else if (isalpha(s[i]))
n += (toupper(s[i]) - 'A') * m[i % 3];
else
return -1;
return n % 10;
}
Prueba de concepto
Si tienes un DNI electrónico, rellena los siguientes campos con el número de serie del soporte físico de tu DNI, tu número de DNI, la fecha de tu nacimiento y la fecha de caducidad de tu DNI tal como aparecen en el reverso de tu DNI. Los dígitos de control se rellenarán automáticamente.
En cambio, si tienes un DNI tradicional, rellena los siguientes campos con tu número de DNI, la fecha de tu nacimiento y la fecha de caducidad de tu DNI tal como aparecen detrás de tu DNI.
La próxima vez que escuches la leyenda urbana de que el número del reverso del DNI indica el número de personas que tienen el mismo nombre y apellidos que tú, ¡explícales que no es así!
Historia
En el año 2005, cansado de escuchar el mito de los números del DNI, decidí buscar la solución al enigma: ¿si no es el número de personas con tu nombre y apellidos, qué es entonces?
Antes de saber nada sobre el origen de los dígitos de control o saber con certeza si realmente lo eran, ya pensaba que no era probable que ese dígito fuese lo que decían. No parecía práctico introducir un dato que depende de tantos factores externos al portador del documento, ya que podría volverse obsoleto con facilidad y no tendría ningún valor. Si de verdad necesitasen saber ese dato, lo ideal sería consultarlo en una base de datos.
Leí sobre la posibilidad de que fuesen dígitos de control en un weblog y me pareció razonable. Lo que parecía más seguro era que el dígito que seguía a la fecha de nacimiento y a la de caducidad se calculaba a partir de la fecha, y mi investigación se basó en eso.
Gracias a mis amigos, me hice con unas cuantas muestras que comparar. Intenté aplicar varios algoritmos comunes para obtener dígitos de control, pero no tuve éxito.
Un día pude comparar dos fechas que se diferenciaban sólo en el
segundo dígito. Suponiendo que el algoritmo funcionaba con un sistema
de pesos (números con los cuales se han de multiplicar los valores
según sus posiciones), una suma y extracción del ultimo dígito, deduje
que el peso de la segunda posición era un 3
.
Decidí afrontar el problema por fuerza bruta, ya que parecía posible.
Sólo había 10 valores distintos y 6 posiciones, así que hice un
script que aplicaba todas las combinaciones de pesos posibles y
comprobaba el resultado con todas las muestras que tenía. Salió bien
y obtuve los pesos, 7-3-1
.
Así que ya sabía cómo obtener el dígito de control de las fechas, pero
había un problema para aplicarlo con el dígito que seguía el número
del DNI en la primera línea. Ese número contenía una letra, y por
tanto, tuve que descubrir cómo se obtenía su valor numérico. Tras
pocas pruebas obtuve la respuesta: A=0
, B=1
… Z=25
.
Sólo faltaba el último dígito, el que me motivó a empezar esta investigación. El problema era que al estar separado de los demás datos su origen no era obvio.
Estuve un tiempo haciendo pruebas y no daba con un resultado exacto.
Finalmente leí una referencia a cierto documento, 9303 de la ICAO, que supuestamente explicaba todo esto. No pude
tener acceso a dicho documento, ya que entonces no estaba disponible
online, pero encontré documentos explicando el
sistema de pesos 7-3-1
y su aplicación en pasaportes, citando como
fuente el documento 9303. Pero los datos OCR del pasaporte tienen
un formato distinto al del DNI, así que no conseguí la solución, pero
obtuve una pista: el último dígito de control de los datos OCR de un
pasaporte se calcula de la misma forma que los demás dígitos de
control explicados en este documento, pero su origen es una selección
de los datos anteriores; leí que el sexo y la nacionalidad no se veían
reflejados en ese dígito de control, y entonces me di cuenta de por
qué todavía no había encontrado la respuesta: en las pruebas que había
hecho siempre incluía el carácter del sexo. Así que al probar sólo
con los dígitos de control y sus campos asociados conseguí
coincidencia en todas las muestras.
Seis años después todavía no disponía de DNI electrónico, pero pude analizar unas muestras que me prestaron amablemente. Comparando un DNI electrónico con un DNI tradicional vi que la primera línea de los datos OCR había cambiado de formato; había algo más antes del número del DNI, que identifiqué como el número de serie que aparece en la parte delantera y su dígito de control; además el número del DNI ya no tenía dígito de control detrás. Seguidamente hice un par de pruebas y di con la nueva forma de calcular el dígito de control.