J'ai P & amp; G— comment utiliser l'API Wincrypt pour générer une paire de clés Diffie-Hellman?

StackOverflow https://stackoverflow.com/questions/76581

Question

Il existe un article MSDN ici , mais je ne le suis pas. aller très loin:

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 );

Échec ici avec NTE_BAD_DATA . J'utilise MS_DEF_DSS_DH_PROV . Qu'est-ce qui donne?

Était-ce utile?

La solution

Il se peut qu’il n’aime pas les touches très courtes que vous utilisez.

J'ai trouvé la version de cet article sur le bureau qui pourrait aider. , comme il en a un exemple complet.

EDIT:

L’opérateur a réalisé à partir de l’exemple que vous devez indiquer à CryptGenKey la longueur des clés. Pour ce faire, définissez les 16 bits supérieurs des indicateurs sur le 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 du périphérique, et avec le paramètre dwFlags dans le documentation sur le bureau .

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) 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 );

Autres conseils

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

Notez que l'article que vous pointez provient du Kit de développement logiciel (SDK) Windows Mobile / Windows CE. Ce ne serait pas la première fois que CE fonctionnerait différemment du poste de travail / serveur.

EDIT: CE n’implémente pas KP_PUB_PARAMS . Pour utiliser cette structure sur le bureau, voir version Diffie-Hellman 3 BLOB de clé publique .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top