16 agosto 2009

Conversión de texto a ASCII y hexadecimal y cifrado con MD5 y SHA-1 en GNU/Linux

Buenas!

Alguna vez, por simple curiosidad o por trastear alguna base de datos de algún programa que haya instalado en mi ordenador (como por ejemplo Wordpress), he necesitado convertir un texto de ASCII a hexadecimal, o viceversa, o quizás haya querido cifrar (uso cifrar, por ser correcto y no levantar muchas ampollas, pero creo que, a mi parecer, no hay motivos para no usar encriptar teniendo en cuenta la palabra criptografía) algún tipo de texto.

Es por esto que he escrito este mini manual para hacer esas tareas y para tenerlo como apunte, sobre todo la transformación de hexadecimal a ASCII, que por alguna extraña razón me ha costado dar con ella, más concretamente dar con el comando adecuado para ello.

Espero que este post os sea útil.

Conversión a ASCII y hexadecimal

Para convertir un texto en ASCII a hexadecimal (lo que el ordenador realmente almacena en su memoria), podemos utilizar el comando xxd (que viene incluido con el editor de textos vim):

$ xxd
hola
0000000: 686f 6c61 0a hola.

Para que acabe el comando y nos escriba el resultado tenemos que pulsar Ctrl+D.

Si queremos que nos escriba (o lea) el resultado sin esa estructura, podemos utilizar el argumento -p:

$ xxd -p
hola
686f6c610a

Con el uso de este argumento, el programa ya nos escribe el resultado al pulsar Entrar o Enter, y usamos Ctrl+D para terminar el comando (o también podemos usar Ctrl+C, que interrumpe y para el comando).

Ahora, si lo que queremos es transformar un texto en hexadecimal a ASCII, utilizaremos el mismo comando con el argumento -r del mismo modo:

$ xxd -r
0000000: 686f 6c61 0a hola.
hola

$ xxd -r -p
686f6c610a
hola

En estos últimos 2 casos podéis utilizar el último procedimiento que hemos explicado antes de ellos para terminar el comando.

Y si queréis redireccionarlos a un archivo de salida:

$ xxd -p > hola.hex
hola

o utilizar un archivo de entrada:

$ xxd -r -p < hola.hex
hola

Si queréis hacer cosas parecidas pero con una interfaz gráfica, podéis usar Ghex, un editor hexadecimal para GNOME.

Cifrado mediante MD5 y SHA-1

Ahora pasemos al cifrado de texto con MD5, un algoritmo bastante conocido de hash (identificador único de un archivo o texto). Para ello, utilizaremos el comando md5sum, y el argumento -, que le indica al comando que queremos que nos cifre lo que le vamos a escribir.

$ md5sum -
hola4d186321c1a7f0f354b297e8914ab240 -

En este caso, nos ha hecho falta pulsar 2 veces Ctrl+D.

Tengo que hacer notar que es muy importante escribir exactamente lo que queremos que nos cifre, sin espacios ni saltos de línea de más, ya que nos dará resultados muy diferentes:

$ md5sum -
hola 51db41a195b9a4b26f9e1f16d72e7b20 -

$ md5sum -
hola
916f4c31aaa35d6b867dae9a7f54270d -

En este último caso, en el que pulsáis Entrar, sólo teneís que pulsar una vez Ctrl+D.

Cómo podéis observar, la cosa cambia enormemente, pero el resultado no queda claro, ya que se entremezcla con los datos que hemos introducido. En este caso, pues, lo mejor es redireccionar el resultado a un archivo:

$ md5sum - > salida.txt
hola

Observamos que el resultado es el mismo:

$ more salida.txt
4d186321c1a7f0f354b297e8914ab240 -

Podemos, como ya hemos hecho anteriormente, redireccionar la entrada al comando. Sin embargo, tenemos que recordar la importancia de que el texto introducido en el archivo sea exactamente el mismo que queremos cifrar, teniendo en cuenta que algunos editores de texto, como Gedit, incluyen por defecto un salto de línea final en el documento. Por tanto debemos estar muy seguros de que el archivo que utilizamos no tenga espacios ni saltos de línea de más.

$ md5sum < hola.txt
4d186321c1a7f0f354b297e8914ab240 -

En caso de que queramos cifrar el texto mediante el algoritmo SHA1, sólo tenemos que utilizar el comando sha1sum y proceder de la misma manera que con md5sum:

$ sha1sum < hola.txt
99800b85d3383e3a2fb45eb7d0066a4879a9dad0 -

Ambos comandos de cifrado son parte del proyecto GNU.

Un saludo,
Morpheus