Faire marcher CryptAcquireContext

Résolu
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 - 23 août 2004 à 03:07
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 - 23 août 2004 à 13:30
Bonsoir à tous !

J'essaie actuellement d'utiliser les fonctions de cryptographie de Windows (ce qui m'intéresse est le calcul de hash MD5 ou SHA, pour stocker des mots de passe). Partant de l'exemple de la doc, j'essaie d'obtenir un handle vers le CSP par défaut de Windows (celui de Microsoft, vous l'aviez deviné ?) ainsi :
  HCRYPTPROV Provider = 0;
  assert(CryptAcquireContext(&Provider, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0) != 0);


La macro assert n'est là que pour s'assurer du résultat, qui est d'ailleurs mauvais puisque mon programme se termine ainsi :
D:\C\md5>md5 a
assertion failed on line 37 in file main.c
Le jeu de clés n'existe pas.


Alors que le code original de l'aide est le suivant :
// Get handle to the Microsoft RSA Base Provider and the 
// "Foo" key container.
if(!CryptAcquireContext(&hProv, TEXT("Foo"), MS_DEF_PROV, 
                        PROV_RSA_FULL, 0)) {
    printf("Error %x during CryptAcquireContext!\n", GetLastError());
    return;
}


Alors je m'interroge. Qu'ai-je de faux ? Y'a t'il une manipulation exotique à faire ? Je précise que j'ai essayé aussi avec un texte à la place de NULL, mais la même erreur survient... Quid ?

2 réponses

cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
23 août 2004 à 13:30
J'ai réussi ! Pour ceux que cela intéresse :
  assert(CryptAcquireContext(&Provider, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) != 0);


La constante indique qu'on utilise uniquement les fonctions de hash/vérification de clés, et qu'on en crée pas.
3
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
23 août 2004 à 03:31
Après une recherche plus poussée, il faut apparemment définir le fournisseur désiré dans HKEY_CURRENT_USER, ainsi :
  assert(CryptSetProvider(MS_DEF_PROV, PROV_RSA_SIG) != 0);


Ce code fonctionne très bien (vérifié avec regedit), et PROV_RSA_SIG permet de n'avoir que les hash MD5/SHA, ce qui me convient. Mais à l'exécution du programme, ce code :
  HCRYPTPROV Provider = 0;
  assert(CryptAcquireContext(&Provider, NULL, MS_DEF_PROV, PROV_RSA_SIG, 0) != 0);


finit en :
D:\C\md5>md5 a
assertion failed on line 40 in file main.c
Le type de fournisseur ne correspond pas à la valeur inscrite.


Quid ?

Je précise que je suis sous Windows XP, et que ces fonctions sont documentées comme existant depuis Windows 95 OSR2 et NT 4.0 !
0
Rejoignez-nous