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