Matasano Crypto Challenge Set 1 (1/?)

Los retos criptográficos de Matasano están diseñados para enseñar criptografía de forma práctica. El primer set de ejercicios es simple. Implementar Base64 y funciones XOR hasta llegar a AES-128-EBC. Empecemos a resolverlos.

Antes de comenzar debo hacer un comentario. Una de las recomendaciones que realizan es aprender un nuevo lenguaje para resolver los ejercicios. En mi caso elegiré python3. Como es un esfuerzo de aprendizaje doble (programación y criptografía), mis soluciones pueden encontrarse lejos de lo óptimo.

El primer reto nos pide convertir una representación hexadecimal a base64. Podemos tomar el camino fácil y utilizar el siguiente script:


import base64

s = '49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d'
expected = 'SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t'

def hex_str_to_base64(s):
    return base64.b64encode(s.decode('hex'))

assert hex_str_to_base64(s) == expected

Sin embargo nosotros somos hardcore y lo implementaremos todo. Iniciemos por el primer paso: ¿Cómo interpretar las cadenas hexadecimales? Lo que necesitamos hacer es obtener el texto y crear la representación real. Paso a paso el siguiente código muestra el concepto.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

hexa = input("Cadena hexadecimal:" )

print("Cadena de texto hexadecimal")
print(hexa)

print("Separación de caracteres nones y pares")
print(hexa[0::2], hexa[1::2])

print("Lista de non y par (texto)")
print([''.join(c) for c in zip(hexa[0::2], hexa[1::2])])

print("Lista de bytes")
print([int(''.join(c), 16) for c in zip(hexa[0::2], hexa[1::2])])

print("Lista con bytes (representación en carácter)")
print([chr(int(''.join(c), 16)) for c in zip(hexa[0::2], hexa[1::2])])

print("Representación de los bytes en texto")
print(''.join([chr(int(''.join(c), 16)) for c in zip(hexa[0::2], hexa[1::2])]))

Lo que hacemos es tomar el texto en hexadecimal, separar y unir los caracteres pares e impares, interpretar el número en base 16 representado por el texto. Imprimimos la cadena por simple curiosidad, pero esto no es necesario. Hasta este punto todo es sencillo y fácil. Lo que nos falta es el verdadero reto: Implementar base64.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s