31 dic 2007

Python, Encriptar mensaje

Pepe desea enviarle un mensaje a su amigo Juan por el messenger, el cual dice: hoy es la fiesta, no le digas a Jorge, el problema con el que se enfrenta es que Juan está a lado de Jorge, y debe darle el mensaje ahora, más tarde no podría... así que se le ocurre una gran idea, enviar el mensaje encriptado...

En estas semanas además de estar escribiendo mi tesis me ha dado por aprender Python, al cual me han descrito, no pocas personas, como un excelente lenguaje de programación. Para aprender Python he estado, leyendo el siguiente libro: Beginning Python: From Novice to Professional, el cual me parece un buen libro, hasta ahora no he encontrado nada sorprendente en Python, no estoy diciendo que no tenga cosas interesantes o que sea malo, quizá se deba a que el libro va algo lento, o a que no tengo mucho tiempo para leerlo y no he llegado a la parte interesante, le dedico alrededor de una hora cuando lo leo, y tan solo he leido tres capítulos los cuales incluyen estructuras de datos, manejo de cadenas (strings), y algunas cosillas más; ¿pero que tiene que ver esto con pepe y sus mensajes? ah pues que me encontré una bonita función que puede ayudar a pepe, gracias a que su máquina tiene instalado Python.


En Python existe una función llamada translate la cual reemplaza varias partes de una cadena de manera simultánea, para esto hace uso de una tabla de traducción, la cual recibe dos listas como entrada, una que dice los caracteres que seran reemplazados y otra que especifica por quien serán reemplazados, la función que se encarga de crear esta tabla se llama: maketrans, la cual debemos importar. Supongamos que tenemos instalado un interprete de Python, en Ubuntu viene instalado por defecto, por lo que basta abrir una terminal (supongo que se tiene alguna distro de Linux) y escribir

$python

aparecerá lo siguiente

epacheco@page:~$ python
Python 2.5.1 (r251:54863, Oct 5 2007, 13:36:32)
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>>

Para importar la función maketrans, debemos escribir:

>>> from string import maketrans

Acontinuación debemos crear con maketrans, una tabla de traducción la cual creamos de la siguiente manera:

>>> tablaTrad = maketrans("abcdefghijklmnopqrstuvwxyz","bcdefghijklmnopqrstuvwxyza")

Las dos listas de las cuales hablábamos son los dos parámetros de maketrans, las cuales en nuestro caso particular, significan que las a's seran cambiadas por b's, las b's por c's , las c's por d's,...., y las z's por a's, es decir el caracter en la posicion i del primer parámetro sera cambiada por el caracter en la posicion i del segundo parámetro, por esta razón ambas entradas deben tener logitudes iguales. Una vez definido esto basta aplicar esta tabla a una cadena, por ejemplo el mensaje de pepe, esto lo hacemos de la siguiente manera:

>>>"hoy es la fiesta, no le digas a jorge".translate(tablaTrad)

el resultado sería:

'ipz ft mb gjftub, op mf ejhbt b kpshf'

El cual jorge, que no está interesado en otra cosa que no sea una fiesta, no será capaz de leer y seguro lo confundira con alguna otra cosa.
Jorge al recibir el mensaje codificado lo puede descodifcar, de la siguiente manera

Definimos la tabla para descodificar

>>>tablaTrad2 = maketrans("bcdefghijklmnopqrstuvwxyza","abcdefghijklmnopqrstuvwxyz")

>>> 'ipz ft mb gjftub, op mf ejhbt b kpshf'.translate(tablaTrad2)

'hoy es la fiesta, no le digas a jorge
'

Notas
  • Juan tiene que conocer la primer tabla, para construir la segunda y así descodificar el mensaje.
  • En nuestro caso no era necesario definir todas las letras del abecedario pero podemos reutilizar makeTrad para codificar otros mensajes.
  • Esta no es la manera más eficiente y segura para codificar
  • Se pudo escoger otra tabla para codificar, por ejemplo donde las a's son sustituidas por j's etc.
Esta es una de las funciones que más me han gustado de Python, las primeras impresiones que tengo es que tiene una gran cantidad de herramientas para procesar cadenas, lo cual es atractivo.



3 comentarios:

Anónimo dijo...

Saludos, viejo tas seguro que ese codigo esta bueno? porque en la consola lo coloco tal cual y me dice error en la primera linea, ni siquiera corre...

D4R7HV4D3R dijo...

viejo el codigo que tienes ahi no me funciono, gracias de todas maneras, yo modifique un poco tu codigo aqui te lo dejo para que lo montes:
from string import maketrans

trantab = maketrans("abcdefghijklmnopqrstuvwxyz","bcdefghijklmnopqrstuvwxyza")
str = "hoy es la fiesta, no le digas a jorge";
print str.translate(trantab);

PAGE dijo...

Sí hay un error... culpa de mi dislexia o de lo que sea... La sentencia para importar un modulo debe ser:

from string import maketrans


Gracias!!

ga