BLOB della chiave privata DSS versione 3
Quando viene esportata una chiave privata DSS versione 3, è in un formato come indicato di seguito:
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 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 . 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 essere sempre la lunghezza, in byte, del campo bitlenP DSSPRIVKEY_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 DSSPRIVKEY_VER3 diviso per otto (formato little-endian). |
G | Il valore G si trova direttamente dopo il valore Q e deve essere sempre la lunghezza, in byte, del campo DSSPRIVKEY_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 DSSPRIVKEY_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 bitlenP DSSPRIVKEY_VER3 (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.
Importante
È pericoloso esportare chiavi private senza crittografia perché sono quindi vulnerabili all'intercettazione e all'uso da parte di entità non autorizzate.