Estas aquiContenido / Visprint

Visprint


PorFernando Acero- Publicado el30 Agosto 2009

Por Fernando Acero

El otro día encontré este curioso juguete GPL. Se llama Visprint (no, no es un colirio) y está pensado para realizar una imagen PNG fractal de la salida de cualquier algoritmo de HASH...

Lo curioso es que este programa mide algo así como la entropía de la entrada, y a mayor entropía más vistoso es el gráfico que se genera. Por ejemplo, el siguiente gráfico lo he obtenido con el mandato:

wget --output-document=prueba.txt http://fernando-acero.livejournal.com
&& md5sum prueba.txt | visprint -t > mipage.png

Es decir, me he bajado la primera página de mi blog, he calculado el HASH MD5 de la misma y lo he usado como entrada para Visprint con el modificador "-t", que crea un archivo gráfico con fondo transparente. Del mismo modo, podemos calcular el SHA1 de la página mediante el mandato sha1sum, o el SHA256, disponible en las últimas versiones del paquete GNU coreutils) usando el mandato sha256sum, pero en este caso, es conveniente modificar algunos parámetros para que Visprint use el número de bits adecuado a la salida del código de HASH que estamos utilizando...

Ahora bien, si no hacemos el cálculo del MD5 y usamos la longitud máxima permitida de entrada para el programa, que es 128 (128 x 4 = 512 bits), siendo 512 la longitud de salida del algoritmo SHA512:

wget --output-document=prueba.txt http://fernando-acero.livejournal.com
&& cat prueba.txt | visprint -l128 > mipage.png

Obtenemos esta imagen tan simple y de líneas rectas, que he puesto sobre fondo negro para que se vea mejor. Esto se debe a que los primeros 512 bits de mi página web tienen poca entropía, pero eso también ocurre con otros tipos de archivos, como por ejemplo, con los archivos gráficos y con muchos de texto:

También podemos usar el mandato:

cat /dev/random | visprint -l128 > random.png

Y mover el ratón por la pantalla, para ver lo que sale.

Veamos la sintaxis y las opciones de Visprint:

