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 内にあるため、この BLOB を CryptImportKey で使用するときにフラグを指定する必要はありません。

次の表では、キー BLOB の各コンポーネントについて説明しています。

フィールド 説明
blobheader BLOBHEADER 構造体。
dhprivkeyver3 DHPRIVKEY_VER3 構造体。 マジック メンバーは、秘密キーの 0x34484400 に設定されている必要があります。 16 進数の値は、単に "DH4" の ASCII エンコードであることに注意してください。
P P 値は、DHPRIVKEY_VER3 構造体の直後にあり、常に、DHPRIVKEY_VER3 bitlenP フィールドの長さ (P のビット長) を 8 (リトルエンディアン形式) で割ってバイト単位で表す必要があります。
Q Q 値は P 値の直後にあり、常に DHPRIVKEY_VER3 bitlenQ フィールドの長さを 8 (リトルエンディアン形式) で割ってバイト単位で表す必要があります。 bitlenQ 値が 0 の場合、値は BLOB に存在しません。
G G 値は Q 値の直後にあり、常に、DHPRIVKEY_VER3 bitlenP フィールドの長さ (P のビット長) を 8 で割ってバイト単位で表す必要があります。 データの長さが P を 8 で割ったバイトより 1 バイト以上短い場合、データを目的の長さ (リトルエンディアン形式) にするには、データに必要なバイト (ゼロ値) を埋め込む必要があります。
J J 値は G 値の直後にあり、常に DHPRIVKEY_VER3 bitlenJ フィールドの長さを 8 (リトルエンディアン形式) で割ってバイト単位で表す必要があります。 bitlenJ 値が 0 の場合、値は BLOB に存在しません。
Y 値 (G^X) mod P は J 値の直後にあり、常に、DHPRIVKEY_VER3 bitlenP フィールドの長さ (P のビット長) を 8 で割ってバイト単位で表す必要があります。 (G^X) mod P の計算結果のデータの長さが、P を 8 で割ったバイトより 1 バイト以上短い場合、データを目的の長さ (リトルエンディアン形式) にするには、データに必要なバイト (ゼロ値) を埋め込む必要があります。
x X 値は、DH キー ペア Y の公開部分が Y = (G^X) mod P に等しいランダムな大きな整数です。

 

CryptExportKeyを呼び出すとき、開発者はキーを暗号化するかどうかを選択できます。 hExpKey パラメーターにセッション キーへの有効なハンドルが含まれている場合、キーは暗号化されます。 BLOB の BLOBHEADER 部分以外はすべて暗号化されます。 暗号化アルゴリズムと暗号化キーパラメーターは、秘密キー BLOB と共に格納されないことに注意してください。 アプリケーションは、この情報を管理して格納する必要があります。 hExpKey に 0 が渡された場合、秘密キーは暗号化なしでエクスポートされます。

Note

秘密キーは、承認されていないエンティティによる傍受と使用に対して脆弱となるため、暗号化なしでエクスポートするのは危険です。