Mini-aplicación generadora del DNI electrónico

Gracias al meneo fallido de la anotación sobre los dígitos de control del DNI a cargo de un lector, me entero de que, en 2005, un tal Josep Portella Florit abordó el problema sin conocer el texto que os enlacé donde lo explica todo, y probando, probando, logró llegar al algoritmo utilizado en dichos documentos.

También encuentro que el mismo autor realizó un pequeño programa en JavaScript para el cálculo de los dígitos de control tras introducir los datos pertinentes en un formulario. Para vuestro entretenimiento, he cogido su código y lo he modificado para adaptarlo al nuevo DNI electrónico. Aquí está:

IDESP <<<<<<
? ??? <<<<<<<<<<<

Calcular los dígitos de control del DNI

Muchas leyendas urbanas circulan por ahí acerca del significado de los misteriosos números que lleva el DNI en su reverso; en especial, trae de cabeza a mucha gente el dígito aislado situado a la derecha. Sin embargo, de misterioso no tiene nada. Si acudimos a la página oficial del nuevo DNI electrónico, deja bien claro que el campo situado en la parte trasera es información impresa OCR-B destinada a la lectura mecanizada, y está regulado por la normativa recogida en el documento 9303 de la ICAO. Y como toda información destinada a ser leída por una máquina, se incluyen ciertos dígitos de control detrás de cada uno de los campos para realizar la comprobación de que la lectura ha sido satisfactoria.

Hace cosa de un año, recuerdo que un profesor de criptografía de la universidad nos explicó el sistema que usaban para calcular estos dígitos de control. Olvidé el procedimiento y el documento 9303 donde lo explican, así como el estándar ISO 7501 en el que se convirtió, es de pago. Sin embargo, el otro día di por casualidad con una página donde recogen dicho documento 9303 llamado Machine Readable Travel Documents, Part 1 Volume 1 [PDF], que ha servido para refrescarme la memoria. Así que, aprovechando la circunstancia, paso a detallaros el cálculo de los dígitos de control.

La letra del DNI

Para empezar, explicaré cómo se extrae la letra del DNI, porque también esta letra sirve de control para comprobar que el número es correcto. Esto es más conocido y supongo que a muchos de vosotros al menos os sonará.

Básicamente se divide el número entre 23 y el resto se sustituye por una letra que se determina por inspección mediante la siguiente tabla:

RESTO 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
LETRA T R W A G M Y F P D X B N J Z S Q V H L C K E

Por ejemplo, si el número del DNI es 12345678, dividido entre 23 da de resto 14, luego la letra sería la Z: 12345678Z.

Los dígitos de control

En el DNI electrónico, el reverso tiene esta forma:

IDESPXYZ123456a12345678Z<<<<<<
990101bM111231cESP<<<<<<<<<<<d
URRUTIA<URRUTIA<<ANTXON<<<<<<<

Identifiquemos cada uno de los campos:

  1. {ID}Tipo de documento.
  2. {ESP}Nación.
  3. {XYZ123456}Número de serie del soporte.
  4. {a} Primer dígito de control, correspondiente al campo 3.
  5. {12345678Z}DNI.
  6. {<<<<<<}Relleno.
  7. {990101}Fecha de nacimiento, con el formato año/mes/día.
  8. {b} Segundo dígito de control, correspondiente al campo 7.
  9. {M}Sexo; Masculino o Femenino.
  10. {111231}Fecha de vencimiento, con el formato año/mes/día.
  11. {c} Tercer dígito de control, correspondiente al campo 10.
  12. {ESP}Nacionalidad.
  13. {<<<<<<<<<<<}Relleno.
  14. {d} Cuarto dígito de control, correspondiente a la concatenación de los campos 3, 4, 5, 7, 8, 10 y 11.
  15. {URRUTIA}Primer apellido.
  16. {<}Limitador entre apellidos.
  17. {URRUTIA}Segundo apellido.
  18. {<<}Limitador entre apellidos y nombre.
  19. {ANTXON}Nombre.
  20. {<<<<<<<}Relleno.

