產生和擷取 DSS 金鑰
DSS 金鑰可由呼叫 CryptGenKey 函式來產生。 呼叫 CryptGenKey 時,需要AT_SIGNATURE或CALG_DSS_SIGN傳入 Algid 自變數。 此呼叫會產生 P (質數)、Q (質數)、G(產生器)、X(秘密指數),以及從頭開始的 Y (公鑰) 值,並將其保存在 金鑰 BLOB 中, 至本機記憶體。
產生 DSS 簽章金鑰組
- 呼叫 cryptAcquireContext函式,以取得Microsoft DSS 密碼編譯提供者的句柄。
- 呼叫 cryptGenKey 以產生金鑰。 必須針對 Algid 自變數傳入AT_SIGNATURE或CALG_DSS_SIGN,而且 dwFlags 自變數的上層 16 位必須設定為所需的密鑰大小。 如果前16位為零,則會使用1,024位的預設密鑰大小。 hKey 自變數中會傳回 HCRYPTKEY 句柄。
擷取先前產生的簽章密鑰指標
- 呼叫 cryptAcquireContext,以取得Microsoft DSS 密碼編譯提供者的句柄。
- 呼叫 CryptGetUserKey 函式,並將 dwKeySpec 自變數設定為 AT_SIGNATURE 或 CALG_DSS_SIGN。
擷取 P、Q 和 G 值
- 呼叫 cryptAcquireContext,以取得Microsoft DSS 密碼編譯提供者的句柄。
- 呼叫 CryptGetUserKey,並將 dwKeySpec 自變數設定為 AT_SIGNATURE 或 CALG_DSS_SIGN。
- 呼叫 CryptGetKeyParam,並將 hKey 自變數設定為上一個步驟中擷取的指標。 dwParam 自變數必須設定為所需的旗標;KP_P、KP_Q或KP_G。 此值會在 pbData 自變數中傳回,而數據長度則會在 pdwDataLen 自變數中傳回。 值會以沒有標頭資訊的方式傳回,並以 格式傳回。
產生 DSS 簽章
要簽署的數據必須先使用 SHA 演算法來 哈希。 在該數據哈希之後,呼叫 CryptSignHash 函式,會產生 DSS 簽章。
產生 DSS 簽章
- 呼叫 cryptAcquireContext,以取得Microsoft DSS 密碼編譯提供者的句柄。
- 呼叫 CryptCreateHash,並將 algid 自變數設定為 CALG_SHA,以取得 SHA 哈希物件的句柄。
- 呼叫 CryptHashData,並將 hHash 自變數設定為在上一個步驟中擷取的句柄。 這會建立數據的哈希,並將句柄傳回 phHash 自變數中 CryptCreateHash 函數調用中的哈希。
- 呼叫 CryptSignHash,並將 hHash 自變數設定為在上一個步驟中擷取的句柄。 AT_SIGNATURE或CALG_DSS_SIGN可能會傳入 dwKeySpec 參數。 簽章會傳回至 pbSignature 自變數中提供的位址,並將簽章的長度傳回至 pdwSigLen 自變數中提供的位址。 NULL 指標可能會傳入 pbSignature 自變數,在此情況下,不會產生簽章,但簽章的長度會傳回 pdwSigLen 參數中提供的位址。
驗證 DSS 簽章
若要驗證 DSS 簽章,必須匯入簽署者的 DSS 公鑰、簽署的數據 必須哈希,然後才能驗證簽章。
驗證 DSS 簽章
呼叫 CryptImportKey 匯入簽署者的 DSS 公鑰。
呼叫 CryptCreateHash,並將 algid 自變數設定為 CALG_SHA,以取得 SHA 哈希物件的句柄。
呼叫 CryptHashData,並將 hHash 自變數設定為上一個步驟中擷取的句柄,並使用指向已簽署數據的 pbData。 這會建立數據的哈希,並將句柄傳回 phHash 自變數中 CryptCreateHash 函數調用中的哈希。
使用下列設定呼叫 CryptVerifySignature:
hHash 會設定為上一個步驟中執行的哈希句柄。
pbSignature 指向要驗證的簽章。
dwSigLen 會設定為簽章的長度。
hPubKey 設定為步驟 2 中所匯入公鑰的句柄。
dwFlags 設為零。
匯出 DSS 金鑰
當您傳送 已簽署的數據 給需要由收件者驗證簽章的人員時,簽署者的公鑰必須提供給收件者,且通常會連同已簽署的數據一起傳送。 因此,必須能夠以 金鑰 BLOB 格式匯出 DSS 金鑰。
匯出 DSS 公鑰
- 呼叫 cryptAcquireContext,以取得Microsoft DSS 密碼編譯提供者的句柄。
- 呼叫 CryptGetUserKey,並將 dwKeySpec 自變數設定為 AT_SIGNATURE 或 CALG_DSS_SIGN。
- 呼叫 CryptExportKey,並將 hKey 設定為上一個步驟中擷取的句柄、dwBlobType 設為 PUBLICKEYBLOB,dwFlags 設為零。 DSS 公鑰 BLOB 會在 pbData 中傳回,而 金鑰 BLOB 的長度會在 pdwDataLen中傳回。 NULL 指標可能會傳入 pbData,在此情況下,只會傳回 DSS 金鑰 BLOB 的長度。 呼叫 cryptExportKey 時傳回的 BLOB 格式為 DSS 提供者密鑰 BLOB 中所述的格式。
匯出 DSS 私鑰
- 請遵循與導出 DSS 公鑰相同的程式,不同之處在於呼叫 cryptExportKey 時,dwBlobType 設為 PRIVATEKEYBLOB。 呼叫 cryptExportKey 時傳回的 BLOB 格式為 DSS 提供者密鑰 BLOB 中所述的格式。