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 ...
des.KeySize=
128
ou 192
ou 256
cela donneLa clé spécifiée n'est pas une taille valide pour cet algorithme
La clé spécifiée n'est pas une taille valide pour cet algorithme
Je veux savoir pourquoi est-ce arrivé?
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.)
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.
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.
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;