Open VicenteMerino opened 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!
Perfecto, y respecto a 1, para el mapeo debemos usar ASCII?
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
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?
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 quem
partirá siempre con un 1? (No tendrá ceros a la izquierda) 3) El valor deh0
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ónmd5_custom
, al pasarh0
, 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?