miércoles, 27 de junio de 2012

Un correo esoterico revelado (Parte 2)

Para no dejar este problema inconcluso, doy a continuación su solución.

Primeramente, la data textual del correo cifrado, que se encuentra dispuesto en grupos de 8 cifras binarias, nos hace sospechar que cada octeto de bits representa un caractér ASCII.  El problema consistiría en leer este archivo e ir conviertiendo cada número de 8 bits a su correspondiente caracter ASCII. La cadena de todos estos caracteres sería el correo decifrado.

En segundo lugar, observamos que cada octeto de bits está separado por un espacio.  Entonces tenemos que leer el archivo y descomponerlo en una lista de octetos, cada uno de los cuales a su vez será convertido a un valor numérico que será el código ASCII del caractér en cuestión.

Sin más preámbulos, damos una primera solución:


#!/usr/bin/python
# -*- coding: latin-1 -*-
archivo=open("correo_esoterico.txt","r")
decifrado=""
for i in archivo:
    lis=i.split(" ")
    for j in lis:
        decifrado+=chr(int(j,2))
archivo.close()
archivo=open("decifrao.txt","w")
archivo.write(decifrado)
archivo.close()

Observen que el método split divide una cadena en una lista de cadena, donde se supone que el punto de división (caractér separador) es el espacio " ".  Observen también que la función int convierte una cadena a un número entero, donde también podemos indicar la base de representación numérica, que en este caso es 2 (números binarios).  Por último, la función chr retorna el caracter correspondiente al código numérico indicado en su argumento.

Alternativamente, podemos ahorrarnos todos esos for y trabajar con la programación funcional:

#!/usr/bin/python
# -*- coding: latin-1 -*-
archivo=open("correo_esoterico.txt","r")
cifrado=archivo.read().split(" ")
decifrado="".join([chr(int(x,2)) for x in cifrado])
archivo.close()
archivo=open("decifrao.txt","w")
archivo.write(decifrado)
archivo.close()

Quedan advertidos: el mensaje que me envió mi amigo (una vez decifrado), es burda de cursi, pero por lo menos nos sirvió para practicar  Python.

No hay comentarios:

Publicar un comentario