web-dev-qa-db-fra.com

Chiffrement RSA, mauvaise longueur

Lors de l'appel de la fonction suivante:

byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);

Je reçois maintenant l'erreur: mauvaise longueur.

Avec une chaîne plus petite, cela fonctionne, toutes les idées que le problème pourrait être la chaîne que je passe est inférieure à 200 caractères.

50
JL.

Le chiffrement RSA n'est moyen que pour de petites quantités de données, la quantité de données que vous pouvez chiffrer dépend de la taille de la clé que vous utilisez, par exemple pour les clés RSA 1024 bits et le remplissage PKCS # 1 V1.5, vous pouvez chiffrer 117 octets au maximum, avec une clé RSA 2048, vous pouvez chiffrer 245 octets.

Il y a une bonne raison à cela, le chiffrement asymétrique est coûteux en calcul. Si vous souhaitez crypter de grandes quantités de données, vous devez utiliser un cryptage symétrique. Mais que faire si vous voulez la non-répudiation? Eh bien, ce que vous faites ensuite, c'est utiliser les deux. Vous créez une clé symétrique et l'échangez en utilisant un cryptage asymétrique, puis cette clé symétrique échangée en toute sécurité pour crypter vos grandes quantités de données. C'est ce que SSL et WS-Secure utilisent sous les couvertures.

69
blowdart

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

Vous pouvez calculer le nombre maximal d'octets pouvant être chiffrés avec une taille de clé particulière avec les éléments suivants:

((KeySize - 384) / 8) + 37

Cependant, si le paramètre optimal de remplissage de chiffrement asymétrique (OAEP) est vrai, comme il l'est dans la publication d'origine, les éléments suivants peuvent être utilisés pour calculer les octets max:

((KeySize - 384) / 8) + 7

Les tailles de clé légales sont de 384 à 16384 avec une taille de saut de 8.

45
ObjectType

Comme expliqué ci-dessus, la solution aux exceptions de type `` mauvaise longueur '' consiste à hybrider l'utilisation du chiffrement symétrique et asymétrique, afin que la taille du texte que vous chiffrez ne soit pas limitée par la taille de la clé. Vous utilisez essentiellement le chiffrement RSA pour chiffrer de manière asymétrique la clé aléatoire .

Pour le chiffrement:

  1. Générez une clé aléatoire de la longueur requise pour la technique de chiffrement symétrique telle que AES ou Rijndael.

  2. Chiffrez symétriquement votre texte/données à l'aide d'AES/Rijndael à l'aide de la clé aléatoire générée à l'étape 1.

  3. À l'aide de RSA, cryptez de manière asymétrique la clé aléatoire générée à l'étape 1.

Pour le déchiffrement:

  1. Décryptez d'abord la clé aléatoire générée par AES/Rijndael à l'aide de votre clé RSA privée.

  2. Déchiffrez ensuite le texte/les données d'origine à l'aide de la clé aléatoire déchiffrée par RSA

Pour une démonstration, vous pouvez consulter cet exemple suivant en C #:

http://www.technical-recipes.com/2013/using-rsa-to-encrypt-large-data-files-in-c/

17
AndyUK