Крипто-Про CSP |
//-------------------------------------------------------------------- // Данный пример демонстрирует расшифрование файла на сессионном ключе. // Для корректной работы этого примера передаваемые ему входные данные // должны являться результатом работы примера EncryptFile. // Зашифрованный сессионный ключ содержится в файле "session.bin". // Для его расшифрования необходим открытый ключ отправителя, содержащийся // в файле "public.bin" (данный файл создается при выполнении примера // ExportInFile). // Для корректной работы этой программы необходимо получить зашифрованный // файл с именем "encrypt.bin". Для правильного расшифрования файла // необходим вектор инициализации, который хранится в файле "vector.bin". // Расшифрование производится в файл "destination.txt". // Следует сделить за тем, чтобы контейнер с именем "Public", используемый // в программах ExportInFile и EncryptFile, на момент выполнения данной программы // существовал. //-------------------------------------------------------------------- void HandleError(char *s); int main(void) { //-------------------------------------------------------------------- // Объявление и инициализация переменных. HCRYPTPROV hProv; // Дескриптор CSP HCRYPTKEY hKey; // Дескриптор закрытого ключа HCRYPTKEY hSessionKey; // Дескриптор сессионного ключа HCRYPTKEY hAgreeKey; // Дескриптор ключа согласования BYTE pbKeyBlob[100]; // Указатель на ключевой BLOB DWORD dwBlobLen; // Длина ключевого BLOBа BYTE pbKeyBlobSimple[100]; // Указатель на сессионный ключевой BLOB DWORD dwBlobLenSimple; // Длина сессионного ключевого BLOBа FILE *encrypt; // Зашифрованный файл FILE *Public; // Файл, в котором хранится открытый ключ FILE *session; // Файл для хранения сессионного ключа FILE *vector; // Файл для хранения вектора инициализации FILE *destination; // Расшифрованный файл BYTE pbIV[100]; // Вектор инициализации сессионного ключа DWORD dwIV = 0; // Длина вектора инициализации BYTE pbContent[4096]; // Указатель на содержимое зашифрованного файла DWORD cbContent = 0; // Длина содержимого //-------------------------------------------------------------------- // Открытие файла, в котором содержится открытый ключ отправителя. Public = fopen( "public.bin", "r+b" ); if(Public) { printf( "The file 'public.bin' was opened\n" ); } else { HandleError( "Problem opening the file 'public.bin'\n" ); } //-------------------------------------------------------------------- // Открытие файла, в котором хранится зашифрованный файл. encrypt = fopen( "encrypt.bin", "r+b" ); if(encrypt) { printf( "The file 'encrypt.bin' was opened\n" ); } else { HandleError( "Problem opening the file 'encrypt.bin'\n" ); } //-------------------------------------------------------------------- // Открытие файла, в котором хранится сессионный ключ. session = fopen( "session.bin", "r+b" ); if(session) { printf( "The file 'session.bin' was opened\n" ); } else { HandleError( "Problem opening the file 'session.bin'\n" ); } //-------------------------------------------------------------------- // Открытие файла, в котором хранится вектор инициализации. vector = fopen( "vector.bin", "r+b" ); if(vector) { printf( "The file 'vector.bin' was opened\n" ); } else { HandleError( "Problem opening the file 'vector.bin'\n" ); } //-------------------------------------------------------------------- // Открытие файла, в который будет записан расшифрованный файл. destination = fopen( "destination.txt", "w+b" ); if(destination) { printf( "The file 'destination.txt' was opened\n" ); } else { HandleError( "Problem opening the file 'destination.txt'\n" ); } //-------------------------------------------------------------------- // Чтение вектора инициализации из файла. dwIV = (DWORD)fread(pbIV, 1, 100, vector); if(dwIV) { printf( "The IV was read from the 'vector.bin'\n" ); } else { HandleError( "The IV can not be reading from the 'vector.bin'\n" ); } //-------------------------------------------------------------------- // Получение дескриптора контейнера получателя с именем "Public", // находящегося в рамках провайдера. if(CryptAcquireContext( &hProv, "Public", NULL, 75, 0)) { printf("The key container \"Public\" has been acquired. \n"); } else { HandleError("Error during CryptAcquireContext."); } //-------------------------------------------------------------------- // Чтение сесcионного ключа из файла. dwBlobLenSimple = (DWORD)fread(pbKeyBlobSimple, 1, 100, session); if(dwBlobLenSimple) { printf( "The session key was read from the 'session.bin'\n" ); } else { HandleError( "The session key can not be reading from the 'session.bin'\n" ); } //-------------------------------------------------------------------- // Чтение открытого ключа отправителя из файла. dwBlobLen = (DWORD)fread(pbKeyBlob, 1, 100, Public); if(dwBlobLen) { printf( "The public key was read from the 'public.bin'\n" ); } else { HandleError( "The public key can not be reading from the 'public.bin'\n" ); } fclose(Public); //-------------------------------------------------------------------- // Получение дескриптора закрытого ключа получателя. if(CryptGetUserKey( hProv, AT_KEYEXCHANGE, &hKey)) { printf("The private key has been acquired. \n"); } else { printf("Error during CryptGetUserKey private key."); } //-------------------------------------------------------------------- // Получение ключа согласования импортом открытого ключа отправителя // на закрытом ключе получателя. if (CryptImportKey( hProv, pbKeyBlob, dwBlobLen, hKey, 0, &hAgreeKey)) { printf("The sender public key has been imported. \n"); } else { printf("Error during CryptImportKey public key."); } //-------------------------------------------------------------------- // Получение сессионного ключа импортом зашифрованного сессионного ключа // на ключе Agree. if (CryptImportKey( hProv, pbKeyBlobSimple, dwBlobLenSimple, hAgreeKey, 0, &hSessionKey)) { printf("The session key has been imported. \n"); } else { printf("Error during CryptImportKey session key."); } //-------------------------------------------------------------------- // Установка вектора инициализации - без него первые 8 байт // расшифруются неправильно. if (CryptSetKeyParam( hSessionKey, KP_IV, pbIV, 0)) { printf( "CryptSetKeyParam succeeded. \n"); } else { HandleError("Error during CryptSetKeyParam."); } //-------------------------------------------------------------------- // Чтение зашифрованного файла блоками по 4 КБ. Расшифрование прочитанного // блока и запись его в файл "destination.txt". //-------------------------------------------------------------------- do { cbContent = (DWORD)fread(pbContent, 1, 4096, encrypt); if(cbContent) { // Расшифрование прочитанного блока на сессионном ключе. if(CryptDecrypt( hSessionKey, 0, TRUE, 0, pbContent, &cbContent)) { printf( "Decryption succeeded. \n"); // Запись расшифрованного блока в файл. if(fwrite( pbContent, 1, cbContent, destination)) { printf( "The decrypted content was written to the 'destination.txt'\n" ); } else { HandleError( "The decrypted content can not be written to the 'destination.txt'\n" ); } } else { HandleError("Decryption failed."); } } else { HandleError( "Problem reading the file 'encrypt.bin'\n" ); } } while (!feof(encrypt)); //-------------------------------------------------------------------- // Закрытие файлов. fclose (encrypt); fclose (session); fclose (vector); fclose (destination); // Уничтожение дескриптора закрытого ключа. if(hKey) CryptDestroyKey(hKey); // Уничтожение дескриптора сессионного ключа. if(hSessionKey) CryptDestroyKey(hSessionKey); // Уничтожение дескриптора ключа согласования. if(hAgreeKey) CryptDestroyKey(hAgreeKey); // Освобождение дескриптора провайдера. 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 |