C プログラムの例: CryptProtectData の使用
次の例では、CryptProtectData と CryptUnprotectData を使用してデータ BLOB を暗号化および暗号化解除します。
この例では、次のタスクと CryptoAPI 関数を示します。
- CRYPTPROTECT_PROMPTSTRUCTデータ構造の初期化。
- CryptProtectData を使用してデータ BLOB を暗号化する。
- CryptUnprotectData を使用してデータを復号化する。
- LocalFree を使用して割り当てられたメモリを解放する。
この例では、 MyHandleError 関数を使用します。 この関数のコードは、サンプルに含まれています。 この関数およびその他の補助関数のコードは、General Purpose関数にも一覧表示されます。
次の例は、データの保護を示しています。
#pragma comment(lib, "crypt32.lib")
#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void MyHandleError(char *s);
void main()
{
// Copyright (C) Microsoft. All rights reserved.
// Encrypt data from DATA_BLOB DataIn to DATA_BLOB DataOut.
// Then decrypt to DATA_BLOB DataVerify.
//-------------------------------------------------------------------
// Declare and initialize variables.
DATA_BLOB DataIn;
DATA_BLOB DataOut;
DATA_BLOB DataVerify;
BYTE *pbDataInput =(BYTE *)"Hello world of data protection.";
DWORD cbDataInput = strlen((char *)pbDataInput)+1;
DataIn.pbData = pbDataInput;
DataIn.cbData = cbDataInput;
CRYPTPROTECT_PROMPTSTRUCT PromptStruct;
LPWSTR pDescrOut = NULL;
//-------------------------------------------------------------------
// Begin processing.
printf("The data to be encrypted is: %s\n",pbDataInput);
//-------------------------------------------------------------------
// Initialize PromptStruct.
ZeroMemory(&PromptStruct, sizeof(PromptStruct));
PromptStruct.cbSize = sizeof(PromptStruct);
PromptStruct.dwPromptFlags = CRYPTPROTECT_PROMPT_ON_PROTECT;
PromptStruct.szPrompt = L"This is a user prompt.";
//-------------------------------------------------------------------
// Begin protect phase.
if(CryptProtectData(
&DataIn,
L"This is the description string.", // A description string.
NULL, // Optional entropy
// not used.
NULL, // Reserved.
&PromptStruct, // Pass a PromptStruct.
0,
&DataOut))
{
printf("The encryption phase worked. \n");
}
else
{
MyHandleError("Encryption error!");
}
//-------------------------------------------------------------------
// Begin unprotect phase.
if (CryptUnprotectData(
&DataOut,
&pDescrOut,
NULL, // Optional entropy
NULL, // Reserved
&PromptStruct, // Optional PromptStruct
0,
&DataVerify))
{
printf("The decrypted data is: %s\n", DataVerify.pbData);
printf("The description of the data was: %S\n",pDescrOut);
}
else
{
MyHandleError("Decryption error!");
}
//-------------------------------------------------------------------
// At this point, memcmp could be used to compare DataIn.pbData and
// DataVerify.pbDate for equality. If the two functions worked
// correctly, the two byte strings are identical.
//-------------------------------------------------------------------
// Clean up.
LocalFree(pDescrOut);
LocalFree(DataOut.pbData);
LocalFree(DataVerify.pbData);
} // 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(char *s)
{
fprintf(stderr,"An error occurred in running the program. \n");
fprintf(stderr,"%s\n",s);
fprintf(stderr, "Error number %x.\n", GetLastError());
fprintf(stderr, "Program terminating. \n");
exit(1);
} // End of MyHandleError