C-Beispielprogramm: Festlegen und Abrufen von Sitzungsschlüsselparametern
Das folgende Beispiel erstellt einen zufälligen Sitzungsschlüssel, ruft einige Standardparameter dieses Schlüssels ab und gibt diese aus, legt neue Parameter für den ursprünglichen Schlüssel fest, ruft dann den Wert dieses neuen Parameters ab und gibt diesen aus. Sie wird bereinigt, indem der Sitzungsschlüssel zerstört und der kryptografische Kontext freigegeben wird.
Dieses Beispiel veranschaulicht die Verwendung der folgenden Aufgaben und Funktionen:
- Zugreifen auf einen CSP mithilfe von CryptAcquireContext.
- Das Einreichen 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 Functionsaufgefü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.