Diffie-Hellman Version 3: Private SchlüsselBLOBs
Wenn ein BLOB mit Diffie-Hellman Version 3 des privaten Schlüssels exportiert wird, hat es folgendes Format:
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 CryptExportKeyverwendet wird. Da sich die Version im BLOB befindet, muss bei Verwendung dieses BLOB mit CryptImportKeykein Flag angegeben werden.
In der folgenden Tabelle werden die einzelnen Komponenten des Schlüssel-BLOBbeschrieben.
| Feld | BESCHREIBUNG |
|---|---|
| blobheader | Eine BLOBHEADER-Struktur. |
| dhprivkeyver3 | Eine DHPRIVKEY _ VER3-Struktur. Der Magic-Member sollte auf 0x34484400 für private Schlüssel 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 des DHPRIVKEY VER3-BitlenP-Felds _ (Bitlänge von P) geteilt durch acht (Little-Endian-Format) sein. |
| Q | Der Q-Wert befindet sich direkt hinter dem P-Wert und sollte immer die Länge des DHPRIVKEY VER3-BitlenQ-Felds _ dividiert durch acht (Little-Endian-Format) in Bytes sein. Wenn der bitlenQ-Wert 0 ist, fehlt der Wert im BLOB. |
| G | Der G-Wert befindet sich direkt hinter dem Q-Wert und sollte immer die Länge des DHPRIVKEY _ VER3-BitlenP-Felds (Bitlänge von P) dividiert durch acht sein. Wenn die Länge der Daten ein oder mehrere Bytes kürzer ist als P dividiert durch 8, müssen die Daten mit den erforderlichen Bytes (von 0 Wert) aufgefüllt werden, damit die Daten die gewünschte Länge haben (Little-Endian-Format). |
| J | Der J-Wert befindet sich direkt hinter dem G-Wert und sollte immer die Länge des DHPRIVKEY VER3-BitlenJ-Felds _ dividiert durch acht (Little-Endian-Format) in Bytes sein. Wenn der BitlenJ-Wert 0 ist, fehlt der Wert im BLOB. |
| J | Der Y-Wert (G^X) mod P befindet sich direkt hinter dem J-Wert und sollte immer die Länge des DHPRIVKEY _ VER3-BitlenP-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 (von 0 Wert) aufgefüllt werden, damit die Daten die gewünschte Länge (Little-Endian-Format) erhalten. |
| 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 CryptExportKeykann 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 BLOB wird verschlüsselt. Beachten Sie, dass der Verschlüsselungsalgorithmus und die Verschlüsselungsschlüsselparameter nicht zusammen mit dem BLOB des privaten Schlüsselsgespeichert werden. Die Anwendung muss diese Informationen verwalten und speichern. Wenn 0 (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 abfangende und nicht autorisierte Entitäten sind.