Pregunta

Soy nuevo en el cifrado. Necesito aplicar el algoritmo de cifrado asimétrico, que creo que utiliza la clave privada / pública. Empecé a usar una muestra de RSACryptoServiceProvider. que estaba bien con los datos pequeños para cifrar. Sin embargo, cuando se utiliza en un número relativamente grandes de datos "2 líneas", me sale el CryptographicException excepción "Bad Longitud"!

//Create a new instance of RSACryptoServiceProvider.
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{

    //Import the RSA Key information. This only needs
    //toinclude the public key information.
    //RSA.ImportParameters(RSAKeyInfo);
    byte[] keyValue = Convert.FromBase64String(publicKey);
    RSA.ImportCspBlob(keyValue);

    //Encrypt the passed byte array and specify OAEP padding.  
    //OAEP padding is only available on Microsoft Windows XP or
    //later.  
    encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
}

Entonces me encontré con algunas muestras de cifrado de datos de gran tamaño (o archivos) mediante el uso de CryptoStream, y sólo usar algoritmos simétricos como DES o 3DES, que tienen la CreateEncryptor función para devolver ICryptoTransform como una de las entradas para el constructor de CryptoStream !! !

CryptoStream cStream = new CryptoStream(fStream,
                new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),
                CryptoStreamMode.Write);

¿Cuál es la manera de cifrar archivos usando RSA?

¿Fue útil?

Solución

Como se ha mencionado en otras respuestas cifrado asimétrico está diseñado únicamente para la encriptación de datos más pequeño que su tamaño de la clave.

Una de las opciones que he implementado cuando es necesario transferir grandes cantidades de datos cifrados entre dos sistemas es tener un par de claves RSA cuya clave pública se sabe que tanto el emisor como el receptor continuación, cuando las necesidades de datos a enviar al receptor genera una nuevo par de claves RSA, encripta la clave pública del par de claves que con la clave pública común y envía la clave pública encriptada al remitente. El remitente descifra la clave pública receptores utilizando su clave privada (que el receptor no necesita saber, al igual que el emisor no necesita saber los receptores generan clave privada), genera una clave de cifrado simétrico, cifra los datos con la clave simétrica y luego encripta la clave simétrica utilizando la clave pública recibida desde el receptor. Tanto la clave simétrica cifrada y los datos cifrados se envían al receptor que utiliza su clave privada generada para descifrar la clave simétrica y luego descifra los datos.

Puede utilizar los métodos RSACryptoServiceProvider.ToXMLString() y RSACryptoServiceProvider.FromXMLString() para almacenar la clave pública común como una cadena literal XML en la aplicación del receptor.

No se olvide, al generar la clave de cifrado simétrico para usar RNGCryptoServiceProvider() para generar la clave, ya que es un método mucho más seguro de generar (pseudo) números aleatorios.

Además, yo recomiendo no usar 3DES como su algoritmo de cifrado simétrico, es viejo y empezando a mostrar su edad. Uso AES de cifrado simétrico con cualquiera de las clases o AesCryptoServiceProvicer RijndaelManaged.

Otros consejos

RSA sólo se puede cifrar bloques de datos que son más cortas que la longitud de la clave así que lo que lo hace normalmente es

  1. Generar una clave aleatoria de la longitud correcta requerida para AES (o similar).
  2. cifrar los datos utilizando AES o similar utilizando esa clave
  3. cifrar la clave aleatoria usando su clave RSA

A continuación se publica tanto las salidas de 2 y 3

Para descifrar

  1. descifrar la clave AES utilizando su clave RSA.
  2. descifrar los datos utilizando dicha clave AES

Por lo general, RSA sólo se utiliza para transferir una clave simétrica (en el inicio de la corriente, por ejemplo) y luego los datos a granel se cifrado con esa clave.

El cifrado asimétrico no es lo suficientemente eficiente para transferir una gran cantidad de datos.

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:

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

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

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

Los tamaños de clave legales 384 thru 16384 con un tamaño de salto de 8.

Las implementaciones .NET de RSA (y todos los algoritmos de clave pública / privada) no son compatibles con grandes bloques de datos -. Porque ese no es el objetivo de clave pública / privada

En cambio, lo que haría es generar una nueva clave simétrica y el uso que para cifrar los datos. A continuación, utiliza la clave pública / privada para cifrar la clave simétrica e intercambiarlo con la otra parte de forma segura. A continuación, descifrar la clave simétrica y lo usan para desencriptar los datos.

tenemos:

MaxBlockSize=((KeySize - 384) / 8) + 37

o

MaxBlockSize=((KeySize - 384) / 8) + 7

Por lo tanto, podemos dividir los datos de algunos bloques y luego cifrar cada uno y luego fusionarlas

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