2008-09-16 11 views
0

Es gibt einen MSDN-Artikel here, aber ich bin nicht sehr weit bekommen:Ich habe P & G - wie verwende ich die Wincrypt-API, um ein Diffie-Hellman-Schlüsselpaar zu generieren?

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 gibt?

Antwort

2

Es mag sein, dass es die sehr kurzen Tasten, die Sie verwenden, einfach nicht mag.

Ich fand the desktop version of that article, die helfen können, da es ein vollständiges Beispiel hat.

EDIT:

Die OP aus dem Beispiel realisiert, dass Sie CryptGenKey, wie lange die Tasten, die Sie tun, indem Sie die Top-Einstellung 16-Bits der Fahnen auf die Anzahl von Bits, die Sie verwenden möchten, zu sagen haben . Wenn Sie dies als 0 belassen, erhalten Sie die Standardschlüssellänge. Diese ist dokumentiert in der Bemerkungen Abschnitt der Gerätedokumentation, und mit dem dwFlags Parameter in der desktop documentation.

Für den Diffie-Hellman-Schlüsselaustauschalgorithmus verwendet der Basisanbieter standardmäßig 512-Bit-Schlüssel und der Enhanced-Anbieter (Standardeinstellung) 1024-Bit-Schlüssel, unter Windows XP und höher. Es scheint keine Dokumentation für die Standardlängen auf CE zu geben.

sollte der Code 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); 
+0

Danke, Mike-- Ich fand (aus deiner Quelle), dass es * zwei * Dinge waren. Sie müssen CryptGenKey die Schlüssellänge mitteilen, indem Sie die Länge in Bits, die um 16 nach links verschoben sind, in den flags -Parameter (oderokumentiert, natürlich müssen Sie das Sample lesen). * Auch *, die Schlüssellänge muss mindestens 512 Bit sein. –

1

Es sieht für mich KP_P, KP_G, KP_Q sind für DSS-Schlüssel (Digital Signature Standard?). Für Diffie-Hellman sieht es so aus, als ob Sie KP_PUB_PARAMS verwenden und eine DATA_BLOB übergeben sollten, die auf eine DHPUBKEY_VER3 Struktur verweist.

Beachten Sie, dass der Artikel, auf den Sie verweisen, aus dem Windows Mobile/Windows CE SDK stammt. Es wäre nicht das erste Mal, dass CE anders als der Desktop/Server funktioniert.

EDIT: CE implementiert KP_PUB_PARAMS nicht. Informationen zum Verwenden dieser Struktur auf dem Desktop finden Sie unter Diffie-Hellman Version 3 Public Key BLOBs.

+0

Danke, aber die DHPUBKEY_VER3 Struktur scheint nicht ein zu spezifizieren P & G (nur ihr Teil längen) zu ermöglichen. Auch sollte ich erwähnt haben, ich * bin * auf Windows Mobile, nicht Desktop. Ich frage mich, ob ich nur einen OpenSSL-Port finden könnte? ;) –