Private Schlüssel-BLOBs Diffie-Hellman Version 3
Wenn ein privates Schlüssel-BLOB des Typs Diffie-Hellman Version 3 exportiert wird, befindet es sich in folgendem 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 die CRYPT_BLOB_VER3-Flag zusammen mit CryptExportKey verwendet wird. Da sich die Version im BLOB befindet, muss bei Verwendung dieses BLOBs mit CryptImportKey keine Flag angegeben werden.
Die folgende Tabelle beschreibt die Komponenten des Schlüssel-BLOBs.
Feld | Beschreibung |
---|---|
Blobheader | Eine BLOBHEADER-Struktur. |
dhprivkeyver3 | Eine DHPRIVKEY_VER3-Struktur. Das magische Mitglied 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 hinter der DHPRIVKEY_VER3-Struktur und sollte immer die Länge in Byte des DHPRIVKEY_VER3 bitlenP-Felds (Bitlänge von P) dividiert durch acht (little-endian-Format) sein. |
Q | Der Q-Wert befindet sich direkt hinter dem P-Wert und sollte immer die Länge in Byte des DHPRIVKEY_VER3 bitlenQ-Felds dividiert durch acht (little-endian-Format) 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 in Byte des DHPRIVKEY_VER3 bitlenP-Felds (Bitlänge von P) dividiert durch acht sein. Wenn die Länge der Daten mindestens ein Byte kürzer als P dividiert durch 8 ist, müssen die Daten mit den erforderlichen Bytes (Nullwerte) 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_VER3 bitlenJ-Felds dividiert durch acht (little-endian-Format) sein. Wenn der BitlenJ-Wert 0 ist, fehlt der Wert im BLOB. |
Y | Der Y-Wert (G^X) mod P, befindet sich direkt hinter dem J-Wert und sollte immer die Länge in Byte des DHPRIVKEY_VER3 bitlenP-Felds (Bitlänge von P) dividiert durch acht sein. Wenn die Länge der Daten, die aus der Berechnung (G^X) mod P resultieren, ein oder mehrere Bytes kürzer als P dividiert durch 8 ist, müssen die Daten mit den erforderlichen Bytes (Nullwerte) 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: Y = (G^X) mod P ist |
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 der BLOBHEADER-Abschnitt des BLOBs wird verschlüsselt. Beachten Sie, dass der Verschlüsselungsalgorithmus und die Verschlüsselungsschlüsselparameter nicht zusammen mit dem privaten Schlüssel-BLOB 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 sind abgefangen und von nicht autorisierten Entitäten verwendet zu werden.