2008-09-16 6 views
0

Il y a un article MSDN here, mais je ne reçois pas très loin:J'ai P & G-- comment puis-je utiliser l'API Wincrypt pour générer une paire de clés Diffie-Hellman?

p = 139; 
g = 5; 

CRYPT_DATA_BLOB pblob; 
pblob.cbData = sizeof(ULONG); 
pblob.pbData = (LPBYTE) &p; 

CRYPT_DATA_BLOB gblob; 
gblob.cbData = sizeof(ULONG); 
gblob.pbData = (LPBYTE) &g; 

HCRYPTKEY hKey; 
if (::CryptGenKey(m_hCryptoProvider, CALG_DH_SF, 
        CRYPT_PREGEN, &hKey)) 
{ 
    ::CryptSetKeyParam(hKey, KP_P, (LPBYTE) &pblob, 0); 

ne réussit pas ici avec NTE_BAD_DATA. J'utilise MS_DEF_DSS_DH_PROV. Ce qui donne?

Répondre

2

Il se peut que cela n'aime pas les touches très courtes que vous utilisez.

J'ai trouvé the desktop version of that article ce qui peut aider, car il a un exemple complet.

EDIT:

L'OP réalisé à partir de l'exemple que vous avez à dire CryptGenKey combien de temps les touches sont, que vous faites en réglant les 16 bits des drapeaux au nombre de bits que vous souhaitez utiliser . Si vous laissez cette valeur à 0, vous obtenez la longueur de clé par défaut. Ce est documenté dans la section Remarques de la documentation de l'appareil, et avec le paramètre dwFlags dans le desktop documentation. Pour l'algorithme d'échange de clés Diffie-Hellman, le fournisseur de base utilise par défaut des clés de 512 bits et le fournisseur amélioré (par défaut) utilise par défaut des clés de 1024 bits, sous Windows XP et versions ultérieures. Il ne semble pas y avoir de documentation pour les longueurs par défaut sur CE.

Le code doit donc être:

BYTE p[64] = { 139 }; // little-endian, all other bytes set to 0 
BYTE g[64] = { 5 }; 

CRYPT_DATA_BLOB pblob; 
pblob.cbData = sizeof(p); 
pblob.pbData = p; 

CRYPT_DATA_BLOB gblob; 
gblob.cbData = sizeof(g); 
gblob.pbData = g; 

HCRYPTKEY hKey; 
if (::CryptGenKey(m_hCryptoProvider, CALG_DH_SF, 
        (512 << 16) | CRYPT_PREGEN, &hKey)) 
{ 
    ::CryptSetKeyParam(hKey, KP_P, (LPBYTE) &pblob, 0); 
+0

Merci, Mike-- J'ai trouvé (de votre référence) que c'était * deux * choses. Vous devez indiquer à CryptGenKey la longueur de la clé en plaçant la longueur en bits, décalée de 16 vers la gauche, dans le paramètre flags (non documenté, bien sûr, vous devez lire l'exemple). * Aussi *, la longueur de la clé doit être d'au moins 512 bits. –

1

Il me semble que KP_P, KP_G, KP_Q sont pour les clés DSS (Digital Signature Standard?). Pour Diffie-Hellman, il semble que vous êtes censé utiliser KP_PUB_PARAMS et passer un DATA_BLOB qui pointe vers une structure DHPUBKEY_VER3.

Notez que l'article que vous pointez provient du SDK Windows Mobile/Windows CE. Ce ne serait pas la première fois que CE fonctionnerait différemment du bureau/serveur.

EDIT: CE n'implémente pas KP_PUB_PARAMS. Pour utiliser cette structure sur le bureau, voir Diffie-Hellman Version 3 Public Key BLOBs.

+0

Merci, mais la structure DHPUBKEY_VER3 ne semble pas pour permettre de spécifier P & G (juste leur bit Longueurs). Aussi, j'aurais dû mentionner, je * suis * sur Windows Mobile, pas de bureau. Je me demande si je pourrais juste trouver un port d'OpenSSL? ;) –

Questions connexes