Ich habe P & G, wie verwende ich die WinCrypt API ein Diffie-Hellman-Schlüsselpaar zu generieren?

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

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?

War es hilfreich?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top