Aes Problem [Résolu]

sheppertizer 22 Messages postés jeudi 9 octobre 2008Date d'inscription 23 octobre 2012 Dernière intervention - 4 mai 2012 à 18:31 - Dernière réponse : sheppertizer 22 Messages postés jeudi 9 octobre 2008Date d'inscription 23 octobre 2012 Dernière intervention
- 11 mai 2012 à 00:26
Bonjour a tous, voila j'ai un soucis sur le décryptage d un fichier, jutilise donc la classe RijndaelManaged pour executer mon decryptage avec ce code:

public bool DecryptFile(string inputFile, string outputFile, string sKEY, string sIV)
        {
            CryptoStream cryptoStream = null;
            try
            {
                FileStream fsInput = new FileStream(inputFile, FileMode.Open, FileAccess.Read);
                FileStream fsOutput = new FileStream(outputFile, FileMode.Create, FileAccess.Write);

                string hexKey = "0x" + sKEY;
                string hexIV = "0x" + sIV;
                byte[] KEY = ParseHex(sKEY);
                byte[] KEYIV = ParseHex(sIV);

                RijndaelManaged aes new RijndaelManaged() { IV KEYIV, Key = KEY,Mode = CipherMode.CFB,Padding = PaddingMode.None};

                ICryptoTransform encryptor = aes.CreateDecryptor();
                cryptoStream = new CryptoStream(fsOutput, encryptor, CryptoStreamMode.Write);

                byte[] buffer = new byte[fsInput.Length];
                long bytesProcessed = 0;
                long fileLength = fsInput.Length;
                int bytesInCurrentBlock;

                do
                {
                    bytesInCurrentBlock = fsInput.Read(buffer, 0, buffer.Length);
                    cryptoStream.Write(buffer, 0, bytesInCurrentBlock);
                    bytesProcessed = bytesProcessed + bytesInCurrentBlock;
                }
                while (bytesProcessed < fileLength);

                cryptoStream.Clear();
                cryptoStream.Dispose();
                cryptoStream.Close();
            }
            catch (Exception ex)
            {
                string message3 = Common.Translator.GetString("ERRORUNCRYPT");
                AddToConsole(message3 + ex.Message, LEVEL.ERROR);
                return false;
            }
            return true;
        }

public byte[] ParseHex(string hex)
        {
            int offset = hex.StartsWith("0x") ? 2 : 0;
            if ((hex.Length % 2) != 0)
            {
                //AddToConsole("Invalid length: " + hex.Length, LEVEL.ERROR);
            }
            byte[] ret = new byte[(hex.Length - offset) / 2];

            for (int i = 0; i < ret.Length; i++)
            {
                ret[i] = (byte)((ParseNybble(hex[offset]) << 4)
                                 | ParseNybble(hex[offset + 1]));
                offset += 2;
            }
            return ret;
        }

        static int ParseNybble(char c)
        {
            if (c >= '0' && c <= '9')
            {
                return c - '0';
            }
            if (c >= 'A' && c <= 'F')
            {
                return c - 'A' + 10;
            }
            if (c >= 'a' && c <= 'f')
            {
                return c - 'a' + 10;
            }
            throw new ArgumentException("Invalide hex: " + c);
        }


Le problème est que je pers 2 bytes sur mon décryptage
avec cette exception : Longueur des données à déchiffrer non valide.
la version c++ de mon app ou en ligne de commande sous linux avec openssl tout ce déroule bien, le problème viens en c#

bon


pas bon


Quelqu'un aurais une idée ?
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
sheppertizer 22 Messages postés jeudi 9 octobre 2008Date d'inscription 23 octobre 2012 Dernière intervention - 11 mai 2012 à 00:26
3
Merci
problème réglé, j'ai re-écrit la méthode comme ceci:

