OVH Cloud OVH Cloud

Crypto API

6 réponses
Avatar
Nicolas IG
Bonjour,
Je souhaite signer (cad crypter avec la clef privée) un message sans le
hasher au préalable.
Je commence donc par récuperer le context du certificat à utiliser :

BYTE Message_a_signer[128];

HCERTSTORE hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL,
CERT_SYSTEM_STORE_CURRENT_USER, CERT_STORE_NAME);

PCCERT_CONTEXT CertSignerContext = CertFindCertificateInStore(hCertStore,
CRYPT_TYPE, 0, CERT_FIND_SUBJECT_STR, L"Nom Prenom", NULL);

Mais ensuite je ne sais quelle fonction utiliser (CryptDecrypt,
CryptSignMessage, CryptDecryptMessage, etc...) et avec quels paramètres afin
de crypter Message_a_signer avec l'algorithme RSA et la clef privée relative
au context CertSignerContext, sans retoucher à la chaine Message_a_signer au
préalable.
Si quelqu'un maitrise cette API et se sent le courage de m'en faire une
petite démonstration, je le remercie d'avance,
Cordialement,
Nicolas

6 réponses

Avatar
Remi Thomas
Nicolas IG wrote:
Bonjour,
Je souhaite signer (cad crypter avec la clef privée) un message sans
le hasher au préalable.
Je commence donc par récuperer le context du certificat à utiliser :

BYTE Message_a_signer[128];

HCERTSTORE hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL,
CERT_SYSTEM_STORE_CURRENT_USER, CERT_STORE_NAME);

PCCERT_CONTEXT CertSignerContext > CertFindCertificateInStore(hCertStore, CRYPT_TYPE, 0,
CERT_FIND_SUBJECT_STR, L"Nom Prenom", NULL);

Mais ensuite je ne sais quelle fonction utiliser (CryptDecrypt,
CryptSignMessage, CryptDecryptMessage, etc...) et avec quels
paramètres afin de crypter Message_a_signer avec l'algorithme RSA et
la clef privée relative au context CertSignerContext, sans retoucher
à la chaine Message_a_signer au préalable.
Si quelqu'un maitrise cette API et se sent le courage de m'en faire
une petite démonstration, je le remercie d'avance,
Cordialement,
Nicolas



C'est assez confus sur ce que tu désires faire.
Signer ou crypter ?
Dans le premier cas il faut la clé de hashage car signer sur un gros volume
prendrait trop de temps.
Pour crypter tu peux générer un buffer crypté en partant de ton buffer
initial.

Pour signer il faut faire comme cela:

// Obtenir un crypto provider qui sais faire du RSA
CryptAcquireContext(&m_hCryptProv, NULL, provider, PROV_RSA_FULL,
pin!=0?CRYPT_SILENT:0)
...
// Create the hash key context
if (CryptCreateHash(m_hCryptProv, CALG_MD5, 0, 0, &hHash))
{
// Hash the data
if (CryptHashData(hHash, (BYTE *)dataToSign->GetData(),
dataToSign->GetSize(), 0))
// Find the signature length
if (CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, 0, NULL, &dwSignLen))
// Allocate buffer
if (in->Init(dwSignLen))
// Get the signature
if (CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, 0, (BYTE *)in->GetData(),
&dwSignLen))
bResult = true;
CryptDestroyHash(hHash);
}

La signature est dans la structure 'in', à toi de la mémoriser au meilleur
endroit.

Rémi

--
Rémi Thomas - MVP Visual Studio .NET
Développeur Windows indépendant
http://www.xtware.com/cv
Avatar
Nicolas IG
Cela peut en effet paraitre confu, mais le fait est que mon message est déjà
hashé et formaté d'une certaine manière, il ne me reste plus qu'à le
chiffrer avec la clef privée relative au certificat "Nom Prenom" (par
exemple).
Tout ce que j'ai pu voir jusqu'à présent ne me permettait pas de chiffrer
une chaine de caractères sans la hasher avant. Peut-serait-il possible de
faire un hash qui ne ferait rien, qui ne modifirait pas la chaine, alors je
pourrai utiliser votre méthode.
Merci pour votre aide,
Nicolas





