IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

D�crypter un tableau de bytes en C++/CLI


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2016
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Consultant informatique

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Par d�faut D�crypter un tableau de bytes en C++/CLI
    Bonjour � tous,

    J'ai un probl�me qui me fait tourner en rond depuis un moment.
    J'ai des programmes qui se communiquent des donn�es via une base SQL.
    Par s�curit�, une partie de ces donn�es (de petits fichiers en fait) sont crypt�es et stock�s temporairement en varbinary dans la base.

    Ces donn�es crypt�es peuvent correspondre � des fichiers texte ou XML (UTF-8 sans BOM).

    Le programme C++ est en charge de d�crypter les donn�es.
    Quand je d�crypte des fichiers texte, pas de probl�me, tout fonctionne bien.
    Pour les fichier XML, le d�chiffrement �choue vers la fin du fichier avec l'erreur : 0x024e1e64 { "Longueur des donn�es � d�chiffrer non valide."}

    Le programme ressemble � cela :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    array<Byte>^ Projet1::EncryptBytes_AES(array<Byte>^ cipheredData, int myLength, String myPassword)
    {
     
    	RijndaelManaged^ myRijndael = gcnew RijndaelManaged();
    	UTF8Encoding^ utf8 = gcnew UTF8Encoding;
    	array<Byte>^ encodedBytes = utf8->GetBytes(myPassword);
     
    	array<Byte>^ Key = encodedBytes;
    	array<Byte>^ IV = encodedBytes;
     
    	MemoryStream^ msDecrypt;
    	CryptoStream^ csDecrypt;
    	StreamReader^ srDecrypt;
     
    	MemoryStream^ msResult = gcnew MemoryStream(myLength);
    	array<Byte>^ resultat;
     
    	RijndaelManaged^ aesAlg;
     
    	String^ plaintext;
     
    	aesAlg = gcnew RijndaelManaged();
    	aesAlg->Padding = PaddingMode::None;
    	aesAlg->Key = Key;
    	aesAlg->IV = IV;
     
    	ICryptoTransform^ decryptor = aesAlg->CreateDecryptor(aesAlg->Key, aesAlg->IV);
     
    	msDecrypt = gcnew MemoryStream(cipheredData);
    	csDecrypt = gcnew CryptoStream(msDecrypt, decryptor, CryptoStreamMode::Read);
    	srDecrypt = gcnew StreamReader(csDecrypt);
     
    	csDecrypt->CopyTo(msResult);
            resultat = msResult->ToArray();
     
    	if (srDecrypt) srDecrypt->Close();
    	if (csDecrypt) csDecrypt->Close();
    	if (msResult) msResult->Close();
    	if (msDecrypt) msDecrypt->Close();
    	if (aesAlg) aesAlg->Clear();
     
    	return resultat;
     
    }

    Pour information, le programme d'origine qui crypte les donn�es est un programme VB.NET qui ressemble � cela.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Public Function MSecureB (ByVal Source() As Byte, ByVal MyPassword as String) As Byte()
     
            Using aesAlg As Aes = Aes.Create()
     
                aesAlg.Key = System.Text.UTF8Encoding.UTF8.GetBytes(MyPassword)
                aesAlg.IV = System.Text.UTF8Encoding.UTF8.GetBytes(MyPassword)
     
                Dim encryptor As ICryptoTransform = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV)
     
                Using msEncrypt As New MemoryStream()
     
                    Using csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
     
                        csEncrypt.Write(Source, 0, Source.Length)
                        csEncrypt.FlushFinalBlock()
                        Return msEncrypt.ToArray()
     
                    End Using
     
                End Using
     
            End Using
     
        End Function
    Et curieusement, si j'utilise en VB.NET un programme �quivalent au C++ pour d�crypter mes fichiers XML, l�, aucuns probl�mes.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Public Function MSecureDecrypte_ByteArray(ByVal Source As Byte(), ByVal MyPassword as String) As Byte()
     
             Using aesAlg As Aes = Aes.Create()
     
                aesAlg.Key = System.Text.UTF8Encoding.UTF8.GetBytes(MyPassword)
                aesAlg.IV = System.Text.UTF8Encoding.UTF8.GetBytes(MyPassword)
     
                Dim decryptor As ICryptoTransform = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV)
     
                Using msDecrypt As New MemoryStream(Source)
     
                    Using csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)
     
                        Using srDecrypt As New StreamReader(csDecrypt)
     
                            Using ms2 As New MemoryStream()
                                csDecrypt.CopyTo(ms2)
                                MSecureDecrypte_ByteArray = ms2.ToArray()
                            End Using
     
                        End Using
     
                    End Using
     
                End Using
     
            End Using
     
        End Function
    PS : Si j'utilise un vecteur identique � ma cl� c'est simplement pour simplifier le code exemple.


    Merci � ceux qui pourront m'apporter un �clairage sur ce probl�me

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Pour commencer, je ne suis pas certain d'o� vient myLength. Mais normalement, tu ne devrais pas avoir � t'en servir, le CryptoStream est cens� savoir o� s'arr�ter m�me si les donn�es crypt�es sont plus grandes que les donn�es originales.

    Aussi, srDecrypt ne te sert � rien ici.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2016
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Consultant informatique

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Par d�faut
    Merci M�dinoc pour te pencher sur mon probl�me.

    Tu as tout � fait raison concernant le
    srDecrypt
    qui est l'h�ritage d'une pr�c�dente tentative que d'ailleurs je n'utilise plus.
    Pour ce qui est de la longueur des donn�es lues, m�me quand je ne la pr�cise pas
    MemoryStream^ msResult = gcnew MemoryStream();
    l'erreur reste malgr� tout la m�me.

    J'ai l'impression qu'il plante sur le dernier block � d�crypter.

    Pr�c�demment j'avais utilis� un boucle While pour voir exactement o� apparaissait le probl�me de "longueur de donn�es".
    Le document d'origine est un xml finissant par
    <\document>
    , et le document �tait bien d�crypt� � 98% et l'erreur apparait toujours (quelque que soit la taille du document xml) � la fin au niveau du "o". (disons que je vois que les derniers caract�res d�crypt�s avant l'erreur sont
    <\D
    (le D de Document).

    Je ne sais pas si cela peut aider..

  4. #4
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    J'ai lu en diagonale (le C++/CLI m'int�resse peu), et je me pose la question... En C++/CLI, tu as (j'ai r�duit pour montrer mon argument) :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    array<Byte>^ encodedBytes = utf8->GetBytes(myPassword);
    array<Byte>^ Key = encodedBytes;
    array<Byte>^ IV = encodedBytes;
    ICryptoTransform^ decryptor = aesAlg->CreateDecryptor(aesAlg->Key, aesAlg->IV);
    En VB.NET :
    Code VB : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    aesAlg.Key = System.Text.UTF8Encoding.UTF8.GetBytes(MyPassword)
    aesAlg.IV = System.Text.UTF8Encoding.UTF8.GetBytes(MyPassword)
     
    Dim encryptor As ICryptoTransform = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV)

    Donc, dans un cas, tu as un seul array que tu manipules par deux r�f�rences diff�rentes, alors que dans l'autre cas, tu as deux tableaux diff�rents que tu manipules chacun par sa r�f�rence.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2016
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Consultant informatique

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Par d�faut
    Oui tu as raison JolyLoic, j'aurais pu r�duire le volume du code C++ en utilisant une syntaxe identique au VB.
    Pour autant, en fin de compte, ma cl� et mon vecteur sont identiques.
    Et d'ailleurs, pour la moiti� de mes champs binaires � d�crypter (les fichiers non XML), cela marche correctement.

Discussions similaires

  1. [Socket][File] Envoyer un tableau de byte
    Par itsmii dans le forum Entr�e/Sortie
    R�ponses: 14
    Dernier message: 30/01/2014, 09h10
  2. R�ponses: 1
    Dernier message: 09/05/2005, 14h19
  3. probleme d allocation avec un tableau de BYTE
    Par e1lauren dans le forum C++
    R�ponses: 5
    Dernier message: 06/05/2005, 13h42
  4. [VB.NET] Tableau de bytes Lecture/Ecriture
    Par BenoitM dans le forum Windows Forms
    R�ponses: 3
    Dernier message: 05/04/2005, 09h51
  5. [C#] Convertir un tableau de byte en Image
    Par goulhasch dans le forum ASP.NET
    R�ponses: 4
    Dernier message: 24/01/2005, 10h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo