UC-IIC3253 / 2021

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

[Tarea 1] Input h0 en md5 #18

Open johntrombon opened 3 years ago

johntrombon commented 3 years ago

Hola! Como la definición de md5 en los anexos del curso utiliza a0, b0, c0 y d0 como valores iniciales en lugar de un h0, ¿como se espera la construcción de estos a partir de un h0? En un principio había asumido que h0 era la concatenación de los 4 inicializadores tomando a0 como el más significativo y d0 como el menos pero estoy teniendo problemas para acceder al canal de mensajes de la pregunta 3 que hacen uso de la función.

A modo de ilustración, si los inicializadores del md5 original son los siguientes var int a0 := 0x67452301
var int b0 := 0xefcdab89
var int c0 := 0x98badcfe
var int d0 := 0x10325476

¿Cual sería el h0 pasado como parametro para obtener dichos valores? Yo estoy teniendo problemas usando h0 = 0x67452301efcdab8998badcfe10325476

VicenteMerino commented 3 years ago

Si, yo había hecho lo mismo y tengo el mismo problema, de esa forma no puedo encontrar mis mensajes. Además quiero saber qué pasa si el h0 ingresado es menor a 32 bits? Relleno con 0s a la izquierda? O de qué forma?

fdduarte commented 3 years ago

Me sumo, tengo el mismo problema.

mugartec commented 3 years ago

Hola @JohnTrombon, @VicenteMerino y @fdduarte,

Disculpen la demora. Primero les cuento que nos descoordinamos con los ayudantes y la función que usamos para generar los mensajes tomaba h0 simplemente como a0 (módulo 232). El resto de las variables se definía tal cual en md5. Por favor cuéntenme por aquí si eso les funciona.

Ahora respecto de la pregunta misma, la forma en que realmente queremos representar a0, b0, c0 y d0 es simplemente dividir h0 en chunks de 4 bytes. El orden considerará que a0 son los 4 bytes de más a la izquierda de h0, es decir a0 = (h0 % (2 ** (32 * 3))) % (2 ** 32) (notar que aplicamos % (2 ** 32) al final en caso de que el parámetro h0 sea mayor a 2128). De la misma forma, d0 estará compuesto por últimos 4 bytes de h0, es decir d0 = h0 % (2 ** 32). b0 y c0 se computan de forma similar.

Siguiendo esta lógica, el h0 correspondiente a las constantes que se definen para md5 y que menciona @JohnTrombon sería 137269462086865085547664542366969255030 (este valor es incorrecto, ver EDIT más abajo).

Lo que haremos para resolver el problema es publicar otra planilla que tendrá la misma información pero utilizando h0 como se menciona arriba, lo que significa que sólo cambiarán los índices. Me cuentan por favor si se entiende o tienen cualquier comentario. Saludos!


EDIT Tal como se menciona más abajo el valor h0 de arriba está incorrecto. Dejo aquí el código para generar el valor correcto y que no haya errores:

a0 = 0x67452301
b0 = 0xefcdab89
c0 = 0x98badcfe
d0 = 0x10325476

h0 = a0 * 2 ** (32 * 3)
h0 += b0 * 2 ** (32 * 2)
h0 += c0 * 2 ** 32
h0 += d0

print(h0)
> 137269462086865085541390238039692956790

EDIT 2 Había un pequeño typo en la forma de obtener a0 en base a h0, la forma correcta es

a0 = (h0 // (2 ** (32 * 3))) % (2 ** 32)
fdduarte commented 3 years ago

Ahí si funciona, gracias!

johntrombon commented 3 years ago

Profesor, nuevamente no puedo obtener mis mensajes, siendo que ayer pude haciendo uso de la planilla anterior. El h_0 que utiliza mi implementacion (y con el que obtengo checksums consistentes) es: 0x67452301efcdab8998badcfe10325476 El h_0 que indica usted es 137269462086865085547664542366969255030 = 0x67452301efcdab89efcdab8910325476 Noto que difieren en el penultimo pedazo 0x67452301efcdab8998badcfe10325476 0x67452301efcdab89efcdab8910325476

Jamidd commented 3 years ago

Hola, estas en lo correcto, hubo un pequeño error. Prueba con h0 = 137269462086865085541390238039692956790, eso te debería funcionar. Cualquier cosa nos avisas. Saludos, Jaime.