"Remi Thomas" a écrit dans le message de
news:40a237a0$0$20747$
Nicolas IG wrote:
> Bonjour,
> Je souhaite signer (cad crypter avec la clef privée) un message sans
> le hasher au préalable.
> Je commence donc par récuperer le context du certificat à utiliser :
>
> BYTE Message_a_signer[128];
>
> HCERTSTORE hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL,
> CERT_SYSTEM_STORE_CURRENT_USER, CERT_STORE_NAME);
>
> PCCERT_CONTEXT CertSignerContext > > CertFindCertificateInStore(hCertStore, CRYPT_TYPE, 0,
> CERT_FIND_SUBJECT_STR, L"Nom Prenom", NULL);
>
> Mais ensuite je ne sais quelle fonction utiliser (CryptDecrypt,
> CryptSignMessage, CryptDecryptMessage, etc...) et avec quels
> paramètres afin de crypter Message_a_signer avec l'algorithme RSA et
> la clef privée relative au context CertSignerContext, sans retoucher
> à la chaine Message_a_signer au préalable.
> Si quelqu'un maitrise cette API et se sent le courage de m'en faire
> une petite démonstration, je le remercie d'avance,
> Cordialement,
> Nicolas

C'est assez confus sur ce que tu désires faire.
Signer ou crypter ?
Dans le premier cas il faut la clé de hashage car signer sur un gros


volume
prendrait trop de temps.
Pour crypter tu peux générer un buffer crypté en partant de ton buffer
initial.

Pour signer il faut faire comme cela:

// Obtenir un crypto provider qui sais faire du RSA
CryptAcquireContext(&m_hCryptProv, NULL, provider, PROV_RSA_FULL,
pin!=0?CRYPT_SILENT:0)
...
// Create the hash key context
if (CryptCreateHash(m_hCryptProv, CALG_MD5, 0, 0, &hHash))
{
// Hash the data
if (CryptHashData(hHash, (BYTE *)dataToSign->GetData(),
dataToSign->GetSize(), 0))
// Find the signature length
if (CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, 0, NULL, &dwSignLen))
// Allocate buffer
if (in->Init(dwSignLen))
// Get the signature
if (CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, 0, (BYTE *)in->GetData(),
&dwSignLen))
bResult = true;
CryptDestroyHash(hHash);
}

La signature est dans la structure 'in', à toi de la mémoriser au meilleur
endroit.

Rémi

--
Rémi Thomas - MVP Visual Studio .NET
Développeur Windows indépendant
http://www.xtware.com/cv





Avatar
Remi Thomas
Nicolas IG wrote:
Cela peut en effet paraitre confu, mais le fait est que mon message
est déjà hashé et formaté d'une certaine manière, il ne me reste plus
qu'à le chiffrer avec la clef privée relative au certificat "Nom
Prenom" (par exemple).
Tout ce que j'ai pu voir jusqu'à présent ne me permettait pas de
chiffrer une chaine de caractères sans la hasher avant.
Peut-serait-il possible de faire un hash qui ne ferait rien, qui ne
modifirait pas la chaine, alors je pourrai utiliser votre méthode.
Merci pour votre aide,
Nicolas





Un hash ne modifie pas le buffer.
C'est un chiffre qui représente une signature (au sens unicité) d'un
contenu.
Pour la determiner cryptoapi ne fait que lire le buffer.
Tu peux aussi signer ton hash si tu l'as déjà.

Rémi

--
Rémi Thomas - MVP Visual Studio .NET
Développeur Windows indépendant
http://www.xtware.com/cv
Avatar
Nicolas IG
> Tu peux aussi signer ton hash si tu l'as déjà.



C'est exactement ce que je veux faire, mais comment? Mon hash est en effet
sous la forme d'un tableau de BYTE et je ne vois vraiment pas comment
crypter ce tableau avec la clef privée de mon certificat.
Cordialement,
Nicolas
Avatar
Arnaud Debaene
Nicolas IG wrote:
Tu peux aussi signer ton hash si tu l'as déjà.




Signer un hash, ca veut dire faire le hash du hash, puis encrypter le
résultat, on est bien d'accord?

C'est exactement ce que je veux faire, mais comment?


CryptEncrypt.

Qu'est ce que tu veux faire exactement?
- crypter l'intégralité de ton message?
- signer ton message (aka, lui rajouter la version encryptée de son hash à
la fin)?
- autre chose?

Arnaud
Avatar
Nicolas IG
>>> Qu'est ce que tu veux faire exactement?







Je souhaiterai crypter l'intégralité de mon message avec la clef privée de
mon certificat. Je n'ai pas besoin du hash chiffré.
La fonction CryptEncrypt( ) ne permet-elle pas seulement de crypter avec la
clef publique?


- signer ton message (aka, lui rajouter la version encryptée de son hash






à
la fin)?







Si je peux récupérer le message (non hashé) chiffré, alors cela me convient
parfaitement.


- autre chose?







Quel fonction faut-il utiliser pour récupérer la clef privée afin de crypter
avec?

Merci,
Nicolas