45 votes

l'utilisation de RSA pour crypter des fichiers (énorme de données en C#

Je suis nouveau sur le chiffrement. J'ai besoin de mettre en œuvre le chiffrement asymétrique algorithme, qui, je pense, il utilise de clés publique/privée. J'ai commencé à utiliser un échantillon de RSACryptoServiceProvider. il est ok avec les petits de données à chiffrer. Mais lorsque vous l'utilisez sur un nombre relativement plus grand de données "2 lignes", j'obtiens l'exception CryptographicException "Mauvais Longueur"!

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

Ensuite, j'ai trouvé quelques échantillons de cryptage de données de grande taille (ou fichiers) à l'aide CryptoStream, et d'utiliser uniquement des algorithmes symétriques comme DES ou 3DES, qui ont pour fonction CreateEncryptor de retour ICryptoTransform comme l'un de l'entrée pour le constructeur de CryptoStream!!!

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

Quel est le moyen de crypter les fichiers à l'aide de RSA?

65voto

jcoder Points 14982

RSA ne peut chiffrer des blocs de données qui sont plus courtes que la longueur de la clé de sorte que vous normalement ne est

  1. Générer une clé aléatoire de la lnght requis pour l'AES ou similaire.
  2. Crypter vos données à l'aide de l'algorithme AES ou similaire à l'aide de cette clé
  3. Chiffrer la clé aléatoire à l'aide de votre clé RSA

Alors vous publier à la fois les sorties 2 et 3

Pour décrypter

  1. Décrypter la clé AES à l'aide de votre clé RSA.
  2. Décrypter les données à l'aide de cette clé AES

37voto

Joe Kuemerle Points 3866

Comme mentionné dans d'autres réponses chiffrement asymétrique est conçu uniquement pour le cryptage des données plus petites que la taille de la clé.

Une option que j'ai mis en œuvre lorsqu'il est nécessaire de transférer de grandes quantités de données chiffrées entre les deux systèmes est d'avoir une paire de clés RSA dont la clé publique est connue de l'émetteur et du récepteur, lorsque des données doivent être envoyées au récepteur génère une nouvelle paire de clés RSA, crypte la clé publique de la paire de clés avec la commune de la clé publique et envoie le cryptage de clé publique de l'expéditeur. L'expéditeur décrypte les récepteurs de la clé publique à l'aide de sa clé privée (dont le récepteur n'a pas besoin de savoir, tout comme l'expéditeur n'a pas besoin de connaître les récepteurs clé privée générée), génère une clé de chiffrement symétrique, de crypter les données avec la clé symétrique de la crypte la clé symétrique à l'aide de la clé publique reçue par le récepteur. À la fois la clé symétrique chiffrée et les données chiffrées sont ensuite envoyées au récepteur qui utilise la génération de la clé privée pour déchiffrer la clé symétrique et puis déchiffre les données.

Vous pouvez utiliser le RSACRyptoServiceProvider.ToXMLString et RSACryptoServiceProvider.FromXMLString méthodes pour stocker la commune de la clé publique comme une chaîne de caractères XML littérale dans l'application du récepteur.

N'oubliez pas, lorsque vous générez la clé de chiffrement symétrique à utiliser RNGCryptoServiceProvider() pour générer la clé, car elle est beaucoup plus sûre méthode de génération de (pseudo) aléatoire des nombres.

Aussi, je recommande fortement contre l'utilisation de la 3DES que votre algorithme de chiffrement symétrique, il est vieux et commence à montrer son âge. Utiliser AES chiffrement symétrique avec soit AesCryptoServiceProvicer ou RijndaelManaged classes.

21voto

Henk Holterman Points 153608

Habituellement, le RSA est seulement utilisé pour transférer une clé symétrique (au début du flux par exemple), et la majeure partie des données est crypté avec la clé.

Le chiffrement asymétrique n'est pas assez efficace pour le transfert d'un grand nombre de données.

19voto

abscode Points 488

Pour de futures recherches concernant le RSA mauvais longueur des exceptions...

Vous pouvez calculer le nombre maximum d'octets qui peuvent être cryptées avec une clé de taille avec les éléments suivants:

((KeySize - 384) / 8) + 37

Toutefois, si l'optimal asymmetric encryption padding (OAEP.) paramètre est true, le suivant peut être utilisé pour calculer le max octets:

((KeySize - 384) / 8) + 7

La clé légale tailles sont 384 thru 16384 avec un saut de taille de 8.

8voto

blowdart Points 28735

L' .NET implémentations de RSA (et toutes les clés publique/privée algorithmes) ne prennent pas en charge les gros blocs de données - parce que ce n'est pas le but de clés publique/privée.

Au lieu de ce que vous voulez faire est de générer une nouvelle clé symétrique et l'utiliser pour chiffrer les données. Ensuite, vous utilisez publique/clé privée pour chiffrer la clé symétrique et d'échanger avec l'autre partie de manière sécurisée. Ils ont ensuite déchiffrer la clé symétrique et de l'utiliser pour décrypter vos données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X