DSS 第 3 版私密金鑰 BLOB

匯出第 3 版DSSprivate 金鑰時,其格式如下:

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

當CRYPT_BLOB_VER3旗標與CryptExportKey搭配使用時,就會匯出此BLOB格式。 因為版本位於 BLOB 中,所以搭配 CryptImportKey使用此 BLOB 時不需要指定旗標。

下表描述 金鑰 BLOB的每個元件。

欄位 描述
Blobheader BLOBHEADER結構。 bType成員必須具有 PUBLICKEYBLOB 的值。
Dssprivkeyver3 DSSPRIVKEY_VER3結構。 私密金鑰的 magic成員應設定為 「DSS4」 (0x34535344) 。 請注意,十六進位值只是 「DSS4」 的 ASCII 編碼方式。
P P 值會直接位於 DSSPRIVKEY_VER3 結構之後,而且一律應該是DSSPRIVKEY_VER3 bitlenP 欄位的長度, (位長度的 P) 除以八個 (位元組 位元組格式) 。
Q Q 值會直接位於 P 值後面,而且一律應該是 DSSPRIVKEY_VER3 bitlenQ 欄位的長度,並以八個 (位元組 位元組格式) 。
G G 值會直接位於 Q 值後面,而且一律應該是 DSSPRIVKEY_VER3 bitlenP 欄位的長度, (位長度 P) 除以 8。 如果資料的長度比 P 短一或多個位元組除以 8,則資料必須填補必要的位元組, (為零值) ,使資料成為所需的長度 (小到尾 格式) 。
J J 值會直接位於 G 值後面,而且一律應該是 DSSPRIVKEY_VER3 bitlenJ 欄位的長度,並以八個 (位元組 格式) 。 如果 bitlenJ 值為 0,則 BLOB 中沒有值。
Y Y 值 (G^X) mod P 直接位於 J 值之後,而且一律應該是DSSPRIVKEY_VER3 bitlenP 欄位的長度, (位長度 P) 除以 8。 如果計算 (G^X) mod P 所產生的資料長度比 P 短一或多個位元組除以 8,則必須以零值) (必要的位元組填補資料,使資料成為 (小端 格式) 。
X X 值是隨機大型整數,因此 DH 金鑰組的公用部分 Y 等於:Y = (G^X) mod P

 

呼叫 CryptExportKey時,開發人員可以選擇是否要加密金鑰。 如果 hExpKey 參數包含工作階段金鑰的有效控制碼,則會加密金鑰。 除了 BLOB 的 BLOBHEADER部分,所有專案都會加密。 請注意,加密演算法和加密金鑰參數不會與 私密金鑰 BLOB一起儲存。 應用程式必須管理和儲存此資訊。 如果 hExpKey傳遞零,則會匯出私密金鑰而不加密。

重要

在沒有加密的情況下匯出私密金鑰會很危險,因為它們很容易遭到未經授權的實體攔截和使用。