C プログラム例: セッション キーの作成とハッシュ
次の例では、メッセージ、テキスト、またはファイルの暗号化に使用できるセッション キーを作成してハッシュします。
この例では、次の CryptoAPI 関数の使用も示しています。
- 暗号化サービス プロバイダーを取得する CryptAcquireContext。
- 空のハッシュ オブジェクトを作成する CryptCreateHash。
- ランダムなセッション キーを作成する CryptGenKey。
- 作成されたセッション キーをハッシュする CryptHashSessionKey。
- ハッシュを破棄する CryptDestroyHash。
- 作成されたキーを破棄する CryptDestroyKey。
- CSP を解放する CryptReleaseContext。
この例では、 関数 MyHandleError を使用します。 この関数のコードは、サンプルに含まれています。 この関数およびその他の補助関数のコードは、General Purpose関数の下にも表示されます。
// 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.