BOOL CryptSignHash( HCRYPTHASH hHash, KeyType, LPCTSTR Description, DWORD Flags, BYTE *Signature, DWORD *SignLen);
引数の意味は以下の通り。
| hHash | (IN) | 署名元のハッシュオブジェクト。 |
| KeyType | (IN) | どの鍵を使用するかを指定するフラグ。後述の表を参照。 |
| Description | (IN) | 署名に付与する記述。 |
| Flags | (IN) | 0でなければならない。 |
| Signature | (OUT) | 生成された署名。 |
| SignLen | (IN/OUT) | Signatureのサイズ。関数が終了すると、生成された署名の長さが返される。 |
KeyTypeに指定可能な値は以下のいずれかである。
| AT_KEYEXCANGE | 鍵交換用秘密鍵によって署名を生成する |
| AT_SIGNATURE | 署名生成用秘密鍵によって署名を生成する。 |
void SignData()
{
HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
BOOL bResult;
BYTE Buf[] = "今日は良い天気です";
BYTE Signature[100];
DWORD SignLen;
SignLen = 100;
/* デフォルト鍵コンテナの取得 */
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0);
/* ハッシュ値の生成 */
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
CryptHashData(hHash, Buf, lstrlen(Buf)+1, 0);
/* 署名生成 */
CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, Signature, &SignLen);
/* 署名検証 */
CryptGetUserKey(hProv, AT_SIGNATURE, &hKey);
bResult = CryptVerifySignature(hHash, Signature, SignLen, hKey, NULL, 0);
if(bResult) printf("検証成功\n");
else printf("検証失敗\n");
/* 後処理 */
CryptDestroyKey(hKey);
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
}