BLOBS Diffie-Hellman versione 3 private key

Quando viene esportato un BLOB di chiavi private Diffie-Hellman versione 3, è in formato seguente:

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 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 .
dhprivkeyver3 Struttura DHPRIVKEY_VER3 . Il membro magic deve essere impostato su 0x34484400 per 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 bitlenPDHPRIVKEY_VER3 (lunghezza bit di P) diviso da otto (formato bit-endian).
Q Il valore Q si trova direttamente dopo il valore P e deve sempre essere la lunghezza in byte del campo bitlenQDHPRIVKEY_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 sempre essere la lunghezza in byte del campo bitlenPDHPRIVKEY_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 bitlenJDHPRIVKEY_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 DHPRIVKEY_VER3 del campo bitlenP (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 riempiti 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.

Nota

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