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++/CLI Discussion :

sha512 Run-Time Check Failure #2 - Stack around the variable 'mdString' was corrupted.


Sujet :

C++/CLI

  1. #1
    Membre tr�s actif
    Avatar de lionceau
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par d�faut sha512 Run-Time Check Failure #2 - Stack around the variable 'mdString' was corrupted.
    Nom : capt.jpg
Affichages : 799
Taille : 47,6 Ko
    Bonjour j'ai un fichier que je veux hash , il compile et fonctionne , j'ai bien un hash mais il se termine avec une erreur compr�hensible , avez vous svp une id�e ?

    l'erreur :
    Run-Time Check Failure #2 - Stack around the variable 'mdString' was corrupted.

    le .h
    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
    #ifndef HASHFILE_H
    #define HASHFILE_H
     
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    #include <openssl/sha.h>
    #include <iostream>
    #include <fstream>
    #include <sstream>
     
    #ifndef SIZE_STRING
    #define SIZE_STRING 20
    #endif
     
    namespace ToolLib {\
    
    /////////////////////////////////////////////////////////////////////////////////////////
    //! Manages a HashFile.
    /////////////////////////////////////////////////////////////////////////////////////////
    class HashFile
    {
    public:
       HashFile();
     	HashFile(std::string nameFile, std::string nameHash);
       virtual ~HashFile();
     
       char* generateHash(char* path);
       char* generateHash(std::ifstream myFile);
       char* generateHash();
    //   bool checkHash(std::ifstream myFile, char* myHash);
       bool checkHash(std::string myFile, std::string myHash);
     
       // Getter & Setter
       void setm_File(std::string file);
       std::string getm_File();
       void setm_FileHash(std::string fileHash);
       std::string getm_FileHash();
     
    private:
    	std::string m_File  ;      // name of the file to do the integrity 
    	std::string m_FileHash  ;  // name of the file who contain the hash of m_file
    }; 
    }
    #endif




    la fonction qui lance l erreur
    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
    47
    48
    49
    50
    51
    52
    53
    char* HashFile::generateHash() 
    {
     
       if( NULL != m_File.c_str() )
       {
          std::ofstream fileHash( m_FileHash.c_str(), ofstream::out|ofstream::trunc );
          std::ifstream file( m_File.c_str() );
          unsigned char digest[SHA512_DIGEST_LENGTH];
          char mdString[(SHA512_DIGEST_LENGTH * 2)+1 ];
          std::stringstream buffer; // variable qui contient tout le fichier
     
    		if( file.is_open() && fileHash.is_open() )
    		{			
    			buffer << file.rdbuf();
    			SHA512_CTX ctx;
    			SHA512_Init( &ctx );
    			SHA512_Update( &ctx, buffer.str().c_str(), strlen(buffer.str().c_str()) );
    			SHA512_Final(digest, &ctx);
     
    			for(int i = 0; i < SHA512_DIGEST_LENGTH; i++)
    			{
                sprintf_s(&mdString[i*2],sizeof(&mdString[i*2]), "%02x", (unsigned int)digest[i]);
    			}
            // mdString="ed f  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaaaaaaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
     
    			fileHash << mdString;
    			printf_s("---SHA512 digest de \"%s\" : %s\n", m_File.c_str(), mdString);
    		}
     
          if( file.is_open() )
    		{
    			file.close();
    		}
     
    		if( fileHash.is_open() )
    		{
    			fileHash.close();
    		}
     
    		//system("pause"); //[test]
    		//effacement du contenu des variables
    		//strcpy_s( mdString, sizeof(mdString), "" );
    		buffer.clear();
     
          printf_s("-SHA512 digest de \"%s\" : %s\n", m_File.c_str(), mdString);
          return mdString;
    	}
    	else
    	{
    		printf_s( "\n\n Merci de mettre comme argument un fichier\n\n" );
          return 0;
    	}
    }


    le main
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    #include <openssl/sha.h>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include "HashFile.h"
     
    using namespace std;
     
     
    int main(int argc, char * argv[])
    {
     
       ToolLib::HashFile * ClassHashFile = new ToolLib::HashFile("test6.txt", "sha512test.txt");
       ClassHashFile->setm_File("test6.txt");
       ClassHashFile->setm_FileHash("sha512test.txt");
       printf_s("Le SHA512 digest de \"%s\" : %s\n", ClassHashFile->getm_File(), ClassHashFile->generateHash());
       delete ClassHashFile;
     
     
       return 0;
    }

    Merci pour vos conseils et aides.


    l

  2. #2
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Bonjour,

    Avant d'avoir un plantage � l'ex�cution, le compilateur t'a certainement indiqu� des "warnings" � la compilation. Il faut les lire et les corriger.
    L'erreur � l'ex�cution t'indique qu'� un moment tu as �cris dans une zone o� tu n'aurais d�. Une �criture dans un buffer a d� d�border.
    En C++, on �vite les pointeurs "nus" car ils sont sources de probl�mes de corruption m�moire, c'est ce qui se passe ici.

  3. #3
    Membre tr�s actif
    Avatar de lionceau
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par d�faut
    Bonjour , Merci pour ta r�ponse , qu'est ce que tu entends par les pointeurs nuls ?
    Tu veux dire que je fasse ceci pour initialiser mdString ?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    char mdString = malloc([(SHA512_DIGEST_LENGTH * 2)+1 ]*sizeof(char ));

  4. #4
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Citation Envoy� par lionceau Voir le message
    qu'est ce que tu entends par les pointeurs nuls ?
    Tu veux dire que je fasse ceci pour initialiser mdString ?
    char mdString = malloc([(SHA512_DIGEST_LENGTH * 2)+1 ]*sizeof(char ));
    malloc() c'est du C, il n'existe aucune raison de l'utiliser en C++.

    La fonction generateHash() retourne un char*; C'est l� le probl�me. Ce qu'elle retourne doit pointer quelque part. Ou bien ce quelque part existe avant la fonction et on le pointe, ou bien il doit �tre allou� dynamiquement par new[] (surtout pas avec malloc()). Et dans ce dernier cas se poserait le probl�me de qui est responsable de la lib�ration par delete[].
    Ton code retourne un pointeur sur mdString[], donc un quelque part d�truit � la sortie de la fonction, pas bon du tout. Seconde possibilit�, ton malloc(), un peu mieux. Troisi�me possibilit�, faire un new[], c'est du C++ mais il y a risque d'oubli de lib�rer. Quatri�me possibilit�, ne pas retourner un simple pointeur char*.
    La mdString, comme son nom l'indique, est une cha�ne de caract�res. Il faut que la fonction generateHash() retourne une std::string, et donc :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      std::string mdString(SHA512_DIGEST_LENGTH*2,' ');
      char* bufInStr = const_cast<char*>(mdString.data()); // on peut ecrire dans une string 
      for ( int i = 0 ; i < SHA512_DIGEST_LENGTH ; i++ ) {
          // mais le caractere \0 ne doit jamais etre mis dans une std::string
          // on ne peut donc pas utiliser la fonction C sprintf_s()
          bufInStr[i*2] = "0123456789abcdef"[15 & (digest[i]>>4)];
          bufInStr[i*2+1] = "0123456789abcdef"[15 & digest[i]];
      }
      return mdString;

  5. #5
    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
    Tu devrais peut-�tre utiliser &mdString[0] plut�t qu'un const_cast.
    (et en C++98, j'utiliserais plut�t un vecteur de char que je convertirais en string � la fin).
    Edit: En fait, dans le cas pr�sent je ne vois m�me pas pourquoi j'utiliserais un pointeur plut�t qu'acc�der directement aux caract�res via l'op�rateur crochet; normalement �a devrait �tre inlin� au point de se comporter comme le pointeur...

    PS: Ceci est du C++ normal, pas du C++/CLI.
    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.

  6. #6
    Membre tr�s actif
    Avatar de lionceau
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par d�faut
    Bonjour,

    dalfab > J'ai test� , ca fonctionne , merci .
    J'ai une question :
    A quoi correspond ?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    bufInStr[i*2] = "0123456789abcdef"[15 & (digest[i]>>4)];

  7. #7
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    J'y suis all� un peu fort dans l'opacit� sur cette ligne, si je l'�cris en plusieurs, cela devient
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    const char tabCaractHexa[] = "0123456789abcdef";
    int valeurAConvertir = digest[i];
    int premier = (valeurAConvertir >> 4) & 0xF; // partie 'haute' de l'octet
    int second  = valeurAConvertir & 0xF;        // partie basse -> unité en base 16
    bufInStr[i*2]   = tabCaractHexa[premier];    // conversion 0 à 15 en '0' à 'F'
    bufInStr[i*2+1] = tabCaractHexa[second];     // conversion 0 à 15 en '0' à 'F'
    Il doit y avoir plus simple

  8. #8
    Membre tr�s actif
    Avatar de lionceau
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par d�faut
    Bonjour Dalfab,

    Merci pour l'explication. La fonction fonctionne bien pour des fichiers de 1go mais pas avec les fichiers de 10go � 30go et plus, as tu une id�e de comment faire ceci ?
    c 'est le iftream qui deconne .

  9. #9
    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
    Si j'ai bien compris, c'est parce que ton code met tout le fichier dans une variable. Il faut faire la lecture et le hachage par blocs.
    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.

  10. #10
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    Merci pour l'explication. La fonction fonctionne bien pour des fichiers de 1go mais pas avec les fichiers de 10go � 30go et plus, as tu une id�e de comment faire ceci ?
    M�me en compilant en 64bit ?

  11. #11
    Membre tr�s actif
    Avatar de lionceau
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par d�faut
    Mais le soucis est que je peux pas lire le fichier morceau par morceau pour apr�s faire un hash d'une variable qui est enti�re .

  12. #12
    Membre tr�s actif
    Avatar de lionceau
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par d�faut
    Non il y avait pas de soucis , en fait j'ai essay� de faire un hash d'un dump de m�moire ou faire un hash de fichier cr�er � l'aide de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    fsutil.exe file createnew %UserProfile%\Desktop\70G 70000000000
    , mais ces fichiers sont corrompu. Donc impossible de hasher un fichier corrompu. Normal ..

    Donc tout fonctionne bien

    Merci � tous pour vos soutiens et conseils

    Sujet r�solu.


    Bonne soir�e ,

  13. #13
    Membre tr�s actif
    Avatar de lionceau
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par d�faut
    Le soucis est que cette fonction hash bien les fichiers .txt mais pas les archives .7z et .zip.

    Je pense fortement que le soucis provient de cette ligne pour ouvrir un fichier Zip :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    std::ifstream file( m_File.c_str() );
    Est ce que vous me conseillez d'utiliser une autre fonction\type que ifstream ?

    Le soucis est que je suis oblig� d'utiliser un ifstream car je travaille avec des petits et des gros fichiers (30 giga max) et le second soucis est que ifstream n'aime pas les zip et 7z

    Svp , quel type me conseillez vous pour charger un zip ou un fichier video de 30giga maximum ?

    Merci

  14. #14
    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
    Comme je te dis, fais ton hachage par blocs (je tends � utiliser des blocs de 1MO, personnellement).
    Si tu ne fais l'appel � SHA512_Final() qu'apr�s avoir trait� le dernier bloc (et que tu ne fais le Init() qu'avant de traiter le premier)...

    Edit: Sous Visual Studio, j'ai d�j� utilis� ce code par le pass�. Il peut calculer plusieurs hashes en m�me temps pour le m�me fichier, par blocs de 1Mo.
    Code C : 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    #ifndef _WIN32_WINNT		// Allow use of features specific to Windows XP or later.                   
    #define _WIN32_WINNT 0x0501	// Change this to the appropriate value to target other versions of Windows.
    #endif						
     
    #include <stdio.h>
    #include <tchar.h>
    #include <windows.h>
     
    #define BUFFER_SIZE (1<<20)
     
    ALG_ID hashIds[] = { CALG_MD5, CALG_SHA1/*, CALG_SHA_256*/ };
    char const * hashNames[] = { "MD5    ", "SHA-1  ", "SHA-256" };
     
     
    static BOOL DisplayHashValue(HCRYPTHASH hHash, LPCSTR name)
    {
    	BOOL ret = FALSE;
    	DWORD cb = 0;
    	DWORD len = sizeof cb;
    	BOOL bCb = CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&cb, &len, 0);
    	if(bCb)
    	{
    		BYTE * hashVal = malloc(cb);
    		len = cb;
    		if(hashVal)
    		{
    			BOOL bVal = CryptGetHashParam(hHash, HP_HASHVAL, hashVal, &len, 0);
    			if(bVal)
    			{
    				size_t i;
    				printf("%s : ", name);
    				for(i=0 ; i<len ; i++)
    				{
    					printf("%02x", hashVal[i]);
    				}
    				putchar('\n');
    				ret = TRUE;
    			}
     
    			free(hashVal);
    		}
    	}
    	return ret;
    }
     
    static BOOL HashOneFile(LPCTSTR fileName, HCRYPTPROV hProv, LPVOID buf, DWORD size)
    {
    	BOOL ret = FALSE;
    	HCRYPTHASH hHash[ARRAYSIZE(hashIds)] = {0};
    	BOOL bHashes = TRUE;
    	size_t iHash;
    	for(iHash=0 ; iHash < ARRAYSIZE(hashIds) && bHashes; iHash++)
    		bHashes = bHashes && CryptCreateHash(hProv, hashIds[iHash], 0, 0, &hHash[iHash]);
    	if(bHashes)
    	{
    		HANDLE hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    		if(hFile != INVALID_HANDLE_VALUE)
    		{
    			DWORD dwRead = 0;
    			BOOL bRead = FALSE;
    			bHashes = TRUE;
    			do
    			{
    				bRead = ReadFile(hFile, buf, size, &dwRead, NULL);
    				if(!bRead)
    					break;
    				for(iHash=0 ; iHash < ARRAYSIZE(hashIds) && bHashes; iHash++)
    					bHashes &= CryptHashData(hHash[iHash], buf, dwRead, 0);
     
    			} while(bRead && dwRead != 0 && bHashes);
    			if(bRead && bHashes)
    			{
    				ret = TRUE;
    				for(iHash=0 ; iHash < ARRAYSIZE(hashIds) ; iHash++)
    					ret &= DisplayHashValue(hHash[iHash], hashNames[iHash]);
    			}
     
    			CloseHandle(hFile);
    		}
     
    		for(iHash=0 ; iHash < ARRAYSIZE(hashIds) ; iHash++)
    			CryptDestroyHash(hHash[iHash]);
    	}
    	else
    	{
    		size_t nHashes = iHash;
    		for(iHash=0 ; iHash < nHashes ; iHash++)
    			CryptDestroyHash(hHash[iHash]);
    	}
    	return ret;
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int ret = EXIT_FAILURE;
    	HCRYPTPROV hProv = 0;
    	BOOL bProv = FALSE;
    	if(argc<2)
    	{
    		puts("Usage: HashFile <filename>");
    		return 1;
    	}
     
    	bProv = CryptAcquireContext(&hProv, NULL, NULL, PROV_DSS/*PROV_RSA_FULL*/, CRYPT_VERIFYCONTEXT);
    	if(!bProv)
    	{
    		fprintf(stderr, "CryptAcquireContext() failed with error %lu.\n", GetLastError());
    	}
    	else
    	{
    		LPVOID buf = VirtualAlloc(NULL, BUFFER_SIZE, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
    		if(buf==NULL)
    		{
    			fprintf(stderr, "VirtualAlloc() failed with error %lu.\n", GetLastError());
    		}
    		else
    		{
    			if(HashOneFile(argv[1], hProv, buf, BUFFER_SIZE))
    				ret = EXIT_SUCCESS;
    			else
    				fprintf(stderr, "HashOneFile() failed (last Win32 error: %lu).\n", GetLastError());
     
    			VirtualFree(buf, 0, MEM_RELEASE);
    		}
    		CryptReleaseContext(hProv, 0);
    	}
    	if(ret != EXIT_SUCCESS)
    		fprintf(stderr, "Failed.\n");
    	return ret;
    }
    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.

  15. #15
    Membre tr�s actif
    Avatar de lionceau
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par d�faut
    Merci pour ta r�ponse mais j'ai du mal � comprendre ce que tu veux dire. ( car je fais bien le SHA512_Init(); puis le SHA512_Final() ? En quoi la taille du bloc va changer quelque chose ?)

    Je pensais plus pouvoir r�gler le soucis en touchant � cette ligne std::ifstream file( m_NameFile.c_str() );Par exemple en la remplacant avec std::ifstream file( m_NameFile.c_str() ,std::ifstream::in|std::ifstream||binary); mais cela ne change rien.

    Merci pour tes conseils

    Ci dessous mon code :

    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
    47
    48
    49
    50
    bool bHashDone = false;
    	std::ofstream fileHash;
    	std::ifstream file;
     
       if( NULL != m_NameFile.c_str() )
       {
          try
          {
    		  SystemConfiguration::COutilsCommun::OpenOStream(fileHash,m_NameFileHash.c_str());
    		  SystemConfiguration::COutilsCommun::OpenIStream(file, m_NameFile.c_str());
     
    		  std::ofstream fileHash( m_NameFileHash.c_str(), std::ofstream::out|std::ofstream::trunc );
             std::ifstream file( m_NameFile.c_str() );
             // if std::ifstream file is huge ( I have one error then I must read the 
             if(!file)
             {
    			 std::cout << "impossible d'ourvrir le fichier : " << m_NameFile.c_str() <<std::endl;
    			 std::cout << "taille du fichier : " << file.tellg() <<std::endl;
             }      
    		 if(!fileHash)
    		 {
    			 std::cout << "impossible de creer le fichier : " << m_NameFileHash.c_str() <<std::endl;
    		 }   
     
             unsigned char digest[SHA512_DIGEST_LENGTH];
             std::string mdString(SHA512_DIGEST_LENGTH*2,' ');
             std::stringstream buffer; //// variable with the content of the file 
     
             if( (file)&& (fileHash) )
             {			
                buffer << file.rdbuf();
                SHA512_CTX ctx;
                SHA512_Init( &ctx );
                SHA512_Update( &ctx, buffer.str().c_str(), strlen(buffer.str().c_str()) );
                SHA512_Final(digest, &ctx);
     
                char* bufInStr = const_cast<char*>(mdString.data()); 
                for ( int i = 0 ; i < SHA512_DIGEST_LENGTH ; ++i ) {
                   // FYI : don't use sprintf_s() because  \0 can't be inside std::string
                   const char tabCaractHexa[] = "0123456789abcdef";
                   int valueToConvert = digest[i];
                   int first = (valueToConvert >> 4) & 0xF; 
                   int second  = valueToConvert & 0xF;      
                   bufInStr[i*2]   = tabCaractHexa[first];  
                   bufInStr[i*2+1] = tabCaractHexa[second];
                }
    			bHashDone = true;
                fileHash << mdString;
                std::cout <<"SHA512 digest of  " << m_NameFile.c_str() << " is "<< mdString <<  std::endl;
             }

  16. #16
    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
    Tu persistes � charger et traiter tout le contenu du fichier d'un seul coup.

    Et en plus, tu devrais mettre l'affichage du contenu du hash dans une fonction s�par�e, mais bon on n'est pas � �a pr�s.
    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.

  17. #17
    Membre tr�s actif
    Avatar de lionceau
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par d�faut
    Si j'ai bien compris , concr�tement il faudrait que je fasse ceci en plusieurs �tapes ?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    SHA512_Update( &ctx, buffer.str().c_str(), strlen(buffer.str().c_str()) );

  18. #18
    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
    �a et la lecture du fichier.
    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.

  19. #19
    Membre tr�s actif
    Avatar de lionceau
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    buffer << file.rdbuf();
     
    SHA512_Update( &ctx, buffer.str().c_str(), strlen(buffer.str().c_str()) );
    Donc je dois faire ces deux lignes en plusieurs �tapes , mais je ne comprend pas trois choses :
    1 Pourquoi est ce qu'il faut faire ceci en plusieurs �tapes ?
    2 En combien d'�tape je dois faire ceci ?
    3 Comment faire ceci ? Je trouve pas de source/exemple sur internet pour travailler avec un buffer morceau par morceau

  20. #20
    Membre tr�s actif
    Avatar de lionceau
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par d�faut
    Je me suis bas� sur ce lien pour ne plus faire le https://stackoverflow.com/questions/...-istringstream

    Ca compile et ca s�ex�cute bien mais le hash ne fonctionne pas, je n'ai pas l'impression d'etre dans la bonne direction .
    Je suis perdu pour reussir comment gerer un fichier en C

    Stp qu'est ce que je peux changer avec
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    SHA512_Update( &ctx, buffer.str().c_str(), strlen(buffer.str().c_str()) );
    ???

Discussions similaires

  1. Stack around the variable 'R12' was corrupted.
    Par Marty MacFly dans le forum D�buter
    R�ponses: 5
    Dernier message: 20/06/2011, 09h40
  2. Run-Time Check Failure : Stack corrupted
    Par melleb dans le forum C++
    R�ponses: 19
    Dernier message: 10/06/2009, 16h08
  3. R�ponses: 1
    Dernier message: 08/02/2009, 11h54
  4. Stack corrupted - Run-Time Check Failure
    Par poukill dans le forum C++
    R�ponses: 2
    Dernier message: 16/07/2008, 23h31
  5. Run-Time Check Failure #2
    Par -Mod- dans le forum DirectX
    R�ponses: 5
    Dernier message: 10/08/2006, 08h06

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