示例 C 程序:创建和哈希会话密钥
以下示例创建一个会话密钥并对其进行哈希处理,该密钥可用于加密消息、文本或文件。
此示例还演示如何使用以下 CryptoAPI 函数:
- 用于获取加密服务提供程序的 CryptAcquireContext。
- CryptCreateHash 创建空哈希对象。
- 用于创建随机会话密钥的 CryptGenKey。
- CryptHashSessionKey 用于对创建的会话密钥进行哈希处理。
- CryptDestroyHash 以销毁哈希。
- CryptDestroyKey 用于销毁创建的密钥。
- CryptReleaseContext 用于释放 CSP。
此示例使用 函数 MyHandleError。 此示例中包含此函数的代码。 此函数和其他辅助函数的代码也列在常规用途函数下。
// Copyright (C) Microsoft. All rights reserved.
//
// CreateAndHashSessionKey.cpp : Defines the entry point for the
// application.
//
#include <stdafx.h>
#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
// Link with the Crypt32.lib file.
#pragma comment (lib, "Crypt32")
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void MyHandleError(LPTSTR psz);
void main()
{
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
//---------------------------------------------------------------
// Acquire a cryptographic provider context handle.
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
0))
{
printf("CryptAcquireContext complete. \n");
}
else
{
MyHandleError("Acquisition of context failed.");
}
//---------------------------------------------------------------
// Create a hash object.
if(CryptCreateHash(
hCryptProv,
CALG_MD5,
0,
0,
&hHash))
{
printf("An empty hash object has been created. \n");
}
else
{
MyHandleError("Error during CryptBeginHash!\n");
}
//---------------------------------------------------------------
// Create a random session key.
if(CryptGenKey(
hCryptProv,
CALG_RC2,
CRYPT_EXPORTABLE,
&hKey))
{
printf("A random session key has been created. \n");
}
else
{
MyHandleError("Error during CryptGenKey!\n");
}
//---------------------------------------------------------------
// Compute the cryptographic hash on the key object.
if(CryptHashSessionKey(
hHash,
hKey,
0))
{
printf("The session key has been hashed. \n");
}
else
{
MyHandleError("Error during CryptHashSessionKey!\n");
}
/*
Use the hash of the key object. For instance, additional data
could be hashed and sent in a message to several recipients. The
recipients will be able to verify who the message originator is
if the key used is also exported to them.
*/
//---------------------------------------------------------------
// Clean up.
// Destroy the hash object.
if(hHash)
{
if(!(CryptDestroyHash(hHash)))
{
MyHandleError("Error during CryptDestroyHash");
}
}
// Destroy the session key.
if(hKey)
{
if(!(CryptDestroyKey(hKey)))
{
MyHandleError("Error during CryptDestroyKey");
}
}
// Release the provider.
if(hCryptProv)
{
if(!(CryptReleaseContext(hCryptProv,0)))
{
MyHandleError("Error during CryptReleaseContext");
}
}
} // End main.
// Define function MyHandleError.
void MyHandleError(LPTSTR psz)
{
_ftprintf(stderr, TEXT("An error occurred in the program. \n"));
_ftprintf(stderr, TEXT("%s\n"), psz);
_ftprintf(stderr, TEXT("Error number %x.\n"), GetLastError());
_ftprintf(stderr, TEXT("Program terminating. \n"));
exit(1);
} // End of MyHandleError.