Question

Je suis nouveau cryptage. Je dois mettre en œuvre l'algorithme de chiffrement asymétrique, qui je pense qu'il utilise la clé privée / publique. J'ai commencé à l'aide d'un échantillon de RSACryptoServiceProvider. il était correct avec de petites données pour chiffrer. Mais lorsque vous l'utilisez sur des données relativement plus « 2 lignes », je reçois l'exception CryptographicException « Bad 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);
}

Alors j'ai trouvé quelques échantillons de crypter des données volumineuses (ou fichiers) en utilisant CryptoStream, et utiliser uniquement des algorithmes symétriques comme DES ou 3DES, qui ont la fonction CreateEncryptor revenir ICryptoTransform comme l'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?

Était-ce utile?

La solution

Comme mentionné dans d'autres réponses chiffrement asymétrique est uniquement destiné à crypter des données plus petites que la taille de clé.

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

Vous pouvez utiliser les RSACryptoServiceProvider.ToXMLString() et les méthodes RSACryptoServiceProvider.FromXMLString() pour stocker la clé publique commune comme une chaîne XML littérale dans l'application du récepteur.

Ne pas oublier, lorsque vous générez la clé de chiffrement symétrique à utiliser RNGCryptoServiceProvider() pour générer la clé car il est une méthode beaucoup plus sûre de générer (pseudo) nombres aléatoires.

En outre, je recommande fortement l'utilisation de 3DES comme algorithme de chiffrement symétrique, il est vieux et commence à montrer son âge. Utilisez le cryptage AES symétrique avec soit les classes AesCryptoServiceProvicer ou RijndaelManaged.

Autres conseils

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

  1. Générer une clé aléatoire de la bonne longueur requise pour AES (ou similaire).
  2. Chiffrer vos données en utilisant AES ou similaire en utilisant cette clé
  3. Chiffrer la clé aléatoire à l'aide de votre clé RSA

Ensuite, vous publiez les deux sorties de 2 et 3

Pour décrypter

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

Habituellement, RSA est uniquement utilisée pour transférer une clé symétrique (au début du flux par exemple) et ensuite les données en vrac est chiffré avec cette clé.

Le chiffrement asymétrique est pas assez efficace pour transférer beaucoup de données.

Pour les recherches futures sur les exceptions mauvaise longueur RSA ...

Vous pouvez calculer le nombre maximum d'octets qui peut être chiffré avec une taille de clé particulière à ce qui suit:

((KeySize - 384) / 8) + 37

Cependant, si le paramètre Optimal Asymmetric Encryption Padding (OAEP) est vraie, ce qui suit peut être utilisée pour calculer les octets max:

((KeySize - 384) / 8) + 7

Les dimensions clés juridiques sont 384-16384 avec une taille de saut de 8.

Les implémentations .NET de RSA (et tous les algorithmes de clés publiques / privées) ne prennent pas en charge les grands blocs de données -. Parce que ce n'est pas le but de la clé publique / privée

Au lieu de cela ce que vous feriez est de générer une nouvelle clé symétrique et l'utiliser pour chiffrer les données. Ensuite, vous utilisez la clé publique / privée pour chiffrer la clé symétrique et l'échanger avec l'autre partie en toute sécurité. Ils décryptent alors la clé symétrique et l'utiliser pour déchiffrer vos données.

nous avons:

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

ou

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

, nous pouvons diviser les données à certains blocs puis chiffrer chacun, puis les fusionner

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top