На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Encryption Example



This example reads data from a text file (test1.txt), encrypts it using the RC2 block cipher, and writes out the encrypted data to another file (test1.xxx). A random session key is generated to perform the encryption and is stored to the output file along with the encrypted data. Note that this session key is encrypted with our own public key exchange key by the CryptExportKey function.

#include

FILE *hSource = NULL;
FILE *hDest = NULL;
int eof = 0;

HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTKEY hXchgKey = 0;

#define BLOCK_SIZE 160
#define BUFFER_SIZE (BLOCK_SIZE+16) // Give buffer 16 bytes of extra
// room for padding, etc.
BYTE pbBuffer[BUFFER_SIZE];
DWORD dwCount;

BYTE *pbKeyBlob = NULL;
DWORD dwBlobLen;

// Open source file.
if((hSource=fopen("test1.txt","rb"))==NULL) {
printf("Error opening source file!\n");

goto done;
}

// Open destination file.
if((hDest=fopen("test1.xxx","wb"))==NULL) {
printf("Error opening destination file!\n");
goto done;
}

// Get handle to the default provider.
if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
printf("Error %x during CryptAcquireContext!\n", GetLastError());
goto done;
}

// Get handle to key exchange key.
if(!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hXchgKey)) {
printf("Error %x during CryptGetUserKey!\n", GetLastError());

goto done;
}

// Create a random block cipher session key.
if(!CryptGenKey(hProv, CALG_RC2, CRYPT_EXPORTABLE, &hKey)) {
printf("Error %x during CryptGenKey!\n", GetLastError());
goto done;
}

// Determine size of key blob and allocate memory.
if(!CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, NULL, &dwBlobLen)) {
printf("Error %x computing blob length!\n", GetLastError());
goto done;
}
if((pbKeyBlob = malloc(dwBlobLen)) == NULL) {
printf("Out of memory!\n");

goto done;
}

// Export key into a simple key blob.
if(!CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob, &dwBlobLen)) {
printf("Error %x during CryptExportKey!\n", GetLastError());
free(pbKeyBlob);
goto done;
}

// Write size of key blob to destination file.
fwrite(&dwBlobLen, sizeof(DWORD), 1, hDest);
if(ferror(hDest)) {
printf("Error writing header!\n");
free(pbKeyBlob);
goto done;
}

// Write key blob to destination file.

fwrite(pbKeyBlob, 1, dwBlobLen, hDest);
if(ferror(hDest)) {
printf("Error writing header!\n");
free(pbKeyBlob);
goto done;
}

// Free memory.
free(pbKeyBlob);

// Encrypt source file and write to destination file.
do {
// Read up to BLOCK_SIZE bytes from source file.
dwCount = fread(pbBuffer, 1, BLOCK_SIZE, hSource);
if(ferror(hSource)) {
printf("Error reading data!\n");
goto done;
}
eof=feof(hSource);

// Encrypt data

if(!CryptEncrypt(hKey, 0, eof, 0, pbBuffer, &dwCount, BUFFER_SIZE)) {
printf("Error %x during CryptEncrypt!\n", GetLastError());
goto done;
}

// Write data to destination file.
fwrite(pbBuffer, 1, dwCount, hDest);
if(ferror(hDest)) {
printf("Error writing data!\n");
goto done;
}
} while(!feof(hSource));

done:

// Destroy session key.
if(hKey != 0) CryptDestroyKey(hKey);

// Destroy key exchange key.

if(hXchgKey != 0) CryptDestroyKey(hXchgKey);

// Release provider handle.
if(hProv != 0) CryptReleaseContext(hProv, 0);

// Close source file.
if(hSource != NULL) fclose(hSource);

// Close destination file.
if(hDest != NULL) fclose(hDest);



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Шифровальный Пример



Этот пример читает данные из текстового файла (test1.txt), кодирует это используя блочное шифр RC2 и выписывает закодированные данные в другой файл (test1.xxx). Произвольная сеансовая клавиша сгенерирована, чтобы выполнять шифрование и быть загружен в выходной файл вместе с закодированными данными. Отметьте, что эта сеансовая клавиша закодирована нашей собственной общественной ключевой биржевой клавишей функцией CryptExportKey.

#include

ФАЙЛ *hSource = НЕДЕЙСТВИТЕЛЬНЫЙ;
ФАЙЛ *hDest = НЕДЕЙСТВИТЕЛЬНЫЙ;
int eof = 0;

HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTKEY hXchgKey = 0;

