Share via


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_VER3bitlenP フィールドの長さ (P のビット長) を 8 (リトル エンディアン 形式) で割ったバイト単位にする必要があります。
Q Q 値は P 値の直後にあり、DHPRIVKEY_VER3 bitlenQ フィールドの長さ (バイト単位) を 8 (リトル エンディアン形式) で割った値にする必要があります。 bitlenQ 値が 0 の場合、値は BLOB に存在しません。
G G 値は Q 値の直後にあり、常に 、DHPRIVKEY_VER3bitlenP フィールド (P のビット長) のバイト単位の長さを 8 で割った値にする必要があります。 データの長さが P を 8 で割ったバイトより 1 バイト短い場合、データを目的の長さ (リトル エンディアン 形式) にするために必要なバイト (ゼロ値) を埋め込む必要があります。
J J 値は G 値の直後にあり、 常に、DHPRIVKEY_VER3bitlenJ フィールドの長さ (バイト単位) を 8 (リトル エンディアン 形式) で割った値にする必要があります。 bitlenJ 値が 0 の場合、値は BLOB に存在しません。
Y Y 値 (G^X) mod P は J 値の直後にあり、常に 、DHPRIVKEY_VER3bitlenP フィールドの長さ (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

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