DSS Version 3 Private Key BLOBs
Wenn ein privater DSS-Schlüssel der Version 3 exportiert wird, weist er das folgende Format auf:
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 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. Der bType-Member muss über den Wert PUBLICKEYBLOB verfügen. |
| Dssprivkeyver3 | Eine DSSPRIVKEY _ VER3-Struktur. Der magic-Member sollte für private Schlüssel auf "DSS4" (0x34535344) festgelegt werden. Beachten Sie, dass der Hexadezimalwert nur eine ASCII-Codierung von "DSS4" ist. |
| P | Der P-Wert befindet sich direkt hinter der DSSPRIVKEY _ VER3-Struktur und sollte immer die Länge des DSSPRIVKEY _ 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 des _ BitlenQ-Felds DSSPRIVKEY VER3 dividiert durch acht (Little-Endian-Format) in Bytes sein. |
| G | Der G-Wert befindet sich direkt hinter dem Q-Wert und sollte immer die Länge des BitlenP-Felds DSSPRIVKEY _ VER3 (Bitlänge P) dividiert durch acht in Bytes 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 _ BitlenJ-Felds DSSPRIVKEY VER3 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 DSSPRIVKEY _ VER3-BitlenP-Felds (Bitlänge von P) geteilt durch acht in Bytes 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.
Wichtig
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.