web-dev-qa-db-fra.com

Taille de la clé 3DES: une matière en C # .Net

Le code ci-dessous fonctionne correctement dans c # .NET

byte[] key = Encoding.ASCII.GetByte("012345678901234567890123"); //24characters        
byte[] plainText = Encoding.ASCII.GetBytes("lasaa"); 
TripleDES des = TripleDES.Create();
des.Key = key;
des.Mode = CipherMode.CBC;
ICryptoTransform ic = des.CreateEncryptor();
byte[] enc = ic.TransformFinalBlock(plainText, 0, plainText.Length);
MessageBox.Show(UTF8Encoding.UTF8.GetString(enc));

Mes questions concernant ci-dessus sont ...

  1. Comment puis-je spécifier KeySize? si j'utilise des.KeySize=128 ou 192 ou 256 cela donne

La clé spécifiée n'est pas une taille valide pour cet algorithme

  1. Si je change la longueur de caractère dans la clé en ajoutant plus (ex: 40 caractères). Ça donne une erreur

La clé spécifiée n'est pas une taille valide pour cet algorithme

Je veux savoir pourquoi est-ce arrivé?

19
llcoollasa

Une clé 3DES a une longueur de 128 ou 192 bits. Notez que, en interne , l'algorithme n'utilisera que 112 (respectivement 168) bits sur ces 128 (respectivement 192) bits; cependant, la clé elle-même, telle que codée en octets, stockée et échangée, doit avoir une longueur de 16 ou 24 octets. Tenter de définir une clé qui n’a pas l’une de ces deux longueurs déclenche une erreur que vous observez lorsque vous essayez d’utiliser une clé de 40 octets.

Vous ne devez pas essayer de définir la "taille de la clé": vous décidez déjà de le définir lorsque vous définissez la clé. Lorsque vous définissez la propriété TripleDES.Key, la classe TripleDES voit que vous lui attribuez une clé de 24 octets et définit ainsi la propriété KeySize sur 192.

(La sortie du chiffrement 3DES est binaire et non pas au format UTF-8 d'une chaîne. Il est fort probable que votre UTF8Encoding.UTF8.GetString(enc) final proteste.)

26
Thomas Pornin

La taille de la clé pour TripleDES est de 168 bits. Donc, vous aurez besoin de 21 octets. Si vous voulez utiliser une chaîne pour la clé, vous devez commencer par la hacher. Dans ce cas, vous pouvez utiliser n’importe quelle longueur de caractères (plus il est préférable), puis ajuster la sortie hachée à la taille de votre clé. Par exemple. si vous utilisez SHA-256 à partir duquel vous aurez 32 octets, utilisez 21 d'entre eux.

4
WhiteFang34

Je pense que le problème ici est que 192bits est la taille de clé maximale prise en charge pour 3DES en C # (et ailleurs, je suppose).

http: //msdn.Microsoft.com/en-us/library/system.security.cryptography.symmetricalgori ...

Avez-vous essayé de définir la clé sur une valeur de 16 octets/caractères?

La seule autre taille prise en charge semble être 128 bits. Si vous voulez quelque chose de plus fort, vous devrez utiliser un algorithme différent, Aes/Rijndael.

Si vous regardez TDES sur Wikipedia , il semble que la taille maximale de la clé est de 168 bits, donc je ne suis pas sûr de savoir comment Microsoft l’a implémentée.

Je soupçonne que votre exemple a été omis pour des raisons de brièveté, mais vous devriez probablement hacher votre clé avec une bonne dose de sel. Il existe plusieurs algorithmes RNG/HSH pour cela dans l'espace de noms crypto. 

0
Jodrell

Voici un code que j'ai utilisé pour accomplir ce "trim"

byte[] keyArray;
SHA512CryptoServiceProvider hash = new SHA512CryptoServiceProvider();
keyArray = hash.ComputeHash(UTF8Encoding.UTF8.GetBytes("someProperlySaltedKey"));
byte[] trimmedBytes = new byte[24];
Buffer.BlockCopy(keyArray, 0, trimmedBytes, 0, 24);
keyArray = trimmedBytes;
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
0
Krondorian