У меня есть P & G-- как мне использовать Wincrypt API для генерации пары ключей Диффи-Хеллмана? - PullRequest
0 голосов
/ 17 сентября 2008

Есть статья MSDN здесь , но я не очень далеко:

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

Сбой здесь с NTE_BAD_DATA. Я использую MS_DEF_DSS_DH_PROV. Что дает?

Ответы [ 2 ]

2 голосов
/ 17 сентября 2008

Возможно, ему просто не нравятся очень короткие клавиши, которые вы используете.

Я нашел настольную версию этой статьи , которая может помочь, поскольку в ней есть полный пример.

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 );
1 голос
/ 17 сентября 2008

Мне кажется, что KP_P, KP_G, KP_Q предназначены для ключей DSS (Стандарт цифровой подписи?). Для Диффи-Хеллмана похоже, что вы должны использовать KP_PUB_PARAMS и передавать DATA_BLOB, который указывает на DHPUBKEY_VER3 структуру.

Обратите внимание, что статья, на которую вы указываете, взята из Windows Mobile / Windows CE SDK. Уже не в первый раз CE будет работать иначе, чем десктоп / сервер.

EDIT: CE не реализует KP_PUB_PARAMS. Чтобы использовать эту структуру на рабочем столе, см. BLOB-файлы с открытым ключом Diffie-Hellman версии 3 .

...