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

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

Вопрос

Там есть статья в 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.Что это дает?

Это было полезно?

Решение

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

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

Редактировать:

Из примера OP понял, что вы должны сообщить CryptGenKey, какой длины ключи, что вы делаете, устанавливая верхние 16 бит флагов на количество бит, которое вы хотите использовать.Если вы оставите это значение равным 0, вы получите длину ключа по умолчанию.Это является задокументировано в Замечания раздел документации к устройству, а также с двФлаги параметр в документация для настольных компьютеров.

Для алгоритма обмена ключами Диффи-Хеллмана базовый поставщик по умолчанию использует 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 );

Другие советы

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

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

Редактировать:CE не реализует KP_PUB_PARAMS.Чтобы использовать эту структуру на рабочем столе, см. Двоичные объекты с открытым ключом Диффи-Хеллмана версии 3.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top