Por @Alvy — 4 de febrero de 2021

Recovering passwords from pixelized screenshots

Sipke Mellema publicó hace algunas semanas un artículo sobre cómo recuperar contraseñas de capturas de pantalla pixelizadas y añadió algunos interesantes enlaces sobre la técnica (Recovering passwords from pixelized screenshots). No sólo la técnica es interesante sino que algunos de los enlaces mencionados van mucho más allá: cómo recuperar todo tipo de textos e incluso imágenes borrosas de rostros que se han ocultado malamente. El código está disponible en Github: Depix.

Al hacer un pantallazo y aplicar un filtro del tipo mosaico / pixelizar con cualquier aplicación gráfica se aplica lo que técnicamente se conoce como filtro de caja lineal. Se divide la imagen en cajas cuadradas de cierto tamaño y se promedia un tono de color/gris en función del contenido de las cajas adyacentes.

Esa operación «destruye» información y detalles, pero de forma determinista (siempre con el mismo resultado). Con tamaños de caja pequeños los textos siguen siendo reconocibles; ampliándolos un poco más dan sensación de «texto oculto» sin que resulte visualmente desagradable como sería un bloque de negro puro. Es muy típico para ocultar contraseñas, matrículas y similares, además de rostros en fotografías.

La cuestión es que debido a ese determinismo a veces hay formas de recuperar los textos originales. Una muy sencilla es crear un gran documento con todos los números posibles (por ejemplo, números de tarjetas de crédito) y aplicar el filtro. Si es necesario puede hacer con varios tamaños de cajas, o calculando ese valor de antemano. Luego se comparan uno por uno con la imagen pixelada y los que sean más parecidos estarán cerca del resultado. Normalmente hay alguno idéntico.

Otra forma es ir haciéndolo carácter por carácter, considerando válidos los que coincidan de forma individual. Pero es mejor hacerlo por parejas, utilizando una secuencia de De Burijn, del tipo «00 10 20 30 … aa ba ca da …» etcétera) donde cada pareja aparece una sola vez. Si un valor coincide perfectamente, se da por bueno el valor. La tarea no es trivial porque a veces hay que ajustar las distancias de las cajas (no me quedó claro si porque el texto no siempre es monoespaciado o no) y algunas combinaciones dan valores iguales o muy parecidos.

El resultado no siempre es perfecto, pero es suficiente: las coincidencias perfectas se dan por válidas y las que coinciden pero no tanto se «promedian» con las que son similares, dando lugar a letras que quizá estén, por ejemplo, a medio camino entre un 1 y una L, pero más cerca del 1 que de la L… Algo que luego una persona puede reconocer sin mucho esfuerzo. ¡Humanos al poder!

Para quien le interese el tema esta es la literatura citada:

Deblurring Images for OSINT and more

En el caso de imágenes de rostros pixelados la solución es más ingeniosa todavía: primero se aplican filtros para «enfocar» la imagen dentro de lo posible (un truco suele ser reducirla). Luego se puede realizar una búsqueda inversa en Google Images u otros servicios similares:

Deblurring Images for OSINT and more

A veces las fotografías originales están ahí, al alcance de Google, y el algoritmo de Google Imagenes es suficiente como para reconocer que dos fotos son las misma, aunque una esté un poco más borrosa que la otra. Algo especialmente útil para «rostros populares».

Relacionado:

Compartir en Flipboard Publicar / Tuitear Publicar