Private Schlüssel-BLOBs DSS Version 3
Wenn ein privater DSS-Schlüssel (Version 3) exportiert wird, ist er in folgendem Format:
BLOBHEADER blobheader;
DSSPRIVKEY_VER3 dssprivkeyver3;
BYTE p[dssprivkeyver3.bitlenP/8];
// Where P is the prime modulus
BYTE q[dssprivkeyver3.bitlenQ/8];
// Where Q is a large factor of P-1
BYTE g[dssprivkeyver3.bitlenP/8];
// Where G is the generator parameter
BYTE j[dssprivkeyver3.bitlenJ/8];
// Where J is (P-1)/Q
BYTE y[dssprivkeyver3.bitlenP/8];
// Where Y is (G^X) mod P
BYTE x[dssprivkeyver3.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. Das bType-Mitglied muss den Wert PUBLICKEYBLOB aufweisen. |
Dssprivkeyver3 | Eine DSSPRIVKEY_VER3-Struktur. Das magische Mitglied sollte für private Schlüssel auf „DSS4“ (0x34535344) festgelegt werden. Beachten Sie, dass der Hexadezimalwert nur eine ASCII-Codierung von „DSS4“ darstellt. |
P | Der P-Wert befindet sich direkt hinter der DHPUBKEY_VER3-Struktur und sollte immer die Länge in Byte des DHPUBKEY_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 DHPUBKEY_VER3 bitlenQ-Felds dividiert durch acht (little-endian-Format) sein. |
G | Der G-Wert befindet sich direkt hinter dem Q-Wert und sollte immer die Länge in Byte des DHPUBKEY_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 DHPUBKEY_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 DHPUBKEY_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.
Wichtig
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.