BLOB di chiave privata Diffie-Hellman versione 3

Quando viene esportato un BLOB di chiave privata Diffie-Hellman versione 3, è in un formato come segue:

BLOBHEADER        blobheader;
DHPRIVKEY_VER3   dhprivkeyver3;
BYTE p[dhprivkeyver3.bitlenP/8]; 
            // Where P is the prime modulus
BYTE q[dhprivkeyver3.bitlenQ/8]; 
            // Where Q is a large factor of P-1
BYTE g[dhprivkeyver3.bitlenP/8]; 
            // Where G is the generator parameter
BYTE j[dhprivkeyver3.bitlenJ/8]; 
            // Where J is (P-1)/Q
BYTE y[dhprivkeyver3.bitlenP/8]; 
            // Where Y is (G^X) mod P
BYTE x[dhprivkeyver3.bitlenX/8]; 
            // Where X is the private exponent

Questo formato BLOB viene esportato quando il flag CRYPT_BLOB_VER3 viene usato 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 .
dhprivkeyver3 Struttura DHPRIVKEY_VER3 . Il membro magic deve essere impostato su 0x34484400 per le chiavi private. Si noti che il valore esadecimale è solo una codifica ASCII di "DH4".
P Il valore P si trova direttamente dopo la struttura DHPRIVKEY_VER3 e deve essere sempre la lunghezza in byte del campo bitlenP DHPRIVKEY_VER3 (lunghezza bit di P) diviso per otto (formato little-endian).
T Il valore Q si trova direttamente dopo il valore P e deve essere sempre la lunghezza in byte del campo bitlenQ DHPRIVKEY_VER3 diviso per otto (formato little-endian). Se il valore bitlenQ è 0, il valore è assente dal BLOB.
G Il valore G si trova direttamente dopo il valore Q e deve essere sempre la lunghezza in byte del campo DHPRIVKEY_VER3 bitlenP (lunghezza bit di P) diviso per otto. Se la lunghezza dei dati è uno o più byte più brevi di P diviso 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 essere sempre la lunghezza in byte del campo bitlenJ DHPRIVKEY_VER3 diviso per otto (formato little-endian). Se il valore bitlenJ è 0, il valore è assente dal BLOB.
Y Il valore Y, (G^X) mod P, si trova direttamente dopo il valore J e deve essere sempre la lunghezza in byte del campo DHPRIVKEY_VER3 bitlenP (lunghezza bit di P) diviso per otto. Se la lunghezza dei dati risultanti dal calcolo del mod P (G^X) è uno o più byte più brevi di P diviso per 8, i dati devono essere riempiti con i byte necessari (di valore zero) per rendere i dati la lunghezza desiderata (formato little-endian).
X Il valore X è un numero intero casuale di grandi dimensioni 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 è 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.

Nota

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