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

MFC Discussion :

api CryptCreateHash pour md5


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut api CryptCreateHash pour md5
    Re-

    voila, je me bats pour essayer simplement de hasher un CString en MD5,

    j'ai trouvé plein de chose sur le net mais jvois vraiment pas comment les utiliser !

    j'en suis à essayer de comprendre ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
     
    	CryptImportKey(hProv, pbKeyBlob, dwKeyBlobLen, 0, 0, &hKey);
     
    	CryptCreateHash( hProv, CALG_MD5,0,0,&hHash );
    ou mettre le cstring que je veux hascher, ce que represente la clé de CryptImportKey ....

    si vous pouviez m'eclairer ....

    merci beaucoup

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut
    j'en suis à peu pres la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	HCRYPTPROV hProv   = 0;
    	HCRYPTKEY hKey     = 0;
    	HCRYPTHASH hHash   = 0;
     
    	CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
     
    	CryptCreateHash( hProv, CALG_MD5,0,0,&hHash );
     
    	CryptHashData(hHash, (PBYTE)csLng.GetString(), csLng.GetLength(), 0);
    csLng etant ma CString queje veux hasher

  3. #3
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    J'avais exploré un petit peu la CryptoApi il y a un certain temps. Voilà ce que j'avais pondu:
    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
    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
    #include <iostream>
    #include <sstream>
    #include <numeric>
    #include <vector>
    #include <cassert>
    #include <iomanip>
    using namespace std;
     
    //#define _WIN32_WINNT 0x0500
    #include <windows.h>
     
    #include <wincrypt.h>
     
     
    std::vector<BYTE> Hash( HCRYPTPROV hProv, const std::vector<BYTE> & Data )
    {
        BOOL bResult;
        HCRYPTHASH hHash;
     
        bResult = CryptCreateHash(
                    hProv,
                    CALG_MD5,
                    0,
                    0,
                    &hHash);
     
        bResult = CryptHashData(
                    hHash,
                    &Data[ 0 ],
                    static_cast<DWORD>( Data.size() ),
                    0);
     
        DWORD dwValue;
        DWORD dwBufferSize = sizeof(DWORD);    
        bResult = CryptGetHashParam(
                    hHash,
                    HP_HASHSIZE,
                    reinterpret_cast<BYTE*>( &dwValue ),
                    &dwBufferSize,
                    0);
        assert( dwBufferSize == sizeof(DWORD) );
     
        std::vector<BYTE> result( dwValue );
     
        bResult = CryptGetHashParam(
                    hHash,
                    HP_HASHVAL,
                    &result[ 0 ],
                    &dwValue,
                    0);
        if ( !bResult )
        {
            cerr << "Echec CryptGetHashParam\n";
        }
     
        CryptDestroyHash(hHash);
     
        return result;
    }
     
    int main()
    {
        BOOL bResult;
        HCRYPTPROV hProv;
     
        bResult = CryptAcquireContext(
            &hProv,
            NULL,
            MS_DEF_PROV,
            PROV_RSA_FULL,
            0 );
        if ( !bResult )
        {
            if ( GetLastError() == NTE_BAD_KEYSET )
            {
                bResult = CryptAcquireContext(
                    &hProv,   
                    NULL,     
                    MS_DEF_PROV,
                    PROV_RSA_FULL,
                    CRYPT_NEWKEYSET );
            }
            if ( !bResult )
            {
                cerr << "Erreur CryptAcquireContext : " << hex << GetLastError() << "\n";
                return 1;
            }
        }
     
        std::vector<BYTE> data;
        data.push_back( 'A' );
        data.push_back( 'B' );
        data.push_back( 'C' );
        data.push_back( 'D' );
        data.push_back( 'E' );
        data.push_back( 'F' );
     
        std::vector<BYTE> hash = Hash( hProv, data );
     
        cout << std::hex << std::uppercase; 
        cout << std::setfill('0'); 
     
        for ( size_t i = 0; i < hash.size(); ++i )
        { 
            if (i != 0) 
                cout << ' '; 
     
            cout << std::setw(2) << static_cast<int>( hash[ i ] ); 
        } 
        cout << '\n';
     
        CryptReleaseContext( hProv, 0 );
    }
    Ca ne manipuler pas une CString mais un tableau de BYTE. Le code n'a pas été vraiment testé, y'a peut être des erreurs / imperfections. Mais d'après mes souvenirs ça marchait.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut
    oula !

    tout ca pour hasher une chaine ?

    j'étais loin de me douter ! (et de comprendre !! )

    merci, jvais analyser tout ca !

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut
    jviens de tomber sur ca aussi

    merci

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par firejocker
    oula !

    tout ca pour hasher une chaine ?

    j'étais loin de me douter ! (et de comprendre !! )

    merci, jvais analyser tout ca !
    ben la cryptographie c'est un des domaines les plus pointus en programmation. Ecrire une lib sécurisée, c'est très très très difficile.
    Le lien que tu donnes, le mec a créé sa propre classe (+ 500 lignes), donc le code n'est à priori pas lié à l'OS. Pour du MD5 ça peut faire l'affaire. Mais personnelement je chercherai une lib open source réputée fiable.

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut
    ok, merci

Discussions similaires

  1. [Info] Quelle API graphique pour une "carte habitée"
    Par loz dans le forum SIG : Système d'information Géographique
    Réponses: 16
    Dernier message: 07/11/2008, 00h15
  2. Api java pour fichier OFX ( microsoft money )
    Par elitost dans le forum Documents
    Réponses: 3
    Dernier message: 20/12/2005, 16h27
  3. [Windows]Api win32 pour java
    Par cpanette dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 27/06/2005, 15h06
  4. Conseils sur une API simple pour Windows
    Par alejandro dans le forum Choisir un environnement de développement
    Réponses: 4
    Dernier message: 28/04/2005, 18h12
  5. Est ce que ça existe une api java pour code barre ?
    Par miloud dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 14/04/2005, 17h20

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