2 votes

Décryptage Rijndael en C#

Je dois décrypter une chaîne en utilisant Rijndael et ces valeurs :

taille des touches - 192

taille du bloc - 128

clé - cmdAj45F37I5ud2134FDg2fF

Lorsque j'utilise le code ci-dessous, j'obtiens une erreur : string size 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;

    }

3voto

Henk Holterman Points 153608

Un (gros) problème se pose lors de l'utilisation de UTF8.GetBytes() pour obtenir un byte[] à partir d'une chaîne de caractères. Il est difficile de contrôler le nombre d'octets et ce n'est pas très sûr.

Utilisation Rfc2898DeriveBytes.GetBytes() au lieu de cela. Vous pouvez ensuite spécifier la longueur souhaitée.

Mais il faut bien sûr le faire en même temps que le chiffrement.
Et je suis d'accord avec les remarques de Luke au sujet de l'IV

2voto

LukeH Points 110965

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

Dans ce cas, vous réutilisez la clé en tant qu'IV - ce qui n'est pas une pratique recommandée - mais la taille de l'IV doit correspondre à la taille du bloc, qui est fixée à 128 bits/16 octets.

Ceci étant dit, le problème que je viens de décrire devrait donner lieu à l'erreur suivante "Le vecteur d'initialisation spécifié (IV) ne correspond pas à la taille du bloc pour cet algorithme. , pas "taille de la chaîne de caractères illigle" Il pourrait donc s'agir d'un faux-fuyant.

1voto

Blue Clouds Points 322

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

IV et clé ne sont pas identiques. L'IV sert au salage. Quoi qu'il en soit, l'erreur que vous obtenez est due au fait que l'entrée est codée en 64 bits.

var decodedEncryptionKey= Base64Decode(encryptionKey) ;

var key = Encoding.UTF8.GetBytes(decodedEncryptionKey) ;

Voici 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);
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X