Inicio en criptografía para lobas parte 2

Hola estamos de vuelta, si te perdiste el anterior post lo tienes aquí. Hoy venimos con ganas de práctica así que manos a la obra

La cifra Atbash, es bastante intuitiva de entender. Es un método criptográfico de sustitución monoalfabético en el que sustituimos la primera letra por la última:

alfabeto en claro:

a b c d e f g h i j k l m n o p q r s t u v w x y z

alfabeto de sustitución:

z y x w v u t s r q p o n m l k j i h g f e d c b a

def encrypt_atbash(texto,alfabeto_claro,alfabeto_cifrado):
    resultado=''
    for caracter in texto.lower():
        if caracter in alfabeto_claro:
            indice = alfabeto_claro.index(caracter)
            resultado += alfabeto_cifrado[indice]
        if caracter == chr(32):
            resultado += " "
    return resultado 
alfabeto_claro =  'abcdefghijklmnopqrstuvwxyz'
alfabeto_cifrado =  ''.join(reversed(alfabeto_claro))
#probamos la funcion pasando como parámetros un texto en claro, el alfabeto en claro y el cifrado y nos devolverá el resultado
print (encrypt_atbash("soy una zorrita",alfabeto_claro,alfabeto_cifrado))

Lo que hace la pequeña función anterior es lo siguiente: Vamos recorriendo cada caracter del texto que le pasamos por parámetro, filtramos los caracteres que aparecen con respecto al alfabeto en claro y el texto, almacenamos la posicion de cada uno de los caracteres de dicho texto(ojo que empezamos en cero ;) ), obtenemos el resultado recogiendo lo equivalente al alfabeto cifrado según la posición correspondiente y lo retornamos, si es un espacio lo comprobamos con su valor correspondiente entero en ASCII.

Ataque de fuerza bruta

¿Alguna vez tuviste un candado de código que intentaste probar si abría empezando por 000,001,010…? Felicidades artista :) intentaste realizar un ataque por fuerza bruta. Lo bueno de que lo realice la computadora es que la variable tiempo en los ciclos que ejecuta es bastante más escueta (por decirlo finamente y no quedar mal los seres vivos jeje) que cuando andamos a cambiar el dígito en el candado,es como lavar a mano y luego saber que no podemos centrifugar con las mismas revoluciones que una lavadora. En definitiva es eso, probar todas las combinaciones posibles hasta dar con la correcta, con aquella que nos abrirá a una intepretación clara de la realidad.

ROT13

Es un tipo de cifrado césar en el que se intercambia cada una de las letras en la primera mitad del alfabeto con la letra correspondiente en la segunda mitad del alfabeto. El desplazamiento o rotación que realiza el ROT13 lo necesitaremos para desplazar el valor (en concreto 13 posiciones) lo que pasa es que luego vuelve a empezar, eso es un ciclo y ahí entra en juego la aritmética modular que es ese desplazamiento necesario, lo entenderemos de la siguiente manera:

La A corresponde a un desplazamiento de 13 posiciones, es decir, la N y, por ejemplo la Y son trece posiciones también, lo que significa que una vez acabada la posicion media tiene que volver a empezar, como el ciclo de un reloj que cuando son las doce “comienza de nuevo”.

A B C D E F G H I J K L M

N O P Q R S T U V W X Y Z

Para un ataque de fuerza bruta en código para generar este tipo de desplazamiento lo que hacemos es encontrar la posición en un alfabeto en claro que corresponda con el valor del símbolo cifrado, entonces con esa posición podemos crear cada vez un desplazamiento hasta llegar al valor final del desplazamiento el cual volvería a empezar al principio (recordemos la aritmética modular). Es en nuestro ejemplo de un candado con valores del 0 al 9 hacer 001-009 y luego 010-019 por ejemplo, podemos comprobar que son varios ciclos interpuestos.

La idea viene siendo cercana en cierta manera a la función anterior, pasamos por parámetro el texto cifrado primero recorremos cada caracter del alfabeto (que es quien genera todos los resultados de desplazamiento,excepto el desplazamiento que ya existe) y dentro recorre caracter a caracter si alguno de los caracteres está en el alfabeto,recogemos la posición o índice de la posición de cada uno de los caracteres de nuestro texto cifrado e incorporamos la posición correspondiente de cada desplazamiento.Almacenamos el resultado de cada uno de los desplazamientos ordenándolos en base a dicho desplazamiento recogiendo cada caracter del alfabeto En este ejemplo vamos a comprobar todas las combinaciones posibles hasta que dé que la frase en clave “hl ndhv rfgbl “ tenga sentido en la lengua natural entonces en una de las combinaciones posibles saldrá algo entendible, probemos.

def brute_force(cifrado,alfabeto_claro):
    for caracter in range(1,len(alfabeto_claro)): 
        resultado=''
        for caracter_cifrado in cifrado:
            if caracter_cifrado in alfabeto_claro:
                posicion_texto = alfabeto_claro.find(caracter_cifrado)
                posicion_desplazamiento = (posicion_texto -caracter) % len(alfabeto_claro)
                resultado += alfabeto_claro[posicion_desplazamiento]
            else:
                resultado += caracter_cifrado
        print('{}{}{}{}'.format("desplazamiento ",caracter,"->",resultado))
alfabeto_claro = 'abcdefghijklmnopqrstuvwxyz'
brute_force("hl ndhv rfgbl",alfabeto_claro)

¿Cuál es el mensaje en claro de “hl ndhv rfgbl” ? Podéis comentarlo :)

1 Comment

Deja una respuesta

Tu correo no será publicado. Los campos obligatorios están marcados *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax