Крипто-Про CSP |
//-------------------------------------------------------------------- // Данный пример демонстрирует экспортирование открытого ключа в // в файл. // Эта программа используется для экспортирования как открытого ключа // отправителя, так и открытого ключа получателя. // Она необходима для работы таких программ, как зашифрование и // расшифрование содержимого файла. // Для корректной работы этой программы необходимо создать контейнер // с именем "Public". // Контейнер может быть создан при помощи примера CreatingKeyContainer. //-------------------------------------------------------------------- void HandleError(char *s); int main(void) { //-------------------------------------------------------------------- // Объявление и инициализация переменных. HCRYPTPROV hProv; // Дескриптор CSP HCRYPTKEY hKey; // Дескриптор открытого ключа получателя BYTE *pbKeyBlob; // Указатель на ключевой BLOB DWORD dwBlobLen; // Длина ключевого BLOBа FILE *Public; // Файл для хранения открытого ключа //-------------------------------------------------------------------- // Получение дескриптора контейнера с именем "Public", // находящегося в рамках провайдера. if(CryptAcquireContext( &hProv, "Public", NULL, 75, 0)) { printf("The key container \"Public\" has been acquired. \n"); } else { HandleError("Error during CryptAcquireContext."); } //-------------------------------------------------------------------- // Получение дескриптора открытого ключа. if(CryptGetUserKey( hProv, AT_KEYEXCHANGE, &hKey)) { printf("The public key has been acquired. \n"); } else { printf("Error during CryptGetUserKey public key."); } //-------------------------------------------------------------------- // Запись открытого ключа в ключевой BLOB. // //-------------------------------------------------------------------- //-------------------------------------------------------------------- // Определение размера BLOBа открытого ключа и распределение памяти. if(CryptExportKey( hKey, 0, PUBLICKEYBLOB, 0, NULL, &dwBlobLen)) { printf("Size of the BLOB for the public key determined. \n"); } else { HandleError("Error computing BLOB length."); } pbKeyBlob = (BYTE*)malloc(dwBlobLen); if(pbKeyBlob) { printf("Memory has been allocated for the BLOB. \n"); } else { HandleError("Out of memory. \n"); } //-------------------------------------------------------------------- // Экспортирование открытого ключа в BLOB открытого ключа. if(CryptExportKey( hKey, 0, PUBLICKEYBLOB, 0, pbKeyBlob, &dwBlobLen)) { printf("Contents have been written to the BLOB. \n"); } else { HandleError("Error during CryptExportKey."); } //-------------------------------------------------------------------- // Открытие файла на запись в него BLOBа открытого ключа. Public = fopen( "public.bin", "w+b" ); if(Public) { printf( "The file 'public.bin' was opened\n" ); } else { HandleError( "Problem opening the file\n" ); } //-------------------------------------------------------------------- // Запись открытого ключа в файл. if(fwrite(pbKeyBlob, 1, dwBlobLen, Public)) { printf( "The public key was written to the 'public.bin'\n" ); } else { HandleError( "The public key can not be written to the 'public.bin'\n" ); } //-------------------------------------------------------------------- // Закрытие файла. fclose (Public); //-------------------------------------------------------------------- // Освобождение памяти, используемой ключевым BLOBом. free(pbKeyBlob); // Уничтожение дескриптора открытого ключа. if(hKey) CryptDestroyKey(hKey); // Освобождение дескриптора провайдера. if(hProv) CryptReleaseContext(hProv, 0); printf("The program ran to completion without error. \n"); }// Конец main
Windows 2000/XP/2003: Необходимо Windows 2000 SP4 или
старше с Internet Explorer 6.0 или старше.
Windows NT/95/98/ME: CSP 3.0 не поддерживает (см. КриптоПро CSP
2.0 ).
Solaris: 9 Update 4 или выше.
FreeBSD: FreeBSD 5.2 или выше
Linux: RedHat 7.3, RedHad 9.0.
Ядро Windows NT: не поддерживает.
Что Вы
думаете по поводу данной статьи? |
Закажите CD c Крипто-Про CSP |