comment utiliser RSA pour chiffrer des fichiers (données énormes) en C#

je suis nouveau dans le cryptage. J'ai besoin de mettre en place un algorithme de cryptage asymétrique, qui utilise la clé privée/publique. J'ai commencé à utiliser un échantillon de RSACryptoServiceProvider. c'était ok pour les petites données à chiffrer. Mais en l'utilisant sur des données relativement plus grandes "2 lignes", je reçois L'exception CryptographicException "Mauvaise 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);
}

puis j'ai trouvé quelques échantillons de cryptage de grandes données (ou des fichiers) en utilisant CryptoStream, et n'utilisent que des algorithmes symétriques comme DES Ou 3DES, qui ont la fonction CreateEncryptor pour retourner ICryptoTransform comme une des entrées au constructeur de CryptoStream!!!

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

Quelle est la façon de chiffrer les fichiers en utilisant RSA?

41
demandé sur ala 2009-07-29 13:34:57

6 réponses

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

une option que j'ai implémentée quand j'ai besoin de transférer de grandes quantités de données cryptées entre deux systèmes est d'avoir un clavier RSA dont la clé publique est connue à la fois de l'expéditeur et du destinataire, puis quand les données doivent être envoyées, le récepteur génère un nouveau clavier RSA, chiffre la clé publique de ce clavier avec la clé publique commune et envoie la clé publique. chiffrée de la clé publique de l'expéditeur. L'expéditeur déchiffre la clé publique du récepteur à l'aide de sa clé privée (ce que le destinataire n'a pas besoin de savoir, tout comme l'expéditeur n'a pas besoin de savoir la clé privée générée par le récepteur), génère une clé de chiffrement symétrique, chiffre les données à l'aide de la clé symétrique, puis chiffre la clé symétrique à l'aide de la clé publique reçue du destinataire. La clé symétrique cryptée et les données cryptées sont alors envoyées au destinataire qui utilise son clé privée générée pour déchiffrer la clé symétrique, puis déchiffrer les données.

Vous pouvez utiliser le RSACryptoServiceProvider.ToXMLString() et RSACryptoServiceProvider.FromXMLString() méthodes pour stocker la clé publique commune sous forme de chaîne de caractères littérale XML 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 c'est une méthode beaucoup plus sûre de générer des nombres aléatoires (pseudo).

en outre, je recommande fortement de ne pas utiliser 3DES comme votre symétrique algorithme de chiffrement, il est vieux et commence à montrer son âge. Utilisez le cryptage symétrique AES avec l'un des AesCryptoServiceProvicer ou RijndaelManaged classes.

32
répondu Joe Kuemerle 2018-05-22 14:06:41

RSA ne peut chiffrer que les blocs de données qui sont plus courts que la longueur de la clé donc ce que vous faites normalement est

  1. générer une clé aléatoire de la longueur correcte requise pour AES (ou similaire).
  2. chiffrez vos données en utilisant AES ou similaire en utilisant cette clé
  3. chiffrez la clé aléatoire en utilisant votre clé RSA

puis vous publiez les sorties 2 et 3

Pour décrypter

  1. déchiffrez la clé AES en utilisant votre RSA clé.
  2. Déchiffrez les données en utilisant la touche AES
57
répondu jcoder 2015-01-15 15:32:39

habituellement, RSA n'est utilisé que pour transférer une clé symétrique (au début du flux par exemple) et ensuite les données globales sont cryptées avec cette clé.

le cryptage asymétrique n'est pas assez efficace pour transférer beaucoup de données.

20
répondu Henk Holterman 2012-08-21 18:34:52

pour les recherches futures concernant les exceptions RSA de mauvaise longueur...

Vous pouvez calculer le nombre maximum d'octets qui peuvent être cryptées avec une clé de taille avec le code suivant:

((KeySize - 384) / 8) + 37

cependant, si le paramètre optimal asymmetric encryption padding (OAEP) est vrai, les valeurs suivantes peuvent être utilisées pour calculer les octets max:

((KeySize - 384) / 8) + 7

les tailles de clés légales sont de 384 à 16384 avec un taille de saut de 8.

18
répondu ObjectType 2010-07-15 07:03:18

les implémentations. net de RSA (et tous les algorithmes de clés publiques/privées) ne prennent pas en charge de grands blocs de données - parce que ce n'est pas l'objectif des clés publiques/privées.

à la place, ce que vous feriez, c'est 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 décryptent ensuite la clé symétrique et l'utilisent pour décrypter vos données.

6
répondu blowdart 2009-07-29 09:52:11

nous avons:

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

OU

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

ainsi, nous pouvons diviser les données à quelques blocs et puis chiffrer chacun d'eux et ensuite les fusionner

1
répondu kazem 2016-09-06 10:23:17