Beispiel-C-Programm: Festlegen und Abrufen von Sitzungsschlüsselparametern
Im folgenden Beispiel wird ein zufälliger Sitzungsschlüssel erstellt, einige Standardparameter dieses Schlüssels abgerufen und ausgegeben, ein neuer Parameter für den ursprünglichen Schlüssel festgelegt und anschließend der Wert dieses neuen Parameters abgerufen und ausgegeben. Es bereinigt sich, indem der Sitzungsschlüssel zerstört und der kryptografische Kontext freigegeben wird.
In diesem Beispiel wird die Verwendung der folgenden Aufgaben und Funktionen veranschaulicht:
- Zugreifen auf einen CSP mithilfe von CryptAcquireContext.
- Erstellen eines Puffers mit zufälligen Bytes mithilfe von CryptGenRandom.
- Erstellen eines Sitzungsschlüssels mit CryptGenKey.
- Abrufen des Werts von Schlüsselparametern mithilfe von CryptGetKeyParam.
- Verwenden von CryptSetKeyParam zum Ändern des Schlüsselgenerierungsprozesses.
- Zerstören der Schlüssel mit CryptDestroyKey.
- Freigeben des CSP mit CryptReleaseContext.
In diesem Beispiel wird die Funktion MyHandleError verwendet. Der Code für diese Funktion ist im Beispiel enthalten. Code für diese und andere Hilfsfunktionen ist auch unter Universell Functions aufgeführt.
//-------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#include <tchar.h>
// Link with the Crypt32.lib file.
#pragma comment (lib, "Crypt32")
void MyHandleError(PCTSTR psz);
void main()
{
HCRYPTPROV hProv;
HCRYPTKEY hKey;
DWORD dwMode;
BYTE pbData[16];
BYTE pbRandomData[8];
DWORD dwCount;
DWORD i;
// Acquire a cryptographic provider context handle.
if(!CryptAcquireContext(
&hProv,
NULL,
NULL,
PROV_RSA_FULL,
0))
{
MyHandleError(TEXT("Error during CryptAcquireContext."));
}
// Generate eight bytes of random data into pbRandomData.
if( CryptGenRandom(
hProv,
8,
pbRandomData))
{
_tprintf(TEXT("Eight bytes of random data have been generated.\n"));
}
else
{
MyHandleError(TEXT("Random bytes were not correctly generated."));
}
// Create a random block cipher session key.
if(!CryptGenKey(
hProv,
CALG_RC4,
CRYPT_EXPORTABLE,
&hKey))
{
MyHandleError(TEXT("Error during CryptGenKey."));
}
// Read the cipher mode.
dwCount = sizeof(DWORD);
if(CryptGetKeyParam(
hKey,
KP_MODE,
(PBYTE)&dwMode,
&dwCount,
0))
{
// Print the cipher mode.
_tprintf(TEXT("Default cipher mode: %d\n"), dwMode);
}
else
{
MyHandleError(TEXT("Error during CryptGetKeyParam."));
}
// Read the initialization vector.
// Get the length of the initialization vector.
if(!CryptGetKeyParam(
hKey,
KP_IV,
NULL,
&dwCount,
0))
{
MyHandleError(TEXT("Error getting the IV length"));
}
// Get the initialization vector, itself.
if(CryptGetKeyParam(
hKey,
KP_IV,
pbData,
&dwCount,
0))
{
// Print the initialization vector.
_tprintf(TEXT("Default IV:"));
for(i = 0; i < dwCount; i++)
{
_tprintf(TEXT("%2.2x "),pbData[i]);
}
_tprintf(TEXT("\n"));
}
else
{
MyHandleError(TEXT("Error getting the IV."));
}
// Reset the initialization vector.
if(CryptSetKeyParam(
hKey,
KP_IV,
pbRandomData,
0))
{
_tprintf(TEXT("New initialization vector is set.\n"));
}
else
{
MyHandleError(TEXT("The new IV was not set."));
}
// Read the new initialization vector.
// Get the length of the new initialization vector.
if(!CryptGetKeyParam(
hKey,
KP_IV,
NULL,
&dwCount,
0))
{
MyHandleError(TEXT("Error getting the IV length"));
}
// Get the initialization vector, itself.
if(CryptGetKeyParam(
hKey,
KP_IV,
pbData,
&dwCount,
0))
{
// Print the initialization vector.
_tprintf(TEXT("RE-set IV:"));
for(i = 0; i < dwCount; i++)
{
_tprintf(TEXT("%2.2x "),pbData[i]);
}
_tprintf(TEXT("\n"));
}
else
{
MyHandleError(TEXT("Error getting the IV."));
}
// Clean up.
// Destroy the session key.
if(hKey)
{
CryptDestroyKey(hKey);
}
// Release the provider handle.
if(hProv)
{
CryptReleaseContext(hProv, 0);
}
} // End of main.
//-------------------------------------------------------------------
// This example uses the function MyHandleError, a simple error
// handling function, to print an error message to the standard
// error (stderr) file and exit the program.
// For most applications, replace this function with one
// that does more extensive error reporting.
void MyHandleError(PTSTR 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.