Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das folgende Beispiel erstellt und Hashes einem Sitzungsschlüssel, der zum Verschlüsseln einer Nachricht, eines Texts oder einer Datei verwendet werden kann.
Dieses Beispiel zeigt auch die Verwendung der folgenden CryptoAPI-Funktionen:
- CryptAcquireContext, um einen kryptografischen Dienstanbieterzu erwerben.
- CryptCreateHash, um ein leeres Hashobjekt zu erstellen.
- CryptGenKey, um einen zufälligen Sitzungsschlüsselzu erstellen.
- CryptHashSessionKey, um den erstellten Sitzungsschlüssel zu hashen.
- CryptDestroyHash, um den Hash zu zerstören.
- CryptDestroyKey, um den erstellten Schlüssel zu zerstören.
- CryptReleaseContext, um den CSP freizugeben.
In diesem Beispiel wird die Funktion MyHandleErrorverwendet. Der Code für diese Funktion ist im Beispiel enthalten. Code für diese und andere Hilfsfunktionen ist auch unter Allgemeine Funktionenaufgeführt.
// 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.