DSS キー
DSS キーの生成と取得
DSS キーは、 CryptGenKey 関数の呼び出しによって生成できます。 CryptGenKey を呼び出すには、Algid 引数にAT_SIGNATUREまたはCALG_DSS_SIGNを渡す必要があります。 この呼び出しでは、P (素数)、Q (素数)、G (ジェネレーター)、X (シークレット指数)、Y (公開キー) の値が最初から生成され、 キー BLOB 内でローカル ストレージに保持されます。
DSS 署名キー ペアを生成するには
- CryptAcquireContext 関数を呼び出して、Microsoft DSS 暗号化プロバイダーへのハンドルを取得します。
- キーを生成するには 、CryptGenKey を呼び出します。 Algid 引数のAT_SIGNATUREまたはCALG_DSS_SIGNを渡し、dwFlags 引数の上位 16 ビットを目的のキー サイズに設定する必要があります。 上位 16 ビットが 0 の場合は、既定のキー サイズである 1,024 ビットが使用されます。 HCRYPTKEY ハンドルは、hKey 引数で返されます。
以前に生成された署名キーへのポインターを取得するには
- CryptAcquireContext を呼び出して、Microsoft DSS 暗号化プロバイダーへのハンドルを取得します。
- dwKeySpec 引数を AT_SIGNATURE または CALG_DSS_SIGN に設定して、CryptGetUserKey 関数を呼び出します。
P、Q、G の値を取得するには
- CryptAcquireContext を呼び出して、Microsoft DSS 暗号化プロバイダーへのハンドルを取得します。
- dwKeySpec 引数を AT_SIGNATURE または CALG_DSS_SIGN に設定して CryptGetUserKey を呼び出します。
- hKey 引数を前の手順で取得したポインターに設定して、CryptGetKeyParam を呼び出します。 dwParam 引数は、目的のフラグに設定する必要があります。KP_P、KP_Q、またはKP_G。 値は pbData 引数で返され、データの長さは pdwDataLen 引数で返されます。 値はヘッダー情報なしで 、リトル エンディアン 形式で返されます。
DSS 署名の生成
署名するデータは、まず SHA アルゴリズムを使用してハッシュする必要があります。 そのデータがハッシュされると、CryptSignHash 関数を呼び出すことによって DSS 署名が生成されます。
DSS 署名を生成するには
- CryptAcquireContext を呼び出して、Microsoft DSS 暗号化プロバイダーへのハンドルを取得します。
- Algid 引数を CALG_SHA に設定して CryptCreateHash を呼び出して、SHA ハッシュ オブジェクトへのハンドルを取得します。
- hHash 引数を前の手順で取得したハンドルに設定して CryptHashData を呼び出します。 これにより、データのハッシュが作成され、CryptCreateHash 関数呼び出しの phHash 引数でハッシュへのハンドルが返されます。
- 前の手順で取得したハンドルに hHash 引数を設定して CryptSignHash を呼び出します。 dwKeySpec パラメーターには、AT_SIGNATUREまたはCALG_DSS_SIGNを渡すことができます。 シグネチャは pbSignature 引数で指定されたアドレスに返され、シグネチャの長さは pdwSigLen 引数で指定されたアドレスに返されます。 pbSignature 引数に NULL ポインターを渡すことができます。この場合、シグネチャは生成されませんが、シグネチャの長さは pdwSigLen パラメーターで指定されたアドレスに返されます。
DSS 署名の確認
DSS 署名を確認するには、署名者の DSS 公開キーをインポートし、 署名されたデータ をハッシュして、署名を検証する必要があります。
DSS 署名を確認するには
CryptAcquireContext を呼び出して、Microsoft DSS 暗号化プロバイダーへのハンドルを取得します。
CryptImportKey を呼び出して、署名者の DSS 公開キーをインポートします。
Algid 引数を CALG_SHA に設定して CryptCreateHash を呼び出して、SHA ハッシュ オブジェクトへのハンドルを取得します。
hHash 引数を前の手順で取得したハンドルに設定し、pbData が符号付きデータを指す CryptHashData を呼び出します。 これにより、データのハッシュが作成され、CryptCreateHash 関数呼び出しの phHash 引数でハッシュへのハンドルが返されます。
次 の設定で CryptVerifySignature を呼び出します。
hHash は、前の手順で実行したハッシュのハンドルに設定されます。
pbSignature は、検証対象の署名を指します。
dwSigLen は署名の長さに設定されます。
hPubKey は、手順 2 でインポートした公開キーのハンドルに設定されます。
dwFlags は 0 に設定されています。
DSS キーのエクスポート
署名されたデータを受信者が確認する必要があるユーザーに署名データを送信する場合、署名者の公開キーを受信者に提供する必要があり、通常は署名されたデータと共に送信されます。 そのため、キー BLOB 形式で DSS キーをエクスポートできる必要があります。
DSS 公開キーをエクスポートするには
- CryptAcquireContext を呼び出して、Microsoft DSS 暗号化プロバイダーへのハンドルを取得します。
- dwKeySpec 引数を AT_SIGNATURE または CALG_DSS_SIGN に設定して CryptGetUserKey を呼び出します。
- 前の手順で取得したハンドルに hKey を設定し、dwBlobType を PUBLICKEYBLOB に設定し、dwFlags を 0 に設定して、CryptExportKey を呼び出します。 DSS 公開キー BLOB は pbData で返され、 キー BLOB の長さは pdwDataLen で返されます。 null ポインターは pbData で渡すことができます。この場合、DSS キー BLOB の長さだけが返されます。 CryptExportKey の呼び出しを行うときに返される BLOB は、「DSS プロバイダー キー BLOB」で説明されている形式です。
DSS 秘密キーをエクスポートするには
- DSS 公開キーをエクスポートする場合と同じ手順に従います。 ただし、CryptExportKey の呼び出しを行うとき、 dwBlobType は PRIVATEKEYBLOB に設定されます。 CryptExportKey の呼び出しを行うときに返される BLOB は、「DSS プロバイダー キー BLOB」で説明されている形式です。