다음을 통해 공유


Diffie-Hellman 버전 3 프라이빗 키 BLOB

Diffie-Hellman 버전 3 프라이빗 키 BLOB을 내보낼 때 다음과 같은 형식입니다.

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

BLOB 형식은 CRYPT_BLOB_VER3 플래그가 CryptExportKey와 함께 사용될 때 내보내집니다. 버전은 BLOB에 있으므로 CryptImportKey와 함께 이 BLOB을 사용할 때 플래그를 지정할 필요가 없습니다.

다음 표에서는 키 BLOB의 각 구성 요소에 대해 설명합니다.

필드 설명
Blobheader BLOBHEADER 구조체입니다.
dhprivkeyver3 DHPRIVKEY_VER3 구조체입니다. 매직 멤버는 프라이빗 키에 대한 0x34484400 설정해야 합니다. 16진수 값은 "DH4"의 ASCII 인코딩일 뿐입니다.
P P 값은 DHPRIVKEY_VER3 구조체 바로 뒤의 위치에 있으며 항상 DHPRIVKEY_VER3 bitlenP 필드의 길이(P의 비트 길이)를 8(little-endian 형식)으로 나누어야 합니다.
Q Q 값은 P 값 바로 앞에 있으며 항상 DHPRIVKEY_VER3 bitlenQ 필드의 길이(바이트)를 8(little-endian 형식)으로 나누어야 합니다. bitlenQ 값이 0이면 BLOB에서 값이 없습니다.
G G 값은 Q 값 바로 앞에 위치하며 항상 DHPRIVKEY_VER3 bitlenP 필드의 길이(P의 비트 길이)를 8로 나누어야 합니다. 데이터 길이가 P보다 1바이트 이상 짧으면 데이터를 원하는 길이(little-endian 형식)로 만드는 데 필요한 바이트(값 0)로 채워야 합니다.
J J 값은 G 값 바로 뒤이며 항상 DHPRIVKEY_VER3 bitlenJ 필드의 길이(바이트)를 8(little-endian 형식)으로 나누어야 합니다. bitlenJ 값이 0이면 BLOB에서 값이 없습니다.
Y Y 값(G^X) mod P는 J 값 바로 다음에 위치하며 항상 DHPRIVKEY_VER3 bitlenP 필드의 길이(P의 비트 길이)를 8로 나누어야 합니다. (G^X) mod P의 계산 결과 데이터의 길이가 P보다 1바이트 더 짧은 경우 데이터를 원하는 길이(little-endian 형식)로 만드는 데 필요한 바이트(0 값)로 채워야 합니다.
X X 값은 DH 키 쌍의 공개 부분인 Y가 Y = (G^X) 모드 P와 같도록 임의 큰 정수입니다.

 

CryptExportKey를 호출할 때 개발자는 키를 암호화할지 여부를 선택할 수 있습니다. hExpKey 매개 변수에 세션 키에 대한 유효한 핸들이 포함된 경우 키가 암호화됩니다. BLOB의 BLOBHEADER 부분을 제외한 모든 항목이 암호화됩니다. 암호화 알고리즘 및 암호화 키 매개 변수는 프라이빗 키 BLOB과 함께 저장되지 않습니다. 애플리케이션은 이 정보를 관리하고 저장해야 합니다. hExpKey에 대해 0이 전달되면 프라이빗 키가 암호화 없이 내보내집니다.

참고 항목

암호화 없이 프라이빗 키를 내보내는 것은 무단 엔터티의 가로채기 및 사용에 취약하기 때문에 위험합니다.