2017-07-20 7 views
0

J'essaie de générer une signature numérique en utilisant "Microsoft RSA SChannel Cryptographic Provider". Après avoir acquis le handle du conteneur, je génère une signature en utilisant CryptGenKey(). Mais cette fonction renvoie FALSE.CryptoAPI RSA Schannel Erreur du fournisseur

Le dwError pour CryptGenKey() retourne 80090008.

Les mêmes œuvres pour tout autre type de fournisseur. En outre, lorsque j'essaie de créer une paire d'échange de clés pour le même fournisseur, cela fonctionne bien. Qu'est-ce que je fais mal?

#include <Windows.h> 
#include <wincrypt.h> 

int main() 
{ 
    HCRYPTPROV phProv = 0; 
    LPTSTR pszContainer = NULL; 
    DWORD dwFlags = 0; 
    bool flag; 
    DWORD_PTR dwError; 
    HCRYPTKEY phKey; 

    flag = CryptAcquireContext(&phProv, pszContainer, 
     MS_DEF_RSA_SCHANNEL_PROV, PROV_RSA_SCHANNEL, dwFlags); 
    if (!flag) 
    { 
     flag = CryptAcquireContext(&phProv, pszContainer, 
      MS_DEF_RSA_SCHANNEL_PROV, PROV_RSA_SCHANNEL, CRYPT_NEWKEYSET); 
    } 
    dwError = GetLastError(); 

    flag = CryptGenKey(phProv, AT_SIGNATURE, CRYPT_EXPORTABLE, &phKey); 
    dwError = GetLastError(); 

    flag = CryptGetUserKey(phProv, AT_SIGNATURE, &phKey); 
    dwError = GetLastError(); 

    return 0; 
} 

Merci.

Répondre

1

Le fournisseur SChannel ne prend pas en charge les clés RSA AT_SIGNATURE, seulement AT_EXCHANGE. Il s'agit principalement d'un transfert depuis le début TLS (quand il était encore SSL) lorsque les clés ont été échangées en utilisant le cryptage RSA au lieu d'être accepté avec l'accord de clé Diffie-Hellman signé avec la signature RSA ... et tout le monde sait Le fournisseur SChannel se comporte, pourquoi le changer? ". (Le plus proche que je vois que d'être écrits est https://msdn.microsoft.com/en-us/library/windows/desktop/aa387690(v=vs.85).aspx, qui montre CALG_RSA_KEYX et ne parle pas CALG_RSA_SIGN.)

Dans CAPI une clé AT_EXCHANGE peut faire le chiffrement et la signature, et une clé AT_SIGNATURE ne peut le faire signer.

En général, l'équipe de cryptographie de Windows décourage le nouveau code écrit avec CAPI (je n'ai pas de preuve écrite autre que ce que je viens d'écrire, principalement parce qu'elle était en réunion avec eux). CNG a une API beaucoup plus conviviale pour les développeurs, et est plus puissante. Le GNC est réintégré dans Windows Vista et est donc disponible dans toutes les versions de Windows prises en charge. CAPI ne sert plus à "bien, il a plus de couverture", c'est juste "l'ancienne, crufty, legacy API" (sauf si vous écrivez du code pour des systèmes d'exploitation hors support, comme XP).

Si vous utilisez CAPI, je ne sais pas pourquoi vous souhaitez utiliser le fournisseur SChannel. PROV_RSA_AES via MS_ENH_RSA_AES_PROV est le RSA le plus fonctionnel de CAPI (signatures PKCS basées sur SHA-2). Mais il est obsolète par rapport au fournisseur de logiciel en CNG (signature PSS, OAEP avec SHA-2, et supporte des valeurs d'exposant public supérieures à 2^32 (d'accord, ce n'est pas un besoin commun, mais c'est quelque chose CNG corrigé)).