DSS バージョン 3 の秘密キー BLOB

バージョン 3 DSS 秘密キー をエクスポートすると、次のような形式になります。

BLOBHEADER        blobheader; 
DSSPRIVKEY_VER3   dssprivkeyver3;
BYTE p[dssprivkeyver3.bitlenP/8]; 
                    // Where P is the prime modulus
BYTE q[dssprivkeyver3.bitlenQ/8]; 
                    // Where Q is a large factor of P-1
BYTE g[dssprivkeyver3.bitlenP/8]; 
                    // Where G is the generator parameter
BYTE j[dssprivkeyver3.bitlenJ/8]; 
                    // Where J is (P-1)/Q
BYTE y[dssprivkeyver3.bitlenP/8]; 
                    // Where Y is (G^X) mod P
BYTE x[dssprivkeyver3.bitlenX/8]; 
                    // Where X is the private exponent

この BLOB 形式は、CRYPT_BLOB_VER3 フラグが CryptExportKey で使用されるときにエクスポートされます。 バージョンは BLOB 内にあるため、この BLOB を CryptImportKey で使用するときにフラグを指定する必要はありません。

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

フィールド 説明
Blobheader BLOBHEADER 構造体。 bType メンバーの値は PUBLICKEYBLOB である必要があります。
Dssprivkeyver3 DSSPRIVKEY_VER3 構造体。 マジック メンバーは、秘密キーの "DSS4" (0x34535344) に設定されている必要があります。 16 進数の値は、単に "DSS4" の ASCII エンコードであることに注意してください。
P P 値は、DSSPRIVKEY_VER3 構造体の直後にあり、常に、DSSPRIVKEY_VER3 bitlenP フィールドの長さ (P のビット長) を 8 (リトルエンディアン形式) で割ってバイト単位で表す必要があります。
Q Q 値は P 値の直後にあり、常に DSSPRIVKEY_VER3 bitlenQ フィールドの長さを 8 (リトルエンディアン形式) で割ってバイト単位で表す必要があります。
G G 値は Q 値の直後にあり、常に、DSSPRIVKEY_VER3 bitlenP フィールドの長さ (P のビット長) を 8 で割ってバイト単位で表す必要があります。 データの長さが P を 8 で割ったバイトより 1 バイト以上短い場合、データを目的の長さ (リトルエンディアン形式) にするには、データに必要なバイト (ゼロ値) を埋め込む必要があります。
J J 値は G 値の直後にあり、常に DSSPRIVKEY_VER3 bitlenJ フィールドの長さを 8 (リトルエンディアン形式) で割ってバイト単位で表す必要があります。 bitlenJ 値が 0 の場合、値は BLOB に存在しません。
Y 値 (G^X) mod P は J 値の直後にあり、常に、DSSPRIVKEY_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 が渡された場合、秘密キーは暗号化なしでエクスポートされます。

重要

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