Ich habe P & G, wie verwende ich die WinCrypt API ein Diffie-Hellman-Schlüsselpaar zu generieren?
-
09-06-2019 - |
Frage
Es gibt einen MSDN-Artikel hier , aber ich bin nicht immer sehr weit:
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 );
schlägt hier mit NTE_BAD_DATA
. Ich verwende MS_DEF_DSS_DH_PROV
. Was soll das?
Lösung
Es kann sein, dass es einfach nicht die sehr kurze Schlüssel mag Sie verwenden.
Ich fand der Desktop-Version dieses Artikels , die helfen können , da es ein vollständiges Beispiel.
EDIT:
Die OP aus dem Beispiel realisiert, die Sie haben CryptGenKey zu sagen, wie lange die Tasten, die Sie tun, indem Sie die Top-16-Bits der Fahnen auf die Anzahl der Bits Einstellung, die Sie verwenden möchten. Wenn Sie dies als 0 lassen, erhalten Sie die Standard-Schlüssellänge. Diese ist dokumentiert in den Bemerkungen der Gerätedokumentation, und mit dem dwFlags Parameter in der Desktop-Dokumentation .
Für den Diffie-Hellman-Schlüsselaustausch-Algorithmus, der Basis-Anbieter standardmäßig auf 512-Bit-Schlüssel und der Enhanced Provider (das ist die Standardeinstellung) standardmäßig auf 1024-Bit-Schlüssel, auf Windows XP und höher. Es scheint, keine Dokumentation für die Standardlängen auf CE zu sein.
Der Code sollte daher sein:
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 );
Andere Tipps
Es scheint mir, dass KP_P
, KP_G
, KP_Q
für DSS-Tasten (Digital Signature Standard?). Für Diffie-Hellman sieht es aus wie Sie sollen KP_PUB_PARAMS
verwenden und eine DATA_BLOB
übergeben, die auf eine DHPUBKEY_VER3
Struktur verweist.
Beachten Sie, dass der Artikel, den Sie zu zeigen sind aus dem Windows Mobile / Windows CE SDK ist. Es wäre nicht das erste Mal, dass CE unterschiedlich vom Desktop / Server gearbeitet.
EDIT: CE nicht KP_PUB_PARAMS
implementieren. Um diese Struktur auf dem Desktop zu verwenden, finden Sie unter Diffie-Hellman-Version 3 Public Key BLOBs .