BLOBs für private Schlüssel von DSS Version 3

Wenn ein privaterDSS-Schlüssel der Version 3 exportiert wird, hat er ein Format wie folgt:

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 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 . Das bType-Element muss den Wert PUBLICKEYBLOB aufweisen.
Dssprivkeyver3 Eine DSSPRIVKEY_VER3-Struktur . Das Magic-Element 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 (in Bytes) 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 (in Bytes) des DSSPRIVKEY_VER3 BitlenQ-Felds geteilt durch acht (Little-Endian-Format ) aufweisen.
G Der G-Wert befindet sich direkt hinter dem Q-Wert und sollte immer die Länge (in Bytes) des DSSPRIVKEY_VER3 BitlenP-Felds (Bitlänge von P) geteilt durch acht sein. Wenn die Länge der Daten ein oder mehrere Byte kürzer als P dividiert durch 8 ist, müssen die Daten mit den erforderlichen Bytes (Nullwert) 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 Bytes) des DSSPRIVKEY_VER3 BitlenJ-Felds dividiert 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 Bytes) des DSSPRIVKEY_VER3 BitlenP-Felds (Bitlänge von P) geteilt 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 (null Wert) 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 BLOB ist verschlüsselt. Beachten Sie, dass der Verschlüsselungsalgorithmus und die Verschlüsselungsschlüsselparameter nicht zusammen mit dem BLOB des privaten Schlüssels 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 Abfangen und Verwendung durch nicht autorisierte Entitäten sind.