public bool DecryptFile(string inputFile, string outputFile, string key, string iv)
        {
            FileStream fsInput = new FileStream(inputFile, FileMode.Open);
            FileStream fsOutput = new FileStream(outputFile, FileMode.Create);
            try
            {
                RijndaelManaged aes = new RijndaelManaged
                {
                    IV = Crypto.ParseHexString(iv),
                    Key = Crypto.ParseHexString(key),
                    Mode = CipherMode.CFB,
                    Padding = PaddingMode.None,
                };

                ICryptoTransform encryptor = aes.CreateDecryptor();

                using (MemoryStream memoryStream = new MemoryStream())
                {
                    int cut;
                    using (CryptoStream output = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                    {
                        cut = (int)(aes.BlockSize - fsInput.Length % aes.BlockSize);
                        byte[] buffer = new byte[fsInput.Length + cut];

                        fsInput.Read(buffer, 0, buffer.Length);
                        output.Write(buffer, 0, buffer.Length);
                    }

                    byte[] data = memoryStream.ToArray();
                    fsOutput.Write(data, 0, data.Length - cut);

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Exception");
                return false;
            }
            fsOutput.Flush();
            fsOutput.Close();
            return true;
        }

Merci sheppertizer 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de sheppertizer
sheppertizer 22 Messages postés jeudi 9 octobre 2008Date d'inscription 23 octobre 2012 Dernière intervention - 7 mai 2012 à 03:07
0
Merci
personnes d’intéressé par mon problème ?
Commenter la réponse de sheppertizer
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 9 mai 2012 à 14:57
0
Merci
Salut,

le souci pourrait provenir du byte 0x00, premier byte à sauter dans ton appli, mais également le byte réservé pour signifier une fin de chaîne de caractères. ça fait pas bien avancer le schmilblick, mais ça peut se creuser.

PS : je connais pas cette librairie
Commenter la réponse de cs_jopop
sheppertizer 22 Messages postés jeudi 9 octobre 2008Date d'inscription 23 octobre 2012 Dernière intervention - 9 mai 2012 à 17:04
0
Merci
Ce qui est bizarre, c'est qu'un fois mon fichier décompressé avec zlib il reste identique malgré l'exception et les 2 bytes manquant
Commenter la réponse de sheppertizer
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 9 mai 2012 à 17:12
0
Merci
Perso j'ai eu un souci un peu similaire en pondant encodeur RSA en Java.
Sous Windows il persistait 2 bytes en début de fichier qui pourrissait tous mes calculs.
C'est pour ça que j'ai pensé à un problème de "byte mal-aimé".

Sinon là je vois pas bien ... t'as déjà tenté le mode debug pas-à-pas pour voir quand est-ce que tu perdais ces deux maudits bytes ?
Commenter la réponse de cs_jopop
sheppertizer 22 Messages postés jeudi 9 octobre 2008Date d'inscription 23 octobre 2012 Dernière intervention - 9 mai 2012 à 17:35
0
Merci
Le problème est qu'en debug pas-a-pas j ai mon visual studio qui plante -_-
Commenter la réponse de sheppertizer
sheppertizer 22 Messages postés jeudi 9 octobre 2008Date d'inscription 23 octobre 2012 Dernière intervention - 9 mai 2012 à 17:56
0
Merci
Petit édit, après avoir fixé le problème de crash de visual studio ^^

je perd mes bytes dans ma boucle read/write de mes 2 fichiers
byte[] buffer = new byte[fsInput.Length];
long bytesProcessed = 0;
long fileLength = fsInput.Length;
int bytesInCurrentBlock;

do
{
     bytesInCurrentBlock = fsInput.Read(buffer, 0, buffer.Length);
     cryptoStream.Write(buffer, 0, bytesInCurrentBlock);
     bytesProcessed = bytesProcessed + bytesInCurrentBlock;
}
while (bytesProcessed < fileLength);


en changeant par

int data;

   while ((data = fsInput.ReadByte()) != -1)
      cryptoStream.WriteByte((byte)data);


j'en perd bien +
Commenter la réponse de sheppertizer

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.