DSS Version 3 Private Key BLOBs

Wenn ein DSSprivate-Schlüssel von Version 3 exportiert wird, befindet es sich in einem 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, muss beim Verwenden dieses BLOB mit CryptImportKey keine Kennzeichnung angegeben werden.

In der folgenden Tabelle werden die einzelnen Komponenten des Schlüssel-BLOB beschrieben.

Feld BESCHREIBUNG
Blobheader Eine BLOBHEADER-Struktur . Das bType-Element muss einen Wert von 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" ist.
P Der P-Wert befindet sich direkt nach der DSSPRIVKEY_VER3 Struktur und sollte immer die Länge des DSSPRIVKEY_VER3 BitlenP-Felds (Bitlänge P) sein, die durch acht (klein-endisches Format) unterteilt ist.
Q Der Q-Wert befindet sich direkt hinter dem P-Wert und sollte immer die Länge des DSSPRIVKEY_VER3 BitlenQ-Felds sein, das durch acht (klein-endisches Format) unterteilt ist.
G Der G-Wert befindet sich direkt hinter dem Q-Wert und sollte immer die Länge des DSSPRIVKEY_VER3 BitlenP-Felds (Bitlänge von P) sein, die durch acht geteilt wird. 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 Nullwert) gepolstert werden, um die Daten zur gewünschten Länge (klein-endisches Format) zu machen.
J Der J-Wert befindet sich direkt hinter dem G-Wert und sollte immer die Länge des DSSPRIVKEY_VER3 BitlenJ-Felds sein, das durch acht (klein-endisches Format) unterteilt ist. Wenn der BitlenJ-Wert 0 ist, fehlt der Wert vom 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) sein, dividiert durch acht. Wenn die Länge der Daten, die aus der Berechnung von (G^X)-Mod P resultieren, ein oder mehrere Bytes kürzer als P ist, dividiert durch 8, müssen die Daten mit den erforderlichen Bytes (nullwert) gepolstert werden, um die gewünschte Länge (little-endian format ) zu gestalten.
X Der X-Wert ist eine zufällig große ganze Zahl, sodass der öffentliche Teil des DH-Schlüsselpaars, Y, gleich: 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 einen gültigen Handle für einen Sitzungsschlüssel enthält. Alles, aber der BLOBHEADER-Teil des BLOB ist verschlüsselt. Beachten Sie, dass die Verschlüsselungsalgorithmus- und 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 die Abfangen und Verwendung durch nicht autorisierte Entitäten sind.