¿Cómo puedo crear una clave usando RSA / ECB / PKCS1Padding en python?

Estoy luchando para encontrar cualquier método de uso de RSA en modo ECB con relleno PKCS1 en python. He buscado en pyCrypto, pero no tienen relleno PKCS1 en la twig maestra (pero sí en un parche). Sin embargo, encontré RSA con PKCS1 en el paquete M2Crypto, pero no estoy seguro de poder elegir el modo ECB …

El modo de encadenamiento, como el BCE, no tiene sentido para RSA, a menos que lo esté haciendo mal.

ECB es para cifrados de bloque: los datos de entrada se dividen en bloques de igual tamaño, y cada bloque se cifra por separado. Esto induce algunas debilidades, por lo que es mejor evitar el modo ECB para los cifrados de bloque.

RSA no es un cifrado de bloque. En particular, RSA necesariamente amplía el mensaje cifrado: con una clave RSA de 1024 bits (un tamaño bastante típico), se puede cifrar un mensaje de hasta 117 bytes, pero el resultado es un valor de 128 bytes.

Uno podría imaginar tomar un mensaje más grande, dividirlo en bloques individuales de 117 bytes de longitud (o menos) y cifrar RSA en cada uno de ellos individualmente, pero nadie lo hace, principalmente debido al aumento de tamaño y el costo de la CPU. Además, los problemas de seguridad relacionados con esa división y recombinación no se estudian en absoluto, por lo que es muy posible que el resultado sea bastante débil. Generalmente, cuando una biblioteca criptográfica requiere un modo de relleno como parte de un nombre de algoritmo, como en ” RSA/ECB/PKCS1Padding “, esto solo se debe a las restricciones de syntax en el nombre, y la parte de encadenamiento ( ECB ) se ignora realmente (Esto es lo que hace Java, por ejemplo).

En la práctica, al cifrar algunos datos que pueden ser más grandes que el tamaño máximo de entrada RSA, se utiliza el cifrado híbrido: lo que se encripta con RSA es una clave simétrica aleatoria (por ejemplo, un grupo de 16 bytes uniformemente aleatorios), y esa clave se utiliza para cifrar simétricamente (por ejemplo, con AES) los datos reales. Esto es más efectivo en el espacio (porque el cifrado simétrico no amplía los bloques) y eficiente en la CPU (el cifrado simétrico es mucho más rápido que el cifrado asimétrico, y en particular el descifrado RSA).