Visprint 2.1 (http://www.tastyrabbit.net/visprint)

Uso:

md5sum (sha1sum) (sha256sum) (sha512sum) archivo.ext | visprint

[Opciones] > gráfico.png

Opciones:

-b(0-255) Permite modificar el brillo del fondo. 0 es negro, 255 es blanco. Se pueden probar con valores intermedios, pero normalmente las imágenes no son demasiado vistosas. El valor por omisión es 0 (negro).

-c Se usa para alternar el método usado para colorear las imágenes, pasando de RGB a BGR.

-a Crea un fractal con 4 áreas de color diferentes.

-g Crea una imagen en semi-escala de grises. La salida varía mucho dependiendo del valor del parámetro -b.

-i(1-lots) Utiliza una determinada intensidad de color. Con un fondo negro, una mayor intensidad produce una imagen más brillante. Con un fondo blanco, una mayor intensidad produce una imagen más oscura. En todos los casos, el tiempo de cálculo se dobla cada vez que se dobla la intensidad. El valor por omisión es 30.

-l(32-128) Utiliza una determinada longitud de HASH. Será necesario modificar este número para adaptar el funcionamiento del programa a la longitud de salida de la función de HASH que estemos utilizando.

Por ejemplo: 32 para MD5, 40 para SHA1, 64 para SHA256, 128 para SHA512 (el valor de obtiene dividiendo por cuatro el número de bits de salida de la función de HASH utilizada.

La salida del valor 128 es algo borrosa (aunque todavía utilizable). Valores mayores muestran imágenes menos nítidas, por lo que se considera que 128 es el límite máximo utilizable. El valor por omisión es 32, que es el utilizado por MD5, que tiene una salida de 128 bits.

-r(1-1000) Modifica el valor de la resolución en los ejes x e y. El tiempo de cálculo se cuadruplica cada vez que se doblan estos valores. El valor por omisión es 300.

-t Crea la imagen con un fondo transparente.

-v Muestra la información de la versión.

-?,-h Muestra esta información de ayuda.

Compilar Visprint

Para compilar Visprint primero lo descargamos desde este enlace , su MD5 debe ser:

e9f3bc1242f2687c777761e5e4ed9e96

que lo calcularemos abriendo una consola como root y usando el mandato:

md5sum visprint-2.1.tar.gz

Después, si el MD5 es el correcto, lo descomprimimos mediante el mandato:

tar -zxvf visprint-2.1.tar.gz

Después entraremos en el directorio mediante el mandato:

cd visprint-2.1

Seguidamente compilaremos mediante el mandato:

make

E instalaremos mediante el mandato

make install

Hecho esto, ya podremos usar este juguete, por ejemplo, para añadir el HASH fractal gráfico a nuestros archivos o a nuestra página web.

"Copyleft 2009 Fernando Acero Martín. Verbatim copying, translation and distribution of this entire article is permitted in any digital medium, provided this notice is preserved"

Etiquetas

Comentarios

Selecciona arriba tu forma preferida de visualizar los comentarios y pulsa el botón para guardar tu elección para próximas visitas (sólo si eres usuario registrado).

Desde OpenSSH 5.1, cuando generas un certificado, además de imprimir el "fingerprint" de la misma, imprime un pequeño gráfico ASCII mediante el método "randomart".
Por ejemplo:

andy@laptop:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/andy/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): ******
Enter same passphrase again: ******
Your identification has been saved in /home/andy/.ssh/id_rsa.
Your public key has been saved in /home/andy/.ssh/id_rsa.pub.
The key fingerprint is:
f2:eb:60:23:42:71:88:86:c8:a7:6a:5b:08:1a:f5:36 andy@laptop
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|+. .             |
|+o+..            |
|..o+             |
|o.. E . S        |
|+o.. . o         |
|oo... + .        |
|. o. o o .       |
| .     .o        |
+-----------------+

Los fundamentos teóricos estan en este paper.

Muy bonito el programa, por cierto. Gracias por compartirlo.

Un saludo,
Andy

Que yo sepa, randomart representa el hash de forma "gráfica" pero usando caracteres ascii, no fractales como es el caso de Visprint. Por lo que yo creo que no tiene demasiado que ver, aunque la finalidad es similar, mostrar un figerprint de forma más "amigable" o "vistosa" que una serie de caracteres alfanuméricos en una cadena hexadecimal y de paso, mejorar la seguridad.

Un saludo, Fernando Acero

"Copyleft 2009 Fernando Acero Martí­n. Verbatim copying, translation and distribution of this entire article is permitted in any digital medium, provided this notice is preserved".

La salida de los distintos comandos 'hash' se hace siempre en hexadecimal para poder imprimirse en pantalla. De hecho, md5sum, 128 bits o 16 bytes binarios se transforman en 32 bytes con la representación hexadecimal.

¿Descuenta visprint este hecho, o los toma literalmente? En el segundo caso, se pierde mucha entropía (1/2 de la original binaria).

SKS, criptografía de curva elíptica de bolsillo
http://sks.merseine.nu

Parece ser que la salida del comando que indicas (wget), tal y como aparece indicada no está aportando nada a md5sum. Es decir, si repito la línea con cualquier otra dirección el resultado es la misma gráfica.

Tal vez debiera añadirse al mismo la opción: --output-document=-

Un saludo

Pues la verdad es que tienes razón, no había probado con otra página, de hecho, siempre había usado la sintaxis estándar:

md5sum foo.bar | visprint > foo.png

Lo estoy estudiando, pero sí la solución rápida y sencilla es usar wget para guardar un archivo con --output-document=nombre y luego aplicar md5sum nombre | visprint > foo.png, que es la sintaxis estándar.

El problema es que wget no pasa la información a md5sum, simplemente guarda un archivo index.html con el contenido de la página, craso error el mio, perdonad, cosas de las prisas.

Muchas gracias por el apunte.

Un saludo, Fernando Acero

"Copyleft 2009 Fernando Acero Martí­n. Verbatim copying, translation and distribution of this entire article is permitted in any digital medium, provided this notice is preserved".

Hola:

He estado mirando el problema que nos comentaba dopegaar anteriormente y la solución es la siguiente:

wget --output-document=prueba.txt http://www.dirección.xxx && md5sum prueba.txt | visprint -t > mipage.png

La primera parte descarga la página http://www.dirección.xxx y la guarda en un archivo denominado prueba.txt. La segunda parte calcula el hash MD5 de ese archivo y se lo pasa a visprint para que genere el gráfico correspondiente.

Hay que tener en cuenta que si no utilizamos páginas completamente estáticas, cada vez obtendremos un archivo distinto y posteriormente un código de HASH igualmente distinto. Yo he probado con la página principal de Mandriva y es completamente estática, por lo que todas las veces que lo he probado, siempre he obtenido el mismo archivo, con su mismo HASH y por lo tanto, he obtenido el mismo gráfico.

wget --output-document=prueba.txt http://www.mandriva.com && md5sum prueba.txt | visprint -t > mipage.png

Le ruego al editor que actualice la instrucción en el artículo.

Cambiando la primera por:

wget --output-document=prueba.txt http://www.dirección.xxx && md5sum prueba.txt | visprint -t > mipage.png

Y la segunda por:

wget --output-document=prueba.txt http://www.dirección.xxx && cat prueba.txt | visprint -t > mipage.png

Como veremos, los gráficos son completamente distintos a los que presento en mi artículo, aunque similares. Los creados con la segunda instrucción (sin c´odigo de HASH) están formados por líneas rectas y los de la primera (con código de HASH), son mucho más complicados y vistosos.

Muchas gracias por el apunte dopegaar, me encanta la gente que se cuestiona las cosas y las prueba para ver si son ciertas.

Un saludo, Fernando Acero

"Copyleft 2009 Fernando Acero Martí­n. Verbatim copying, translation and distribution of this entire article is permitted in any digital medium, provided this notice is preserved".

Método 1:

wget -O - http://www.kriptopolis.org 2> /dev/null | md5sum | visprint -t > grafico.png

El primer parámetro del "wget" es una letra "O" mayúscula, como en "Oviedo". Luego sigue un blanco y luego un guión. Eso hace que el "wget" envíe la página a la salida en vez de a un fichero.

Método 2:

curl http://www.kriptopolis.org 2> /dev/null | md5sum | visprint -t > grafico.png

El comportamiento normal del "curl" es enviar la salida a un fichero, por lo que no hay que especificar ninguna otra opción en este caso.

Un saludo,
Andy

También me ha parecido muy interesante la utilización de:

2>/dev/null

Para eliminar la salida de stderr y que no afecte a md5sum y este es un truco que no todo el mundo conoce. Tan interesante como el guión para modificar la salida de wget, o el apunte de Shevek, descubriendo de que Visprint solamente acepta números hexadecimales y considerando ceros todo lo que no lo es. Por cierto, para convertir Ascii a Hexadecimal en Linux se puede usar esto:

cat prueba.txt | xxd -p > salida.hex

El parámetro -p sirve para que la salida sea plana en hexadedimal, es decir del tipo volcado hexadecimal continuo. Algo parecido a esto:

0a3c21444f43545950452048544d4c205055424c494320222d2f2f573343
2f2f4454442048544d4c20342e30205472616e736974696f6e616c2f2f45
4e223e0a3c68746d6c3e0a3c686561643e0a3c7469746c653e415041202d
....

El mandato xxd que viene con vim, convierte la entrada prueba.txt en un archivo hexadecimal denominado salida.hex, al que podemos aplicar Visprint con todas las consecuencias, teniendo en cuenta, que está limitado el número de bytes que se usarán por Visprint, lo que variará en función del valor del parámetro -l.

Por cierto, yo había optado por guardar los archivos en lugar de ya que en algunas ocasiones obtenía distintos HASH's y tras usar diff con archivos conseguidos de forma consecutiva, me he dado cuenta de que páginas que consideraba estáticas a simple vista no lo eran realmente, otra curiosidad que he descubierto.

Un saludo, Fernando Acero

"Copyleft 2009 Fernando Acero Martí­n. Verbatim copying, translation and distribution of this entire article is permitted in any digital medium, provided this notice is preserved".

Ya había empezado a hurgar y había visto el comando "hd", pero no sabía cómo conseguir sólo la cadena hexadecimal. Este "xxd" es una juya...

Se puede probar también el resultado con dos populares servicios de números aleatorios:

wget "www.random.org/cgi-bin/randbyte?nbytes=16&format=file" -O - 2>/dev/null| xxd -p | visprint > random-org.png

wget "https://www.fourmilab.ch/cgi-bin/uncgi/Hotbits?nbytes=16&fmt=%20bin" -O - 2>/dev/null| xxd -p | visprint > fourmilab.png

SKS, criptografía de curva elíptica de bolsillo
http://sks.merseine.nu

Hola Shevek:

Menos mal que te he logrado sorprender con algo, que ya me estaba acomplejando, aunque esto está pareciendo un curso avanzado de Bash ;-), más que un artículo sobre una curiosidad que había encontrado.

Lo cierto es que xxd tiene muchas posibilidades interesantes, yo lo había usado en otras ocasiones para aplicar parches.

Un saludo, Fernando Acero

"Copyleft 2009 Fernando Acero Martí­n. Verbatim copying, translation and distribution of this entire article is permitted in any digital medium, provided this notice is preserved".

Patrocinadores

Kriptópolis alojado en
Zilos-Veloxia Network

Tu mejor defensa:
Bufet Almeida