Diffie-Hellman バージョン 3 公開キー BLOB
Diffie-Hellman バージョン 3 公開キー BLOB (タイプ PUBLICKEYBLOB) は、DH 公開キーに関する情報をエクスポートおよびインポートするために使用されます。 これらの形式は次のとおりです。
BLOBHEADER blobheader;
// As explained under "Data Structures"
DHPUBKEY_VER3 dhpubkeyver3;
BYTE p[dhpubkeyver3.bitlenP/8];
// Where P is the prime modulus
BYTE q[dhpubkeyver3.bitlenQ/8];
// Where Q is a large factor of P-1
BYTE g[dhpubkeyver3.bitlenP/8];
// Where G is the generator parameter
BYTE j[dhpubkeyver3.bitlenJ/8];
// Where J is (P-1)/Q
BYTE y[dhpubkeyver3.bitlenP/8];
// Where Y is (G^X) mod P
この BLOB 形式は、CRYPT_BLOB_VER3 フラグが CryptExportKey で使用されるときにエクスポートされます。 バージョンは BLOB 内にあるため、この BLOB を CryptImportKey で使用するときにフラグを指定する必要はありません。
さらに、この BLOB 形式は、DH キーにキー パラメーターを設定するために dwParam 値 KP_PUB_PARAMS を使用する場合に、CryptSetKeyParam 関数と共に使用されます。 これは、キーの生成に CRYPT_PREGEN フラグが使用されている場合に行われます。 この状況で使用する場合、y 値は無視されるため、BLOB に含めないようにする必要があります。
次の表では、キー BLOB の各コンポーネントについて説明しています。
フィールド | 説明 |
---|---|
blobheader | BLOBHEADER 構造体。 bType メンバーの値は PUBLICKEYBLOB である必要があります。 |
dhpubkeyver3 | DHPUBKEY_VER3 構造体。 マジック メンバーは、公開キーの 0x33484400 に設定されている必要があります。 16 進数の値は、単に "DH3" の ASCII エンコードであることに注意してください。 |
P | P 値は、DHPUBKEY_VER3 構造体の直後にあり、常に、DHPUBKEY_VER3 bitlenP フィールドの長さ (P のビット長) を 8 (リトルエンディアン形式) で割ってバイト単位で表す必要があります。 |
Q | Q 値は P 値の直後にあり、常に DHPUBKEY_VER3 bitlenQ フィールドの長さを 8 (リトルエンディアン形式) で割ってバイト単位で表す必要があります。 bitlenQ 値が 0 の場合、値は BLOB に存在しません。 |
G | G 値は Q 値の直後にあり、常に、DHPUBKEY_VER3 bitlenP フィールドの長さ (P のビット長) を 8 で割ってバイト単位で表す必要があります。 データの長さが P を 8 で割ったバイトより 1 バイト以上短い場合、データを目的の長さ (リトルエンディアン形式) にするには、データに必要なバイト (ゼロ値) を埋め込む必要があります。 |
J | J 値は G 値の直後にあり、常に DHPUBKEY_VER3 bitlenJ フィールドの長さを 8 (リトルエンディアン形式) で割ってバイト単位で表す必要があります。 bitlenQ 値が 0 の場合、値は BLOB に存在しません。 |
年 | Y 値 (G^X) mod P は J 値の直後にあり、常に、DHPUBKEY_VER3 bitlenP フィールドの長さ (P のビット長) を 8 で割ってバイト単位で表す必要があります。 (G^X) mod P の計算結果のデータの長さが、P を 8 で割ったバイトより 1 バイト以上短い場合、データを目的の長さ (リトルエンディアン形式) にするには、データに必要なバイト (ゼロ値) を埋め込む必要があります。 この構造体を dwParam 値が KP_PUB_PARAMS の CryptSetKeyParam と一緒に使用する場合、この値は BLOB に含まれません。 |
Note
公開キー BLOB は暗号化されませんが、プレーンテキスト形式の公開キーが含まれます。