es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Descifrar AES ECB utilizando python

Tengo algunos datos que quiero descifrar, los cuales están encriptados en AES ECB con relleno PKCS5 utilizando Java. Pero estoy teniendo dificultades para descifrarlos. He intentado muchos tutoriales y respuestas de Stack Overflow, pero nada me ha funcionado. Ayúdame con esto.

Estoy intentando de esta manera:

    BLOCK_SIZE = 16
    pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \
                chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)
    unpad = lambda s: s[:-ord(s[len(s) - 1:])]

    def decrypt(key,enc):
        enc = b64decode(enc)
        cipher = AES.new(key.encode("utf8"), AES.MODE_ECB)
        return unpad(cipher.decrypt(enc)).decode('utf8')

    key = '0vlqRTgxr0C]X29C(}{M\&TZErb$1!f{'
    enc = 'T3cPMizpZj63+iVwXvlFUnD8Hld5XN4h3v3Ncd8YuIk='

Pero solo obtengo una cadena vacía como resultado.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En primer lugar, es importante asegurarse de que la clave utilizada para el cifrado sea la misma que se utiliza para el descifrado. Verifica que la clave sea correcta.

    En segundo lugar, es importante asegurarse de que el relleno utilizado para el cifrado coincida con el relleno utilizado para el descifrado. En este caso, el cifrado utiliza un relleno PKCS5, por lo que la función de descifrado también debe utilizar un relleno PKCS5.

    Intenta reemplazar el tamaño del bloque y las funciones de relleno con el siguiente código:

    BLOCK_SIZE = 16
    
    def pad_pkcs5(s):
        padding = BLOCK_SIZE - len(s) % BLOCK_SIZE
        return s + padding.to_bytes(1, byteorder='big') * padding
    
    def unpad_pkcs5(s):
        padding = s[-1]
        return s[:-padding] 
    

    Luego, utiliza las funciones pad_pkcs5 y unpad_pkcs5 en lugar de las lambdas en tu código:

    def decrypt(key, enc):
        enc = b64decode(enc)
        cipher = AES.new(key.encode("utf8"), AES.MODE_ECB)
        return unpad_pkcs5(cipher.decrypt(enc)).decode('utf8')
    

    Asegúrate también de importar base64 y AES correctamente:

    from base64 import b64decode
    from Crypto.Cipher import AES
    

    Espero que esto ayude con el proceso de descifrado.

Comments are closed.