Cómo agregar un relleno a los datos para que sea aceptable para el algoritmo de cifrado AES256 en la biblioteca pycrypto

Alguien me puede decir cómo agregar un relleno a los datos para que sea aceptable para el algoritmo de cifrado AES256 en la biblioteca de pycrypto (Python).

Muchas gracias por adelantado.. 🙂

Mirando la documentación , parece que depende de usted, el usuario de la biblioteca, rellenar los datos usted mismo. La documentación indica que el tamaño de bloque para AES siempre es de 16 bytes, por lo que necesita rellenar los datos a un múltiplo de 16 bytes.

La forma en que se realiza el relleno depende del tipo de datos. Para las cadenas, el mejor enfoque es probablemente codificar la cadena a una encoding específica y luego tomar la longitud de esa encoding. De esa manera, no está confiando en que todos los caracteres estén representados por un punto de código de 8 bits:

plaintext = data.encode('utf-8') l = len(plaintext) ciphertext = cipher.encrypt(plaintext + ((16 - len%16) * PADDING_BYTE)) 

Un enfoque similar funcionará cuando sus datos sean una matriz de bytes.

0 debería funcionar bien como PADDING_BYTE , pero debes tener cuidado de eliminar el relleno cuando descifres los datos. Podría valer la pena incluir la longitud de los datos en el texto cifrado, por ejemplo, anteponer la longitud de los datos al texto sin formato antes del cifrado, pero luego es necesario saltar a través de algunos aros para asegurarse de que el relleno se genere correctamente.

Edición : oh, sí, al igual que el RFC GregS se vincula a las menciones, la forma estándar de manejar el problema de la longitud es usar la longitud del relleno como el byte de relleno. Es decir, si necesita 6 bytes de relleno, el byte de relleno es 0x06 . Tenga en cuenta que si no necesita ningún relleno, debe agregar un bloque completo de bytes de relleno (16 bytes de 0xa0 ) para que pueda recuperar el mensaje correctamente.

Use un esquema de relleno estándar, como el esquema descrito en PKCS-5 , sección 6.1.1, paso 4 (reemplace el 8 en ese ejemplo con 16 si está utilizando AES).