У меня есть P & G — как мне использовать Wincrypt API для генерации пары ключей Диффи-Хеллмана?
-
09-06-2019 - |
Вопрос
Там есть статья в 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.