BOOL CryptCreateHash( HCRYPTPROV hProvider, ALG_ID AlgorithmId, HCRYPTKEY hKey, DWORD Flags, HCRYPTHASH *phHash);
引数の意味は以下の通り。
| hProvider | 使用するCSPを識別するハンドル。 |
| AlgorithmId | ハッシュアルゴリズム。後述の表を参照。 |
| hKey | 鍵を必要とするハッシュアルゴリズムのときに、使用する鍵のハンドルを指定する。必要としないならば、0でなければならない。 |
| Flags | 0でなければならない。 |
| phHash | 生成結果のハッシュオブジェクトのハンドル。 |
AlgorithmIdに指定可能な値は以下のいずれかである。
| CALG_MAC | メッセージ認証コード |
| CALG_MD2 | MD2 |
| CALG_MD5 | MD5 |
| CALG_SHA | SHA |
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);
}