Cifrado de archivos PDF

¿Es seguro proteger un PDF con el número (y letra) del DNI?

Spoiler: Es absolutamente seguro que se descifra en menos de 5 minutos con un ordenador lento.

Tengo un correo de GMail con un nombre sencillo, por lo que es bastante común que la gente dé mi correo en vez del suyo. A este correo me han llegado cosas que ni imaginaríais que se «pueden» enviar por email.

La sorprendente lista de cosas que me llegan:

Así, que recuerde de forma rápida, lo más sorprendente ha sido: bases de datos corruptas de hoteles, listados de teléfonos, categorías profesionales (y creo que salarios) de un servicio de policía de un país latinoamericano, expediente disciplinario a una policía del mismo país, los planos del edificio Torrespaña para hacer una reforma a los platós del ¿telediario?, extractos bancarios y de tarjetas de crédito, contratos con compañías eléctricas…

Evidentemente procuro borrar todo cuanto antes y avisar al destinatario o a la persona implicada, pero a veces lo ponen bastante complicado con direcciones de tipo noreply / noresponder (no supervisadas) o si llamo a la empresa, me dicen que no van a buscar por email (sic) y que voy a seguir recibiéndolos.

La última con una dirección de no-reply ha sido Mapfre, que prudentemente y antes de enviar la documentación para la renovación, la cifra con contraseña. Pero no todo es oro lo que reluce y como bien ponen:

Sin más pistas y dado que tengo nombre compuesto y habían acertado con él (no especificaban apellidos) miré si era para mi, dado que había pedido un presupuesto hacía poco a esta compañía. Al ver que no se abre y por si acaso se hubiesen confundido (o de email con otro cliente o escribiendo mi DNI y fuese realmente para mi) busco como descifrar un PDF.

Un archivo PDF puede tener dos tipos de claves: Una de usuario (user) necesaria para abrir el archivo, ya que lo cifra y lo protege y otra de propietario (owner) para proteger sus propiedades: copiar, imprimir… que básicamente no sirve de nada salvo molestar.

No voy a entrar en la longitud y tipo de cifrado, si es un PDF nuevo, debería estar protegido con un cifrado AES-256 al menos, este artículo es menos técnico, simplemente me centro en claves inseguras.

Las herramientas necesarias para descifrar PDF

Bajo GNU/Linux, en cualquier sabor de debian/ubuntu debería poderse instalar una herramienta llamada pdfcrack:

sudo apt install pdfcrack

Esa herramienta permite utilizar un diccionario mediante el parámetro: –wordlist=fichero.txt

Por no complicarme con otras herramientas o coger la que tengo más a mano (otras permiten especificar el formato de la contraseña) escribo un sencillo script en Python que guarda en un fichero todos los números con letra de DNI españoles:

fichero = open("lista_dni_letras.txt", "w")
letras='TRWAGMYFPDXBNJZSQVHLCKE'
for dni in range(0,100000000):
    dni_texto=str(dni).zfill(8) + letras[dni%23]
    fichero.write(dni_texto)
fichero.close()

Ese fichero ocupa aproximadamente 1 GB. Pues bien, una vez generado (~1 o 2 minutos si tienes un disco SSD normal) se lo pasamos al programa:

pdfcrack --wordlist=lista_dni_letras.txt MAPFRE_ARD_NUMEROS_NUMEROS.pdf

En aproximadamente 5 minutos tenía la clave.

El problema no es exclusivo de Mapfre. Muchos servicios (incluyendo servicios médicos, especialmente las revisiones del trabajo) envían de este modo los archivos, para añadir una capa de «seguridad». Esta «seguridad» está basada en que no todo el mundo es informático, sin embargo además existen multitud de páginas que descifran la clave de cualquier PDF.

Desde aquí mi granito de arena para que envíen una contraseña SEGURA por otro medio (por ejemplo SMS, aunque no sea seguro tampoco al 100%) ya que de este modo, si se pone una frase de seis palabras, aunque se confundan al enviar los datos a un email, es muy difícil que también le llegue a la misma persona a su teléfono la clave.

Me imagino la retórica en las empresas: ¡No quiero complicar a mi cliente! Pues paga más y lo llamas ¿No te coge el teléfono? ¡Envíale una carta! ¿Te cuesta dinero? Más te puede costar una multa de la AGPD.

Cálculo del tiempo necesario para descifrar una clave basada en DNI

Tengo un «viejo» Intel i5 de 8ª generación en un portátil, con él he podido probar una media de 48.000 claves por segundo. Si tenemos en cuenta que existen 100.000.000 combinaciones posibles, esto da que, como mucho llevará ~ 2083 segundos, es decir ~ 35 minutos probar todo.

Datos EXIF

$ exiftool -a -G1 MAPFRE_ARD_NUMEROS_NUMEROS.pdf
[ExifTool] ExifTool Version Number : 12.40
[ExifTool] Warning : Document is password protected (use Password option)
[System] File Name : MAPFRE_ARD_NUMEROS_NUMEROS.pdf
[System] Directory : .
[System] File Size : 100 KiB
[System] File Modification Date/Time : (eliminado)
[System] File Access Date/Time : (eliminado)
[System] File Inode Change Date/Time : (eliminado)
[System] File Permissions : -rw-rw-r--
[File] File Type : PDF
[File] File Type Extension : pdf
[File] MIME Type : application/pdf
[PDF] PDF Version : 1.4
[PDF] Linearized : No
[PDF] Encryption : Standard V2.3 (128-bit)
[PDF] User Access : Print, Modify, Copy, Annotate, Fill forms, Extract, Assemble, Print high-res
[PDF] Page Count: 2
[PDF] Creator: Quadient CXM AG~Inspire~14.0.238.0
[PDF] Producer: 
[PDF] Create Date: (borrado)

Conclusiones

Como ya he dicho, el programa tardó algo menos de cinco minutos en sacar la clave.

Es necesario enviar el archivo por una vía y la contraseña por otra (algún banco extranjero envía dos emails uno con la clave y otro con el documento, además en un intervalo de menos de 5 minutos, eso tampoco es seguro).

EDITO: La única utilidad real que se me ocurre de este método sería la de dificultar el acceso a datos por parte de herramientas de análisis automático que pueda haber en proveedores gratuitos de correo. También pararía a un usuario sin ganas (a veces resulta suficiente) pero en ningún caso esta técnica debe considerarse segura.

Herramienta pdfcrack empleada en el artículo: https://pdfcrack.sourceforge.net/

Otros artículos sobre cifrado de archivos que quizás te interesen:

Foto de la cabecera de: Sebastiaan Stam