DSS 金鑰
DSS 金鑰可以透過呼叫 CryptGenKey 函式來產生。 對 CryptGenKey 的呼叫需要在 Algid 引數中傳遞AT_SIGNATURE或CALG_DSS_SIGN。 此呼叫會產生 P (質模數) 、Q (prime) 、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 引數中傳回。 傳回值時沒有標頭資訊,且格式為小數。
要簽署的資料必須先使用SHA演算法進行雜湊處理。 在該資料雜湊之後,會呼叫CryptSignHash函式來產生DSS簽章。
產生 DSS 簽章
- 呼叫 CryptAcquireCoNtext 以取得 Microsoft DSS 密碼編譯提供者的控制碼。
- 呼叫 CryptCreateHash ,並將 Algid 引數設定為 CALG_SHA 以取得 SHA 雜湊物件的控制碼。
- 呼叫 CryptHashData ,並將 hHash 引數設定為上一個步驟中擷取的控制碼。 這會建立資料的雜湊,並在CryptCreateHash函式呼叫的phHash引數中傳回雜湊的控制碼。
- 呼叫 CryptSignHash ,並將 hHash 引數設定為上一個步驟中擷取的控制碼。 AT_SIGNATURE或CALG_DSS_SIGN可以在 dwKeySpec 參數中傳遞。 簽章會傳回至 pbSignature 引數中提供的位址,而簽章的長度會傳回至 pdwSigLen 引數中提供的位址。 Null指標可能會在pbSignature引數中傳遞,在此情況下不會產生簽章,但簽章的長度會傳回至pdwSigLen參數中提供的位址。
若要驗證 DSS 簽章,必須匯入簽署者的 DSS 公開金鑰、 簽署的資料 必須經過雜湊處理,然後可以驗證簽章。
驗證 DSS 簽章
呼叫 CryptAcquireCoNtext 以取得 Microsoft DSS 密碼編譯提供者的控制碼。
呼叫 CryptImportKey 以匯入簽署者的 DSS 公開金鑰。
呼叫 CryptCreateHash ,並將 Algid 引數設定為 CALG_SHA 以取得 SHA 雜湊物件的控制碼。
呼叫 CryptHashData ,並將 hHash 引數設定為上一個步驟中擷取的控制碼,並使用 pbData 指向已簽署的資料。 這會建立資料的雜湊,並在CryptCreateHash函式呼叫的phHash引數中傳回雜湊的控制碼。
使用下列設定呼叫 CryptVerifySignature :
hHash 會設定為上一個步驟中執行的雜湊控制碼。
pbSignature 指向要驗證的簽章。
dwSigLen 設定為簽章的長度。
hPubKey 設定為步驟 2 中匯入的公開金鑰控制碼。
dwFlags 設定為零。
當您將 已簽署的資料 傳送給需要由收件者驗證簽章的人員時,簽署者的公開金鑰必須提供給收件者,而且通常會連同已簽署的資料一起傳送。 因此,必須能夠以金鑰 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 會設定為 PRI加值稅EKEYBLOB。 呼叫 CryptExportKey 時所傳回的 BLOB 是以 DSS 提供者金鑰 BLOB中所述的格式。