Pregunta

He estado buscando en la mayoría de las bibliotecas de cifrado de Python, he decidido usar PyCrypto o M2Crypto.
He descartado ezPyCrypto porque solo es compatible con MD5 para firmar y Keyczar porque no es lo suficientemente maduro.

Así que he leído que RSA es vulnerable a varios ataques si el texto a cifrar (o el hash de firma) no se rellena correctamente.
¿Qué significa?
Ni PyCrypto ni M2Crypto mencionan nada sobre esto y Google no encontró nada relevante. ¿Estas bibliotecas agregan automáticamente el paddign? ¿Cómo se puede saber?

Si la respuesta a lo anterior es no, ¿qué se considera relleno adecuado?

¿Fue útil?

Solución

PyCrypto no agrega el relleno mencionado.
M2Crypto en su lugar lo hace.

M2Crypto está construido sobre openSSL, admite principalmente todo lo que necesita, todavía se mantiene y está actualizado, mientras que PyCrypto emite varias advertencias de desaprobación.

Otros consejos

Una de las razones para el relleno aleatorio podría ser que " del libro " RSA con exponente bajo (digamos 3) puede descifrarse realmente simplemente si se envía exactamente el mismo mensaje a varias personas (tres).

Por lo tanto, es mejor que se asegure de no enviar exactamente el mismo mensaje aplicando algún tipo de transformación aleatoria (pero reversible) a su mensaje antes.

¿Tal vez de eso se trata el relleno?

EDITAR: Miré en wikipedia. de lo que estaba hablando se llama el ataque de Hastad.

Hace poco luché por descifrar el cifrado ... este artículo me ayudó mucho a explicar lo que era el relleno:

http://www.di-mgt.com.au/cryptopad.html

(el método uno me pareció el más fácil de implementar)

Puedo compartir algunos fragmentos de código si es necesario.

P.S. Este archivo también fue útil para ayudar a crear claves seguras (google for it) PBKDF2.py - PKCS # 5 v2.0 Derivación de clave basada en contraseña

No estoy completamente seguro, pero si agrega un componente aleatorio a su mensaje RSA, evita ataques de diccionario

En primer lugar, debe usar AES, ya que es el estándar de facto.

AES cifra bytes en bloques de 16 bytes. Obviamente, esto funciona bien para cualquier dato grande. Pero lo último, obviamente, tal vez menor que 16 bytes.

Para el último bloque, deberá rellenarlo, y el relleno típico se realiza a través de PCKS7, que es bastante sencillo.

Digamos que tiene una cadena: " icecream " como el último bloque.

" icecream " tiene 8 bytes, por lo que necesita otros 8 bytes para hacer un bloque

Entonces, lo que haces es simplemente agregar el personaje 8 (no '8') 8 veces

"icecream\x08\x08\x08\x08\x08\x08\x08\x08"

Sería su cadena resultante. Ahora sigue adelante y encripta los datos.

Recuerde que mientras descifra, deberá atrapar este último bloque y quitar el relleno antes de usarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top