UC-IIC3253 / 2022

37 stars 6 forks source link

[T2P1] Casos de prueba para la pregunta 1 #50

Closed marceloarenassaavedra closed 2 years ago

marceloarenassaavedra commented 2 years ago

Para probar sus soluciones de la pregunta 1, consideren la siguiente implementación de AES para llaves y mensajes de 16 bytes (128 bits):

from Crypto.Cipher import AES

def AES_128(key: bytearray, message: bytearray) -> bytearray:
    a = AES.new(key, AES.MODE_ECB)
    return bytearray(a.encrypt(message))

Utilizando esta implementación de AES y las funciones pedidas en la tarea, pruebe su implementación incluyendo el siguiente main:

if __name__ == "__main__":
    compresion = davies_meyer(AES_128, 16, 16)
    hash = merkle_damgard(bytearray(b'1234567890123456'), compresion, 16)

    s1 = bytearray(b'Este es un mensaje de prueba para la tarea 2')
    s2 = bytearray(b'Este es un mensaje de Prueba para la tarea 2')
    s3 = bytearray(b'Un mensaje corto')
    s4 = bytearray(b'')

    h1 = hash(s1)
    h2 = hash(s2)
    h3 = hash(s3)
    h4 = hash(s4)

    print(h1)
    print(h2)
    print(h3)
    print(h4)

El resultado de ejecutar su programa debería ser el siguiente:

bytearray(b'\xe9\xe8\xac\x12\\\xf2\xc8\x16\xceOV\xc5Y.T\xea')
bytearray(b'\xb6\xfb\xc6a\x12\xae\x95\x1f\xda\xc5\x13\xde\x06|Q\x96')
bytearray(b'\xc5\xec\xcdd\xa4(R*\xf0L*QtL\xda\x81')
bytearray(b'p\xca \xd8\x9c\xeb\xe6\xb1\xce\xcf\x03\xb2\x9e\x93\x19\xbc')

Saludos!

ljrodriguez1 commented 2 years ago

Hola, Tengo dos preguntas sobre este caso de prueba,

En primer lugar AES, no me permite recibir un bytearray, solo algo del tipo bytes, es esto un problema, pregunto porque en su definición ocupa un bytearray.

Por otro lado se ocupa un IV el cual es bytearray(b'1234567890123456'), este parametro yo lo ocupo en davies_meyer para llegar al resultado correcto, pero en su definicion del enunciado, nunca se le pasa este parametro a esa funcion, estoy haciendo algo mal?

marceloarenassaavedra commented 2 years ago

Hola!

No es un problema para el funcionamiento de AES_128 que la llave y el mensaje sean de tipo bytearray, puesto que AES también funciona con entradas de este tipo.

La función davies_meyer solo recibe como parámetros una función encrypt para cifrar mensajes, el largo de la llave l_key para encrypt y el largo de los mensajes l_message para encrypt, y a partir de estos parámetros debe generar una función de compresión. La construcción de Davies-Meyer no necesita un vector de inicialización, por lo que IV no se debe ocupar en la función davies_meyer.

Saludos!

ljrodriguez1 commented 2 years ago

Hola, no se si tendre otra version de pycrypto pero AES me lanza un error cuando le paso un bytearray. No me es tanto problema ya que simplemente paso el bytearray a tipo byte

por otro lado, creo que me estoy confundiendo al generar la funcion davies_meyer y merkle-damgard.

Para mi davies_meyer es la funcion que hace el hash, es decir separa el mensaje el bloque y lo va hasheando como se indica en clases, por otro lado merkle-damgard le agrega el padding a el mensaje y luego retorna davies_meyer, me estoy equivocando?

marceloarenassaavedra commented 2 years ago

La construcción de Davies-Meyer solo se utilizada para generar una función de compresión, vale decir, una función de hash para mensajes de largo fijo. La construcción de Merkle-Damgard se utiliza para generar una función de hash para mensajes de largo arbitrario, y es esta construcción la que primero utiliza una función de padding y luego va dividiendo el mensaje en bloques. Las definiciones formales de estas construcciones están en la presentación de clases sobre construcción de funciones de hash.

Saludos!

Ignaciomendezp commented 2 years ago

Al probar los test, me sale que AES_128 NO recibe bytearray como parametros, sino que los tengo que pasar a bytes para que no me de error. Es esto correcto?

ljrodriguez1 commented 2 years ago

Hola, me paso lo mismo por usar la librería incorrecta, instala pycryptodome

Jaluco commented 2 years ago

Hola, me paso lo mismo por usar la librería incorrecta, instala pycryptodome

Yo instale esa pero me aparece el error, lo solucione poniendo solo un bytes(message+H) cuando queria usar la compresion, la que retorna un bytearray(aes.encrypt(mensaje)) para mantener los tipos de entrada y retorno que se piden en el enunciado