Encriptar y desencriptar utilizando el código Bacon

Iniciado por Polsaker, Mayo 27, 2015, 09:57:01 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Mayo 27, 2015, 09:57:01 PM Ultima modificación: Mayo 27, 2015, 10:21:36 PM por Polsaker
Este es un simple par de funciones en Python que se encargan de codificar y decodificar texto utilizando el No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. Ustedes pueden crear su propia variante cambiando un poco el diccionario. Yo he utilizado un diccionario distinto al normal (he incluido el espacio, separado la I de la J y la U de la V ).

Código: python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import unicodedata
import re

# Diccionario (este es una modificación del original, separando la
# I y la J, la U y la V y añadiendo los espacios para que se vea mas bonito):

bacondict = {
    'a': 'aaaaa',
    'b': 'aaaab',
    'c': 'aaaba',
    'd': 'aaabb',
    'e': 'aabaa',
    'f': 'aabab',
    'g': 'aabba',
    'h': 'aabbb',
    'i': 'abaaa',
    'j': 'abaab',
    'k': 'ababa',
    'l': 'ababb',
    'm': 'abbaa',
    'n': 'abbab',
    'o': 'abbbb',
    'p': 'baaaa',
    'q': 'baaab',
    'r': 'baaba',
    's': 'baabb',
    't': 'babaa',
    'u': 'babab',
    'v': 'babba',
    'w': 'babbb',
    'x': 'bbaaa',
    'y': 'bbaab',
    'z': 'bbaba',
    ' ': 'bbbaa'
}

# Codificar con el código bacon.
# Los parámetros son: el diccionario, el texto a encriptar y el texto
# que lo "cubrirá"
def encode(bacon_dict, words, cover):
    # Convertimos todos los caracteres "especiales" a sus equivalentes ASCII
    # (á: a, ñ: n, etc)
    words = unicodedata.normalize('NFD', words).encode('ascii', 'ignore')
   
    words = words.decode().lower()
   
    cover = cover.lower()
   
    encoded = ''
    for i in words:
        encoded += bacon_dict[i]
    hidden = ''
    b = 0
    b2 = 0
   
    while b < len(cover):
        if b2 < len(encoded):
            if encoded[b2] == 'b':
                # Con esto evitamos poner en mayúsculas los espacios :P
                if cover[b].upper() != cover[b]:
                    hidden += cover[b].upper()
                    b2 += 1
                else:
                    hidden += cover[b]
            else:
                if cover[b].upper() != cover[b]:
                    hidden += cover[b]
                    b2 += 1
                else:
                    hidden += cover[b]
        else: # ya se codificó el texto, llenamos lo que queda con basura
            # tres 'b', un 'a' y otro 'b' al final (un caracter inexistente
            # en el diccionario)
            try:
                hidden += cover[b].upper()
                hidden += cover[b + 1].upper()
                hidden += cover[b + 2].upper()
                hidden += cover[b + 3]
                hidden += cover[b + 4].upper()
            except:
                pass
            b += 4
        b += 1
       
    return hidden

def decodificar(bacon_dict, codified_string):
    encoded = ''
    for i in codified_string:
        if i.istitle():
            encoded += 'b'
        else:
            if i.upper() != i:
                encoded += 'a'
    # Dividimos el texto semi-decodificado en partes de cinco caracteres..
    sec = map(''.join, zip(*[iter(encoded)]*5))
    # Invertimos el diccionario para que sea mas fácil buscar...
    bacon_dict = {v: k for k, v in bacon_dict.items()}
   
    decoded = ''
   
    for i in sec: # ... y vamos decodificando todo...
        try:
            decoded += bacon_dict[i]
        except:
            decoded += '?'
   
    return decoded
# Ejemplo de uso:
print("Encriptando 'nos reunimos esta noche a las doce' y cubriendolo con 'El Código Bacon o clave Baconiana es un método esteganográfico desarrollado por Francis Bacon. El mensaje estaría oculto en la presentación del texto, más que en su contenido. Para codificar un mensaje, cada letra de texto plano es reemplazada por un grupo de cinco letras 'A' o 'B'. El reemplazo se hace de acuerdo con el alfabeto del código Bacon.'")
codificado = encode(bacondict, "nos reunimos esta noche a las doce", "El Código Bacon o clave Baconiana es un método esteganográfico desarrollado por Francis Bacon. El mensaje estaría oculto en la presentación del texto, más que en su contenido. Para codificar un mensaje, cada letra de texto plano es reemplazada por un grupo de cinco letras 'A' o 'B'. El reemplazo se hace de acuerdo con el alfabeto del código Bacon.")
print("Texto codificado: " + codificado)

decodificado = decodificar(bacondict, codificado)
print("Texto decodificado: " + decodificado)


El ejemplo que viene con el código:
La entrada es "nos reunimos esta noche a las doce",
Cubierto con "El Código Bacon o clave Baconiana es un método esteganográfico desarrollado por Francis Bacon. El mensaje estaría oculto en la presentación del texto, más que en su contenido. Para codificar un mensaje, cada letra de texto plano es reemplazada por un grupo de cinco letras 'A' o 'B'. El reemplazo se hace de acuerdo con el alfabeto del código Bacon."

Se codifica a "eL CóDiGO BACon O CLAVe bAcoNianA es Un MéToDO eStEganoGRáfiCO DESarROLLAdo poR frAncIS BaCon. el menSAJe esTArÍa OCULto eN la pRESenTacIÓN del textO, MÁs quE eN Su contEniDO. PARa codiFIcAR UN menSaje, CadA LeTRA dE TExTO PlANO eS REeMPLAzADA pOR Un GRUpO DE CINCo LETrAS 'a' O 'B'. eL REeMPLAzO SE HACE DE AcUERDo CON EL AlFABEtO DEl CÓDiGO BaCON."

Y se decodifica a "nos reunimos esta noche a las doce?w????w???v?ww???????w" (La diferencia entre el texto a codificar y la cubierta se rellena con basura)

No conocía ese método de cifrado. Bastante loco, debo decir. xD
Muy buen script!

Saludos!


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No conocía ese método de cifrado. Bastante loco, debo decir. xD
Yo me lo topé en una página de wargames y retos por el estilo y terminé haciéndome este script para codificar/decodificar.

Curiosos :)

Aunque confundes conceptos. Para empezar, encriptar y desencriptar no existe. Se dice cifrar y descifrar.
Por otro lado, no es lo mismo cifrar que codificar, o descifrar que descodificar.

Saludos.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Aunque confundes conceptos. Para empezar, encriptar y desencriptar no existe. Se dice cifrar y descifrar.
Por otro lado, no es lo mismo cifrar que codificar, o descifrar que descodificar.
Es verdad. Es codificar/decodificar, ya que esto no es un mecanismo de encriptación  :-X