Udostępnij przez


Diffie-Hellman wersja 3 kluczy prywatnych BLOBs

Po wyeksportowaniu Diffie-Hellman w wersji 3 klucza prywatnego obiektu BLOB jest on w formacie w następujący sposób:

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

Ten formatobiektów blobjest eksportowany, gdy flaga CRYPT_BLOB_VER3 jest używana z CryptExportKey. Ponieważ wersja znajduje się w obiekcie BLOB, nie ma potrzeby określania flagi w przypadku używania tego obiektu blOB z CryptImportKey.

W poniższej tabeli opisano każdy składnik klucza obiektu blOB .

Pole Opis
Blobheader StrukturaBLOBHEADER.
dhprivkeyver3 Struktura DHPRIVKEY_VER3. Element członkowski magic powinien być ustawiony na 0x34484400 dla kluczy prywatnych. Zwróć uwagę, że wartość szesnastkowa to tylko kodowanie ASCII "DH4".
P Wartość P znajduje się bezpośrednio po strukturze DHPRIVKEY_VER3 i zawsze powinna być długością w bajtach pola DHPRIVKEY_VER3bitlenP (długość bitów P) podzielona przez osiem (format mało endian).
Q Wartość Q znajduje się bezpośrednio po wartości P i zawsze powinna być długością w bajtach DHPRIVKEY_VER3bitlenQ pola podzielonego przez osiem (format little-endian). Jeśli wartość bitlenQ wynosi 0, wartość jest nieobecna w obiekcie BLOB.
G Wartość G znajduje się bezpośrednio po wartości Q i zawsze powinna być długością w bajtach DHPRIVKEY_VER3bitlenP pole (długość bitów P) podzielone przez osiem. Jeśli długość danych jest jedną lub więcej bajtów krótsza niż P podzielona przez 8, dane muszą być wypełnione przy użyciu niezbędnych bajtów (z wartością zerową), aby dane o żądanej długości (formacie mało endian).
J Wartość J znajduje się bezpośrednio po wartości G i zawsze powinna być długością w bajtach DHPRIVKEY_VER3bitlenJ pola podzielonego przez osiem (format little-endian). Jeśli wartość bitlenJ wynosi 0, wartość jest nieobecna w obiekcie BLOB.
Y Wartość Y (G^X) mod P znajduje się bezpośrednio po wartości J i zawsze powinna być długością w bajtach DHPRIVKEY_VER3bitlenP pola (długość bitów P) podzielona przez osiem. Jeśli długość danych wynikających z obliczenia (G^X) mod P jest jedną lub więcej bajtów krótszych niż P podzielona przez 8, dane muszą być wypełnione przy użyciu niezbędnych bajtów (zero wartości), aby dane o żądanej długości (mało endian format).
X Wartość X jest losową dużą liczbą całkowitą, tak aby publiczna część pary kluczy DH, Y, jest równa: Y = (G^X) mod P

 

Podczas wywoływania CryptExportKeydeweloper może wybrać, czy chcesz zaszyfrować klucz. Klucz jest szyfrowany, jeśli parametr hExpKey zawiera prawidłowy uchwyt klucza sesji. Wszystkie elementy, ale BLOBHEADER część obiektu BLOB jest szyfrowana. Należy pamiętać, że algorytm szyfrowania i parametry klucza szyfrowania nie są przechowywane wraz z klucz prywatny BLOB. Aplikacja musi zarządzać tymi informacjami i przechowywać je. Jeśli wartość zero zostanie przekazana dla hExpKey, klucz prywatny zostanie wyeksportowany bez szyfrowania.

Nuta

Eksportowanie kluczy prywatnych bez szyfrowania jest niebezpieczne, ponieważ są one następnie narażone na przechwytywanie i używanie przez nieautoryzowane jednostki.