#define BLOCK_SIZE 160
#define BUFFER_SIZE (BLOCK_SIZE+16) // Давать буферу 16 байтов дополнительного // места для заполнения, и т.п..
БАЙТ pbBuffer[BUFFER_SIZE];
DWORD dwCount;

БАЙТ *pbKeyBlob = НЕДЕЙСТВИТЕЛЬНЫЙ;
DWORD dwBlobLen;

// Открытый исходный файл.
если((hSource=fopen("test1.txt","rb"))==NULL) { printf("Error, открывающий источник file!\n");

goto сделанным;
}

// Открытый файл расположения.
если((hDest=fopen("test1.xxx","wb"))==NULL) { printf("Error, открывающий расположение file!\n");
goto сделанным;
}

// Получите ручку по умолчанию поставщику.
если(!CryptAcquireContext(&hProv, НЕДЕЙСТВИТЕЛЬНЫЙ, НЕДЕЙСТВИТЕЛЬНЫЙ, PROV_RSA_FULL, 0)) { printf("Error %x в течение CryptAcquireContext!\n", GetLastError());
goto сделанным;
}

// Получите ручку на ключевую биржевую клавишу.
если(!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hXchgKey)) { printf("Error %x В ТЕЧЕНИЕ CryptGetUserKey!\n", GetLastError());

goto сделанным;
}

// Создайте произвольную сеансовую клавишу блочного шифра.
если(!CryptGenKey(hProv, CALG_RC2, CRYPT_EXPORTABLE, &hKey)) { printf("Error %x В ТЕЧЕНИЕ CryptGenKey!\n", GetLastError());
goto сделанным;
}

// Определите размер ключевой капли и распределяйте память.
если(!CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, НЕДЕЙСТВИТЕЛЬНЫЙ, &dwBlobLen)) { printf("Error %x обрабатывая каплю length!\n", GetLastError());
goto сделанным;
}
если((pbKeyBlob = malloc(dwBlobLen)) == НЕДЕЙСТВИТЕЛЬНЫЙ) { printf("Out memory!\n");

goto сделанным;
}

// Экспортируйте клавишу в простую ключевую каплю.
если(!CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob, &dwBlobLen)) { printf("Error %x В ТЕЧЕНИЕ CryptExportKey!\n", GetLastError());
свободный(pbKeyBlob);
goto сделанным;
}

// Запишите размер ключевой капли в файл расположения.
fwrite(&dwBlobLen, sizeof(DWORD), 1, hDest);
если(ferror(hDest)) { printf("Error, пишущий header!\n");
свободный(pbKeyBlob);
goto сделанным;
}

// Запишите ключевую каплю в файл расположения.

fwrite(pbKeyBlob, 1, dwBlobLen, hDest);
если(ferror(hDest)) { printf("Error, пишущий header!\n");
свободный(pbKeyBlob);
goto сделанным;
}

// Свободная память.
свободный(pbKeyBlob);

// Закодируйте исходный файл и записывайтесь в файл расположения.
сделайте {
// Прочитанное вплоть до байтов BLOCK_SIZE из исходного файла.
dwCount = fread(pbBuffer, 1, BLOCK_SIZE, hSource);
если(ferror(hSource)) { printf("Error, читающий data!\n");
goto сделанным;
}
eof=feof(hSource);

// Закодируйте данные

если(!CryptEncrypt(hKey, 0, eof, 0, pbBuffer, &dwCount, BUFFER_SIZE)) { printf("Error %x В ТЕЧЕНИЕ CryptEncrypt!\n", GetLastError());
goto сделанным;
}

// Запишите данные в файл расположения.
fwrite(pbBuffer, 1, dwCount, hDest);
если(ferror(hDest)) { printf("Error, пишущий data!\n");
goto сделанным;
}
} пока(!feof(hSource));

сделанным:

// Уничтожьте сеансовую клавишу.
если(hKey != 0) CryptDestroyKey(hKey);

// Уничтожьте ключевую биржевую клавишу.

если(hXchgKey != 0) CryptDestroyKey(hXchgKey);

// Ручка поставщика Версии.
если(hProv != 0) CryptReleaseContext(hProv, 0);

// Закрытый исходный файл.
если(hSource != НЕДЕЙСТВИТЕЛЬНЫЙ), fclose(hSource);

// Закрытый файл расположения.
если(hDest != НЕДЕЙСТВИТЕЛЬНЫЙ), fclose(hDest);



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz