Возможно, ему просто не нравятся очень короткие клавиши, которые вы используете.
Я нашел настольную версию этой статьи , которая может помочь, поскольку в ней есть полный пример.
EDIT:
ОП понял из примера, что вы должны сообщить CryptGenKey, как долго ключи, что вы делаете, устанавливая верхние 16-битовые флаги в количество бит, которое вы хотите использовать. Если вы оставите это как 0, вы получите длину ключа по умолчанию. Этот задокументирован в разделе Замечания документации устройства и с параметром dwFlags в документации рабочего стола .
Для алгоритма обмена ключами Диффи-Хеллмана базовый поставщик по умолчанию использует 512-битные ключи, а расширенный поставщик (по умолчанию) - 1024-битные ключи в Windows XP и более поздних версиях. Кажется, нет никакой документации для длины по умолчанию на CE.
Код должен быть:
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 );