BLOB chiave privata DSS versione 3

Quando viene esportata una chiaveDSSPrivate versione 3, è in formato seguente:

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

Questo formato BLOB viene esportato quando viene usato il flag di CRYPT_BLOB_VER3 con CryptExportKey. Poiché la versione è nel BLOB, non è necessario specificare un flag quando si usa questo BLOB con CryptImportKey.

La tabella seguente descrive ogni componente del BLOB della chiave.

Campo Descrizione
Blobheader Struttura BLOBHEADER . Il membro bType deve avere un valore PUBLICKEYBLOB.
Dssprivkeyver3 Struttura DSSPRIVKEY_VER3 . Il membro magic deve essere impostato su "DSS4" (0x34535344) per le chiavi private. Si noti che il valore esadecimale è solo una codifica ASCII di "DSS4".
P Il valore P si trova direttamente dopo la struttura DSSPRIVKEY_VER3 e deve sempre essere la lunghezza, in byte, del campo bitlenPDSSPRIVKEY_VER3 (lunghezza bit di P) diviso da otto (formato little-endian).
Q Il valore Q si trova direttamente dopo il valore P e deve sempre essere la lunghezza, in byte, del campo bitlenQ DSSPRIVKEY_VER3 diviso per otto (formato little-endian ).
G Il valore G si trova direttamente dopo il valore Q e deve sempre essere la lunghezza, in byte, del campo bitlenP DSSPRIVKEY_VER3 (lunghezza bit di P) diviso per otto. Se la lunghezza dei dati è uno o più byte più brevi rispetto a P divisi per 8, i dati devono essere riempiti con i byte necessari (di valore zero) per rendere i dati la lunghezza desiderata (formato little-endian ).
J Il valore J si trova direttamente dopo il valore G e deve sempre essere la lunghezza, in byte, del campo bitlenJ DSSPRIVKEY_VER3 diviso per otto (formato little-endian ). Se il valore bitlenJ è 0, il valore è assente dal BLOB.
S Il valore Y, (G^X) mod P, si trova direttamente dopo il valore J e deve sempre essere la lunghezza, in byte, del campo bitlenP DSSPRIVKEY_VER3 ( lunghezza bit di P) diviso da otto. Se la lunghezza dei dati risultanti dal calcolo del mod P (G^X) è una o più byte più brevi di P diviso per 8, i dati devono essere inseriti in spaziatura con i byte necessari (di valore zero) per rendere i dati la lunghezza desiderata (formato little-endian ).
X Il valore X è un intero di grandi dimensioni casuale, in modo che la parte pubblica della coppia di chiavi DH, Y, sia uguale a: Y = (G^X) mod P

 

Quando si chiama CryptExportKey, lo sviluppatore può scegliere se crittografare la chiave. La chiave viene crittografata se il parametro hExpKey contiene un handle valido per una chiave di sessione. Tutto, ma la parte BLOBHEADER del BLOB viene crittografata. Si noti che i parametri dell'algoritmo di crittografia e della chiave di crittografia non vengono archiviati insieme al BLOB della chiave privata. L'applicazione deve gestire e archiviare queste informazioni. Se zero viene passato per hExpKey, la chiave privata verrà esportata senza crittografia.

Importante

È pericoloso esportare chiavi private senza crittografia perché sono quindi vulnerabili all'intercettazione e all'uso da parte di entità non autorizzate.