UC-IIC3253 / 2021

Repositorio del curso Criptografı́a y Seguridad Computacional - IIC3253
21 stars 3 forks source link

[Tarea 1] Dudas de formato pregunta 2 #6

Open VicenteMerino opened 3 years ago

VicenteMerino commented 3 years ago

Hola, estaba leyendo la pregunta 2 y me surgieron varias dudas:

1) El mensaje m es un string con el valor binario del mensaje, ejemplo: m = '11110000111'? 2) Si 1) es verdadero, puedo asumir que m partirá siempre con un 1? (No tendrá ceros a la izquierda) 3) El valor de h0 puede ser tanto positivo como negativo? 4) Si 3) es verdadero, debemos usar la codificación en complemento a 2 para pasar de entero (base 10) a binario? 5) Hay restricciones de librerías? En particular podemos usar librerías que hagan la conversión entre decimal, binario y hexadecimal? 6) Podemos asumir que cuando se pruebe la función md5_custom, al pasar h0, será un valor de 128 bits o menos? O debemos hacer la verificación? Será justo 128 bits? O debemos agregar con 0 si hacemos la codificación a binario?

mugartec commented 3 years ago

Hola @VicenteMerino, abajo las respuestas:

1) No, el mensaje m es un string como siempre los hemos conocido, por ejemplo m="holamundo". 2) No aplica dada la respuesta anterior 3) Pueden suponer que h0 es siempre un valor positivo. 4) No aplica dada la respuesta anterior 5) En Python tenemos las funciones ord, bin, hex, bytearray y otras que nos ayudan con todas estas operaciones, por lo que no se necesitan librerías adicionales. 6) Pueden suponer solamente que es un entero menor a 2^128.

Saludos!

VicenteMerino commented 3 years ago

Perfecto, y respecto a 1, para el mapeo debemos usar ASCII?

mugartec commented 3 years ago

Perfecto, y respecto a 1, para el mapeo debemos usar ASCII?

No, deben suponer que los strings vienen codificados en utf-8 (así su programa es mucho más general).

Trabajar con utf-8 en python es bastante fácil, les dejo un ejemplo con operaciones comunes

# Transformamos el string "🙌Ñ😁" a un arreglo de bytes
my_bytes = bytearray("🙌Ñ😁", 'utf-8')

# Imprimimos los bytes en binario
print([bin(b) for b in my_bytes])
> ['0b11110000', '0b10011111', '0b10011001', '0b10001100', '0b11000011', '0b10010001', '0b11110000', '0b10011111', '0b10011000', '0b10000001']

# Imprimimos los bytes como enteros
print([int(b) for b in my_bytes])
> [240, 159, 153, 140, 195, 145, 240, 159, 152, 129]

# imprimimos el entero sin signo representado por todos estos bytes juntos
int.from_bytes(my_bytes, 'little')
> 612000706261103589040112

Importante: en la última línea el segundo argumento puede ser little o big, lo que hace referencia al endianness de la representación en bytes del entero.

Edit: La última función int.from_bytes recibe un parámetro opcional signed que por default es False. Para trabajar con complemento a dos usamos signed=True. Por ejemplo, siguiendo el código anterior:

# imprimimos el entero en complemento a dos representado por todos estos bytes juntos
int.from_bytes(my_bytes, 'little', signed=True)
> -596925113353525585666064
fprebolledo commented 3 years ago

Una pregunta, en el código anterior las b en los bytes en binario '0b11110000' cortan el binario en el último digito más significativo? Como esas b no nos sirven debemos formatear cada byte en 8 o dejarlos así no más? Por ejemplo si el número binario es 0b11, formateado en 8 bits sería 00000011 o dejamos simplemente 11?