UC-IIC3253 / 2021

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

Sacar A,B,C,D del h0 cualquiera #24

Open Arcoirisky opened 3 years ago

Arcoirisky commented 3 years ago

Hola!

Llevo caleta de tiempo craneandome esto y ahí me dicen si puedo o no preguntarlo u-u pero para la pregunta 2, me darían un h0 = 137269462086865085541390238039692956790 como input, no logro saber cómo desarmarlo en A, B, C y D.

Debe ser un detalle pero les juro que no lo veo xD, además quiero saber qué sucede en casos donde el h0 sea más chico que eso? onda, le falten bytes para completar el resto.

Sé por la issue #18 que desde A,B,C,D puedo llegar a H0 de esta forma

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

¿Pero al revés, desde un H0 llegar a A,B,C,D?

mugartec commented 3 years ago

Hola @Arcoirisky,

En esta respuesta se menciona como obtener a0 y d0 en base a h0. Dejo aquí también el código para que quede más ordenado. Como obtener b0 y c0 es bastante similar.

h0 = 137269462086865085541390238039692956790
a0 = (h0 // (2 ** (32 * 3))) % (2 ** 32)
print(hex(a0))
> 0x67452301
b0 = ...
c0 = ...
d0 = h0 % (2 ** 32)
print(hex(d0))
> 0x10325476
Arcoirisky commented 3 years ago

@mugartec :eye: :lips: :eye: lo vi y no me había funcionado xDD Dios que horror, por alguna razón todos me daban d0 kjaskdj gracias! voy a verlo de nuevo xD

mugartec commented 3 years ago

@Arcoirisky sí, es que había un typo, en vez de // estaba usando %, con lo que simplemente se estaba calculando módulo 232 *3 y luego módulo 232, lo que es lo mismo que simplemente sacar módulo 232, lo que retorna efectivamente el valor de d0.