Diffie-Hellman Version 3 private Key-BLOBs

Wenn ein blob mit Diffie-Hellman Version 3 des privaten Schlüssels exportiert wird, hat es ein Format wie folgt:

BLOBHEADER        blobheader;
DHPRIVKEY_VER3   dhprivkeyver3;
BYTE p[dhprivkeyver3.bitlenP/8]; 
            // Where P is the prime modulus
BYTE q[dhprivkeyver3.bitlenQ/8]; 
            // Where Q is a large factor of P-1
BYTE g[dhprivkeyver3.bitlenP/8]; 
            // Where G is the generator parameter
BYTE j[dhprivkeyver3.bitlenJ/8]; 
            // Where J is (P-1)/Q
BYTE y[dhprivkeyver3.bitlenP/8]; 
            // Where Y is (G^X) mod P
BYTE x[dhprivkeyver3.bitlenX/8]; 
            // Where X is the private exponent

Dieses BLOB-Format wird exportiert, wenn das CRYPT_BLOB_VER3-Flag mit CryptExportKey verwendet wird. Da sich die Version im BLOB befindet, ist es nicht erforderlich, ein Flag anzugeben, wenn Dieses BLOB mit CryptImportKey verwendet wird.

In der folgenden Tabelle werden die einzelnen Komponenten des Schlüsselblobs beschrieben.

Feld BESCHREIBUNG
blobheader Eine BLOBHEADER-Struktur .
dhprivkeyver3 Eine DHPRIVKEY_VER3-Struktur . Das Magic-Element sollte für private Schlüssel auf 0x34484400 festgelegt werden. Beachten Sie, dass der Hexadezimalwert nur eine ASCII-Codierung von "DH4" ist.
P Der P-Wert befindet sich direkt nach der DHPRIVKEY_VER3-Struktur und sollte immer die Länge in Byte des DHPRIVKEY_VER3bitlenP-Felds (Bitlänge von P) geteilt durch acht (Little-Endian-Format ) aufweisen.
Q Der Q-Wert befindet sich direkt hinter dem P-Wert und sollte immer die Länge in Byte des DHPRIVKEY_VER3bitlenQ-Felds geteilt durch acht (Little-Endian-Format ) aufweisen. Wenn der bitlenQ-Wert 0 ist, ist der Wert im BLOB nicht vorhanden.
G Der G-Wert befindet sich direkt hinter dem Q-Wert und sollte immer die Länge in Byte des DHPRIVKEY_VER3bitlenP-Felds (Bitlänge P) geteilt durch acht sein. Wenn die Länge der Daten ein oder mehrere Bytes kürzer als P dividiert durch 8 ist, müssen die Daten mit den erforderlichen Bytes (des Nullwerts) aufgefüllt werden, damit die Daten die gewünschte Länge (Little-Endian-Format ) aufweisen.
J Der J-Wert befindet sich direkt hinter dem G-Wert und sollte immer die Länge in Byte des DHPRIVKEY_VER3bitlenJ-Felds geteilt durch acht (Little-Endian-Format ) aufweisen. Wenn der bitlenJ-Wert 0 ist, ist der Wert im BLOB nicht vorhanden.
J Der Y-Wert (G^X) mod P befindet sich direkt hinter dem J-Wert und sollte immer die Länge in Byte des DHPRIVKEY_VER3bitlenP-Felds (Bitlänge von P) dividiert durch acht sein. Wenn die Länge der Daten, die sich aus der Berechnung von (G^X) mod P ergeben, ein oder mehrere Bytes kürzer als P dividiert durch 8 ist, müssen die Daten mit den erforderlichen Bytes (des Nullwerts) aufgefüllt werden, damit die Daten die gewünschte Länge (Little-Endian-Format ) aufweisen.
X Der X-Wert ist eine zufällige große ganze Zahl, sodass der öffentliche Teil des DH-Schlüsselpaars Y gleich ist: Y = (G^X) mod P

 

Beim Aufrufen von CryptExportKey kann der Entwickler auswählen, ob der Schlüssel verschlüsselt werden soll. Der Schlüssel wird verschlüsselt, wenn der hExpKey-Parameter ein gültiges Handle für einen Sitzungsschlüssel enthält. Alles außer dem BLOBHEADER-Teil des BLOBs ist verschlüsselt. Beachten Sie, dass der Verschlüsselungsalgorithmus und die Verschlüsselungsschlüsselparameter nicht zusammen mit dem BLOB für private Schlüssel gespeichert werden. Die Anwendung muss diese Informationen verwalten und speichern. Wenn null für hExpKey übergeben wird, wird der private Schlüssel ohne Verschlüsselung exportiert.

Hinweis

Es ist gefährlich, private Schlüssel ohne Verschlüsselung zu exportieren, da sie dann anfällig für Abfangen und Verwendung durch nicht autorisierte Entitäten sind.