Para calcular el dígito de control {a}, se aplica el peso 731 (léase siete tres uno) al campo 3. Si alguno de los carácteres es una letra, se sustituye por su número correspondiente según la siguiente tabla:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

En nuestro caso, X=33, Y=34, Z=35. Decíamos que hay que aplicar el peso 731 de la siguiente manera:

   33    34   35   1   2   3    4    5   6
x   7     3    1   7   3   1    7    3   1
------------------------------------------
        231 + 102 + 35 + 7 + 6 + 3 + 28 + 15 + 6 = 433

Como veis, a cada número se le asigna el peso correspondiente y se multiplica. Después se suman todos los resultados y el dígito de control es la última cifra del total. En este caso, a=3. Para el dígito de control {b}, se repite la operación con el campo 7:

    9    9   0   1   0   1
x   7    3   1   7   3   1
--------------------------
        63 + 27 + 0 + 7 + 0 + 1 = 98

Y obtenemos que b=8. Lo mismo para el dígito {c} con el campo 10:

    1   1   1    2   3   1
x   7   3   1    7   3   1
--------------------------
         7 + 3 + 1 + 14 + 9 + 1 = 35

Obteniendo que c=5. Para terminar, el dígito de control {d} se halla de la misma manera con la concatenación indicada arriba: {3,4,5,7,8,10,11}. Recordad que hay que sustituir las letras por números según la segunda tabla.

   33  34 35 1 2 3  4  5 6  3 1 2  3  4 5  6
x   7   3  1 7 3 1  7  3 1  7 3 1  7  3 1  7
--------------------------------------------
   231+102+35+7+6+3+28+15+6+21+3+2+21+12+5+42+
    7 8  35  9 9 0 1 0 1  8 1 1 1 2  3 1 5
x   3 1   7  3 1 7 3 1 7  3 1 7 3 1  7 3 1
-------------------------------------------
        +21+8+245+27+9+0+3+0+7+24+1+7+3+2+21+3+5 = 925

Por lo tanto, d=5, y el DNI quedaría finalmente así:

IDESPXYZ123456312345678Z<<<<<<
9901018M1112315ESP<<<<<<<<<<<5
URRUTIA<URRUTIA<<ANTXON<<<<<<<

Como apunte final, los que todavía no tengáis el DNI electrónico habréis visto cómo en vuestros DNI antiguos hay un par de cambios: no existe número de serie y el número de DNI va seguido de un dígito de control que se calcula con dicho campo. Lo demás es igual.

Cómo insertar un vídeo de Youtube comenzando la reproducción en un punto concreto

Hace unas semanas publicaban los Microsiervos una forma de enlazar un vídeo de Youtube para que comenzase la reproducción en el punto que nosotros deseáramos. Una interesante característica que desconocía.

También es posible que el siguiente truco sea ampliamente conocido, pero para el que, como yo, se entere hoy, allá va: cómo realizar lo anterior en un vídeo insertado en nuestra página, como hago con la anotación anterior a esta, si os fijáis.

Las URL para insertar un vídeo de Youtube típicamente, sin opciones, tienen esta pinta:

[code]http://www.youtube.com/v/xxxxxxxxxxx[/code]

Donde las equis son una serie de carácteres alfanuméricos que identifican el vídeo en cuestión. Para que el susodicho empiece en el minuto 1:50, por ejemplo, basta con añadir lo siguiente:

[code]http://www.youtube.com/v/xxxxxxxxxxx&amp;amp;start=110[/code]

Donde 110, como podéis imaginar, es el tiempo en segundos. Así de fácil.

El diferencial

Visualicemos un vehículo de dos ruedas por eje (véase un coche) trazando un círculo completo. En realidad se estarán trazando dos círculos: uno de radio menor, recorrido por las ruedas «interiores» a la curva, y otro de radio mayor, recorrido por las ruedas «exteriores» a la curva. Esto significa que, en toda curva y en todo eje, la rueda interior recorre menos distancia que la rueda exterior. Así que, si el eje es rígido, típicamente la rueda interior patinará, puesto que el peso del vehículo se desplazará hacia la rueda exterior, obligando a que todo el eje gire a la velocidad de esta, con la subsiguiente desestabilización del vehículo.

