Open johntrombon opened 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?
Me sumo, tengo el mismo problema.
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)
Ahí si funciona, gracias!
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
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.
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