2009-09-30 11 views
41

Al llamar a la siguiente función:cifrado RSA, que consigue malas longitud

byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true); 

ahora estoy recibiendo el error: mala longitud.

Con una cuerda más pequeña funciona, cualquier idea de lo que podría ser el problema es que la cuerda que estoy pasando tiene menos de 200 caracteres.

Respuesta

58

El cifrado RSA solo significa pequeñas cantidades de datos, la cantidad de datos que puede encriptar depende del tamaño de la clave que está utilizando, por ejemplo, para claves RSA de 1024 bits y PKCS # 1 V1.5 padding , puede encriptar 117 bytes como máximo, con una clave RSA 2048, puede encriptar 245 bytes.

Hay una buena razón para esto, la encriptación asimétrica es computacionalmente costosa. Si desea encriptar grandes cantidades de datos, debe utilizar el cifrado simétrico. Pero, ¿y si quieres no repudiar? Bueno, lo que haces entonces es usar ambos. Usted crea una clave simétrica y la intercambia usando cifrado asimétrico, luego esa clave simétrica intercambiada con seguridad para encriptar sus grandes cantidades de datos. Esto es lo que SSL y WS-Secure debajo de las cubiertas.

+0

¿Sabe fuera mano lo .NET objetar que debería usar para cifrar las cadenas de hasta a 500 caracteres? –

+0

Cualquiera de los algoritmos simétricos. Depende del propósito para el que desee encriptarlo. Probablemente sea mejor decir eso como otra pregunta. – blowdart

+2

No es solo que sea computacionalmente extenso. El algoritmo RSA encripta un número específico, produciendo otro número. Debido a la forma en que funciona el algoritmo, existe un tamaño máximo para ese número. Mientras más amplia sea la clave, mayor será el número máximo que puede encriptar. Una clave de 1024 bits tiene un ancho de 128 bytes, y una clave de 2048 bits es de 256 bytes. Cada uno puede encriptar un número con un ancho máximo un poco menor que su propio ancho. Si el número de entrada es demasiado grande, la salida será la misma que la encriptación de otro número que esté dentro del alcance, y no hay forma de saber cuál fue la entrada real. –

35

Para búsquedas en el futuro con respecto a RSA excepciones mal longitud ...

se puede calcular el número máximo de bytes que pueden ser cifrados con un tamaño de clave particular en lo siguiente:

((keysize - 384)/8) + 37

Sin embargo, si el relleno cifrado asimétrico óptimo (OAEP) parámetro es cierto, como lo es en el post original, se puede utilizar para calcular el bytes max lo siguiente:

((tamaño de clave - 384)/8) + 7

Los tamaños de clave legales son 384 a 16.384 con un tamaño de salto de 8.

15

Como se explicó anteriormente, la solución a las excepciones 'malo longitud' tipo es para hibridar el uso de cifrado simétrico y asimétrico, de modo que el tamaño del texto que está encriptando no está restringido por el tamaño de la clave. Básicamente, utiliza el cifrado RSA para cifrar de forma asimétrica la clave aleatoria .

For encryption:

  1. Generate a random key of the length required for symmetrical encryption technique such as AES or Rijndael.

  2. Symmetrically encrypt your text/data using AES/Rijndael using the random key generated in step 1.

  3. Using RSA, asymmetrically encrypt the random key generated in step 1.

For decryption:

  1. First decrypt the AES/Rijndael-generated random key using your private RSA key.

  2. Then decrypt the original text/data using the RSA-decrypted random key

Para una demostración, es posible que desee echar un vistazo este siguiente ejemplo en C#:

http://www.technical-recipes.com/2013/using-rsa-to-encrypt-large-data-files-in-c/