2010-07-22 3 views
2

je dois déchiffrer une chaîne en utilisant Rijndael et ces valeurs:décryptage Rijndael en C#

taille de la clé - 192

taille de bloc - 128

clé - cmdAj45F37I5ud2134FDg2fF

Quand je suis en utilisant le code ci-dessous je reçois une erreur: taille de la chaîne illigle, quelqu'un peut-il m'aider?

public static string DecryptRijndael(string value, string encryptionKey) 
    { 

      var key = Encoding.UTF8.GetBytes(encryptionKey); //must be 16 chars 
      var rijndael = new RijndaelManaged 
      { 
       BlockSize = 128, 
       IV = key, 
       KeySize = 192, 
       Key = key 
      }; 

      var buffer = Convert.FromBase64String(value); 
      var transform = rijndael.CreateDecryptor(); 
      string decrypted; 
      using (var ms = new MemoryStream()) 
      { 
       using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write)) 
       { 
        cs.Write(buffer, 0, buffer.Length); 
        cs.FlushFinalBlock(); 
        decrypted = Encoding.UTF8.GetString(ms.ToArray()); 
        cs.Close(); 
       } 
       ms.Close(); 
      } 

      return decrypted; 

    } 
+3

Que dit la trace de la pile? Quelle ligne de code est en faute ici? –

+0

Pourriez-vous fournir un exemple non-réel mais qui devrait fonctionner pour le paramètre "value" afin que cela puisse être testé? –

Répondre

2

Pouvez-vous voir le commentaire dans votre code qui dit la clé « doit être 16 caractères »? Votre clé ressemble plus à 24 caractères pour moi!

Dans ce cas, vous réutilisez la clé comme IV - non recommandée, mais la taille de l'IV doit correspondre à la taille du bloc, qui est fixée à 128 bits/16 octets.

Cela dit, le problème que je viens de décrire devrait vous donner l'erreur « vecteur d'initialisation spécifié (IV) ne correspond pas à la taille de bloc pour cet algorithme », non « taille chaîne illigle », alors cela pourrait être un hareng rouge.

3

Un (gros) problème consiste à utiliser UTF8.GetBytes() pour obtenir l'octet [] de la chaîne. Il est difficile de contrôler le nombre d'octets et ce n'est pas très sûr.

Utilisez plutôt Rfc2898DeriveBytes.GetBytes(). Et puis vous pouvez spécifier la longueur désirée.

Mais bien sûr, vous devez le faire tout en cryptant.
Et je suis d'accord avec les remarques de Luke à propos de l'IV

1

L'erreur est due au fait que l'entrée est codée sur 64 bits.

IV et la clé n'est pas la même chose. IV est pour le salage. De toute façon l'erreur que vous obtenez est parce que l'entrée est codée en 64 bits. faites-le et l'erreur disparaîtra.

var decodedEncryptionKey = Base64Decode (encryptionKey);

var clé = Encoding.UTF8.GetBytes (decodedEncryptionKey);

ici est le code complet:

private string decyptInit(string toBeDecrypted, string key, string initVector) 
    { 
     var keyByte = Encoding.Default.GetBytes(key); 
     var decodedIV = Base64Decode(initVector); 
     var iv = Encoding.Default.GetBytes(decodedIV); 

     var rijndael = new RijndaelManaged 
     { 
      BlockSize = 128, 
      IV = iv, 
      KeySize = 192, 
      Key = keyByte 
     }; 

     var buffer = Convert.FromBase64String(toBeDecrypted); 
     var transform = rijndael.CreateDecryptor(); 
     string decrypted; 
     using (var ms = new MemoryStream()) 
     { 
      using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write)) 
      { 
       cs.Write(buffer, 0, buffer.Length); 
       cs.FlushFinalBlock(); 
       decrypted = Encoding.UTF8.GetString(ms.ToArray()); 
       cs.Close(); 
      } 
      ms.Close(); 
     } 

     return decrypted; 
    } public static string Base64Decode(string base64EncodedData) 
    { 
     var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); 
     return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); 
    } 
Questions connexes