2010-01-21 15 views

Respuesta

4

Mirando el documentation, parece que le toca a usted, el usuario de la biblioteca, para rellenar los datos por sí mismo. La documentación indica que el tamaño de bloque para AES siempre es de 16 bytes, por lo que debe 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 codificar la cadena a una codificación específica y luego tomar la longitud de esa codificación. De esa manera usted no está confiando en todos los caracteres que se representa mediante 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 estás de datos es una matriz de bytes.

0 debería funcionar bien como PADDING_BYTE, pero debe tener cuidado para eliminar el relleno cuando está descifrando los datos. Puede valer la pena incluir la longitud de los datos en el texto cifrado, p. añada la longitud de los datos al texto sin formato antes del cifrado, pero luego debe pasar por algunos aros para asegurarse de que el relleno se genere correctamente.

Editar: oh sí, al igual que el RFC GregS enlaces a menciones, la forma estándar de manejar el problema de 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.

3

Utilice 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á usando AES).

Cuestiones relacionadas