UC-IIC3253 / 2022

37 stars 6 forks source link

[T2P1] - Dudas sobre pad(message, l_block) #42

Closed VicenteVicente closed 2 years ago

VicenteVicente commented 2 years ago

Hola! tengo un par de dudas sobre la implementación de esta función:

  1. Si $|message| \mod l\_block = 0$, ¿También debo añadir un bloque de padding, o bien, eso lo debo hacer SOLAMENTE en el caso que no sea divisible por l_block?

  2. Para la tarea se pide que el último bloque sea el largo en bytes del mensaje (llamémoslo n_bytes): 2.1. ¿Este largo debería ser $n\_bytes\mod 2^{l\_block}$? (Como lo vimos en clases pero ahora en bytes) 2.2. ¿Cómo debo codificarlo?, por ejemplo se me ocurre simplemente pasar este número a binario y dejarlo en el nuevo bloque.

Desde ya muchas gracias :)

marceloarenassaavedra commented 2 years ago

Gracias por las preguntas, estas convenciones son importantes para obtener el hash correcto.

Aquí van las respuestas:

(1) Si el largo del mensaje m no es divisible por l_block, entonces se debe agregar 10...0 al último bloque de m para que su largo sea divisible por l_block. Si largo del mensaje m es divisible por l_block, entonces no se debe agregar 10...0 a m.

(2.1) Sí, el largo que se debe poner en el último bloque del padding es n_bytes % (2**l_block).

(2.2) Para representar el largo en el último bloque del padding debes considerar a un arreglo de bytes como un número en base 256.

Aquí van algunos ejemplos del resultado de la función pad suponiendo que el largo del bloque (l_block) es 16.

¿Queda más claro con estos ejemplos?

Saludos!

VicenteVicente commented 2 years ago

Sí!, me quedaron todas mis dudas clarísimas. Sin embargo, me surgió otra sobre un detalle de la base 256:

Si en python yo tengo un int N, y luego hago N.to_bytes(l_block, "big"), pareciera que el resultado ya está en base 256. ¿Estoy en lo correcto?

marceloarenassaavedra commented 2 years ago

Sí, estás en lo correcto.

Saludos!

andresplass commented 2 years ago

@marceloarenassaavedra una duda respecto a lo que debe entregar pad. En el ejemplo de largo 300 está efectivamente el mensaje y su pad, junto con el largo del mensaje en bytes. Dado que no se puede concatenar string y byte la idea es que lo pasemos a algun formato en particular cada byte? (me imagino que hacer str(\x00...) no seria del todo correcto porque se ven los strings por separado.

Gracias de antemano!

marceloarenassaavedra commented 2 years ago

En el ejemplo que mencionas, la función pad recibe el mensaje como un bytearray de largo 300, y debe retornar el padding de este mensaje como un bytearray de largo 320.

Saludos!

Aloncarrasco commented 2 years ago

Me surge un pregunta. el bloque final va a ser de largo l_block y este permite representar un numero de tamaño: (2 8) l_block - 1, pues cada byte al final es de 8 bits que da un tamaño de 2 8. no sería posible dejar el valor final como n%(2 8)** l_block?

marceloarenassaavedra commented 2 years ago

Efectivamente, en el último bloque se puede almacenar un número entre 0 y (2**8)**l_block - 1. Si el largo del mensaje es mayor que este número, se podría utilizar n%((2**8)**l_block)como tú sugieres. En todo caso, en la práctica no es necesario utilizar utiliza % ya que se requiere de mensajes muy grandes para superar el largo máximo que se puede almacenar. Por ejemplo, si usamos bloques de 16 bytes, entonces necesitamos un mensaje con al menos (2**8)**16 = 340282366920938463463374607431768211456 dígitos decimales para no poder almacenar su largo en el último bloque del padding. Para la tarea estamos en la misma situación, en ninguno de los casos de prueba va a ser necesario utilizar %.

Saludos!