Para solucionar este problema, se inventó el ingenioso mecanismo diferencial que, mediante engranajes, reparte el par de giro entre las dos ruedas permitiéndoles en todo momento girar a velocidades distintas. Y qué mejor manera de entenderlo que con imágenes. A continuación, un vídeo de los años 30 con una magnífica explicación del funcionamiento del diferencial (visto en haha.nu).

Ver vídeo

Los más avispados se darán cuenta de que este mecanismo, si bien soluciona lo anterior, conlleva otro problema no menos importante: la pérdida de tracción. Numerosas circunstancias (gravilla, hielo, o incluso una rueda que se levante en el aire) pueden hacer que una de las ruedas del eje pierda adherencia, con lo que el diferencial actuará proporcionando todo el par a esta rueda que girará descontrolada mientras la otra permanece inmóvil.

Los diferenciales autoblocantes están destinados a impedir esta pérdida de tracción. Diferentes implementaciones, como el diferencial Torsen o el Ferguson, consiguen que las ruedas giren a distintas velocidades hasta cierto punto, a partir del cual el par de giro se concentra sobre la rueda de mayor tracción, mitigando así el defecto del mecanismo diferencial. Este tipo de diferenciales son caros y se utilizan fundamentalmente en vehículos de altas prestaciones y de competición. En el resto, han sido sustituidos por los sistemas de control electrónico de tracción.

WPA tocado por segunda vez

Diversas fuentes afirman que «Toshihiro Ohigashi de la Universidad de Hiroshima y Masakatu Morii de la Universidad de Kobe han llevado a la práctica la demostración teórica  de la vulnerabilidad de WPA/TKIP que el año pasado se desveló en la conferencia PacSec», además de que, mediante este ataque, son capaces de «recuperar la clave WPA en cuestión de minutos». Pero que no cunda el pánico, todavía…

Ya hablábamos hace casi un año del ataque propuesto por Erik Tews y Martin Beck, que, por cierto, no tenía nada de teórico. Dicho ataque —que fue incluso implementado en una herramienta de la suite Aircrack-ng llamada tkiptun—, recordemos, era capaz de interceptar el tráfico dirigido al cliente y hallar mediante ChopChop unos cuantos bytes de keystream que permiten mandar paquetes encriptados falsos al cliente sin hallar la clave de encriptación. Recientemente, el método fue investigado y mejorado por la Norwegian University of Science and Technology para que produjese un keystream 10 veces mayor, lo que implica la capacidad de inyectar paquetes de mayor tamaño.

Ahora, los investigadores japoneses citados al comienzo, efectivamente han introducido nuevas mejoras al ataque que amplian su espectro de aplicación, pero en esencia sigue siendo lo mismo y sigue teniendo el mismo calado. La mejora principal radica en que este nuevo ataque no tiene la limitación del anterior, el cual sólo funcionaba sobre protocolos WPA con características de calidad de servicio habilitadas (IEEE802.11e QoS). Mediante la aplicación del ataque MITM, han conseguido eliminar esta restricción, convirtiéndose en una posible víctima cualquier implementación de WPA. La segunda mejora es el tiempo de ejecución. El ataque de Tews y Beck se completaba en unos 12-15 minutos, mientras que el nuevo, teniendo esta cota como máxima, consigue rebajar el tiempo hasta 1 minuto en el mejor de los casos.

Cierto es que WPA sufre un nuevo golpe y que esta capacidad para inyectar paquetes, utilizada por expertos, puede ser usada para realizar múltiples fechorías (léase la tesis de la universidad noruega enlazada anteriormente), pero es falso que se consiga la clave WPA. Sigue siendo un sistema robusto en este sentido y el único ataque posible para averiguar la clave sigue siendo por fuerza bruta.

Ohigashi y Morii realizarán una demostración de todo esto en la PacSec Conference de este año. Estaremos atentos.