with example encrypt c# cryptography rsa encryption-asymmetric 3des

example - rsa c#



cómo usar RSA para cifrar archivos(datos enormes) en C# (6)

Soy nuevo en el cifrado. Necesito implementar un algoritmo de encriptación asimétrico, que creo que usa una clave privada / pública. Empecé a usar una muestra de RSACryptoServiceProvider. estaba bien con pequeños datos para encriptar. ¡Pero cuando lo uso en datos relativamente grandes "2 líneas", obtengo la excepción CryptographicException "Bad Length"!

//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); }

Luego encontré algunas muestras de encriptación de datos grandes (o archivos) utilizando CryptoStream, y solo uso algoritmos simétricos como DES o 3DES, que tienen la función CreateEncryptor para devolver ICryptoTransform como una de las entradas al constructor de CryptoStream.

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

¿Cuál es la forma de encriptar archivos usando RSA?


Como se menciona en otras respuestas, la encriptación asimétrica solo está diseñada para encriptar datos más pequeños que su tamaño de clave.

Una opción que he implementado cuando necesito transferir grandes cantidades de datos cifrados entre dos sistemas es tener un par de claves RSA cuya clave pública sea conocida tanto por el emisor como por el receptor, cuando los datos deben enviarse, el receptor genera un nuevo par de claves RSA , encripta la clave pública de ese par de llaves con la clave pública común y envía la clave pública encriptada al remitente. El remitente descifra la clave pública de los receptores usando su clave privada (que el receptor no necesita saber, así como el remitente no necesita conocer la clave privada generada por los receptores), genera una clave de cifrado simétrica, encripta los datos con la clave simétrica y luego encripta la clave simétrica usando la clave pública recibida del receptor. Tanto la clave simétrica encriptada como los datos encriptados se envían al receptor que usa su clave privada generada para descifrar la clave simétrica y luego descifra los datos.

Puede utilizar los RSACryptoServiceProvider.ToXMLString() y RSACryptoServiceProvider.FromXMLString() para almacenar la clave pública común como un literal de cadena XML en la aplicación receptora.

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

Además, recomiendo enfáticamente no usar 3DES como su algoritmo de cifrado simétrico, es antiguo y comienza a mostrar su antigüedad. Utilice el cifrado simétrico AES con las clases AesCryptoServiceProvicer o RijndaelManaged .


Las implementaciones .NET de RSA (y todos los algoritmos de clave pública / privada) no admiten grandes bloques de datos, porque ese no es el objetivo de la clave pública / privada.

En cambio, lo que haría sería generar una nueva clave simétrica y usarla para encriptar los datos. Luego, usa la clave pública / privada para encriptar la clave simétrica e intercambiarla con la otra parte de forma segura. A continuación, desencriptan la clave simétrica y la utilizan para desencriptar sus datos.


Normalmente, RSA solo se usa para transferir una clave simétrica (al comienzo de la transmisión, por ejemplo) y luego los datos masivos se cifran con esa clave.

La encriptación asimétrica no es lo suficientemente eficiente como para transferir una gran cantidad de datos.


Para búsquedas futuras con respecto a las excepciones de longitud incorrecta de RSA ...

Puede calcular el número máximo de bytes que se pueden cifrar con un tamaño de clave determinado con lo siguiente:

((KeySize - 384) / 8) + 37

Sin embargo, si el parámetro óptimo de relleno de cifrado asimétrico (OAEP) es verdadero, se puede usar lo siguiente para calcular los bytes máximos:

((KeySize - 384) / 8) + 7

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


RSA solo puede cifrar bloques de datos que son más cortos que la longitud de la clave, por lo que lo que normalmente hace es

  1. Genere una clave aleatoria de la longitud correcta requerida para AES (o similar).
  2. Cifre sus datos usando AES o similar usando esa clave
  3. Cifre la clave aleatoria usando su clave RSA

Luego publicas las salidas de 2 y 3

Para descifrar

  1. Desencripta la clave AES usando tu clave RSA.
  2. Descifra los datos usando esa clave AES

tenemos:

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

O

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

entonces, podemos dividir Datos en algunos bloques y luego encriptarlos y luego fusionarlos