Пример программы C. Шифрование файла
В следующем примере выполняется шифрование файла данных. В примере в интерактивном режиме запрашивается имя файла, содержащего открытый текст для шифрования, и имя файла, в который должны быть записаны зашифрованные данные.
В этом примере пользователю предлагается ввести имена входных и выходных файлов. Он также запрашивает у пользователя, следует ли использовать пароль для создания ключа сеанса шифрования. Если пароль должен использоваться при шифровании данных, этот же пароль должен использоваться в программе, которая расшифровывает файл. Дополнительные сведения см. в разделе Пример программы C. Расшифровка файла.
Из-за изменения ограничений управления экспортом поставщик служб шифрования (CSP) по умолчанию и длина ключа по умолчанию могут меняться между выпусками операционной системы. Важно, чтобы при шифровании и расшифровке использовался один И тот же CSP, а длина ключа была явно задана для обеспечения взаимодействия на разных платформах операционной системы.
Асимметричное шифрование | Криптография
В этом примере используется функция MyHandleError. Код для этой функции включен в пример. Код для этой и других вспомогательных функций также указан в разделе общего назначения Функции.
// Encrypting_a_File.cpp : Defines the entry point for the console // application. // #include #include #include #include #include // Link with the Advapi32.lib file. #pragma comment (lib, «advapi32») #define KEYLENGTH 0x00800000 #define ENCRYPT_ALGORITHM CALG_RC4 #define ENCRYPT_BLOCK_SIZE 8 bool MyEncryptFile( LPTSTR szSource, LPTSTR szDestination, LPTSTR szPassword); void MyHandleError( LPTSTR psz, int nErrorNumber); int _tmain(int argc, _TCHAR* argv[]) < if(argc < 3) < _tprintf(TEXT(«Usage: «) TEXT(» | n»)); _tprintf(TEXT(» is optional.n»)); _tprintf(TEXT(«Press any key to exit.»)); _gettch(); return 1; > LPTSTR pszSource = argv[1]; LPTSTR pszDestination = argv[2]; LPTSTR pszPassword = NULL; if(argc >= 4) < pszPassword = argv[3]; >//————————————————————— // Call EncryptFile to do the actual encryption. if(MyEncryptFile(pszSource, pszDestination, pszPassword)) < _tprintf( TEXT(«Encryption of the file %s was successful. n»), pszSource); _tprintf( TEXT(«The encrypted data is in file %s.n»), pszDestination); >else < MyHandleError( TEXT(«Error encrypting file!n»), GetLastError()); >return 0; > //——————————————————————- // Code for the function MyEncryptFile called by main. //——————————————————————- // Parameters passed are: // pszSource, the name of the input, a plaintext file. // pszDestination, the name of the output, an encrypted file to be // created. // pszPassword, either NULL if a password is not to be used or the // string that is the password. bool MyEncryptFile( LPTSTR pszSourceFile, LPTSTR pszDestinationFile, LPTSTR pszPassword) < //————————————————————— // Declare and initialize local variables. bool fReturn = false; HANDLE hSourceFile = INVALID_HANDLE_VALUE; HANDLE hDestinationFile = INVALID_HANDLE_VALUE; HCRYPTPROV hCryptProv = NULL; HCRYPTKEY hKey = NULL; HCRYPTKEY hXchgKey = NULL; HCRYPTHASH hHash = NULL; PBYTE pbKeyBlob = NULL; DWORD dwKeyBlobLen; PBYTE pbBuffer = NULL; DWORD dwBlockLen; DWORD dwBufferLen; DWORD dwCount; //————————————————————— // Open the source file. hSourceFile = CreateFile( pszSourceFile, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(INVALID_HANDLE_VALUE != hSourceFile) < _tprintf( TEXT(«The source plaintext file, %s, is open. n»), pszSourceFile); >else < MyHandleError( TEXT(«Error opening source plaintext file!n»), GetLastError()); goto Exit_MyEncryptFile; >//————————————————————— // Open the destination file. hDestinationFile = CreateFile( pszDestinationFile, FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(INVALID_HANDLE_VALUE != hDestinationFile) < _tprintf( TEXT(«The destination file, %s, is open. n»), pszDestinationFile); >else < MyHandleError( TEXT(«Error opening destination file!n»), GetLastError()); goto Exit_MyEncryptFile; >//————————————————————— // Get the handle to the default provider. if(CryptAcquireContext( _tprintf( TEXT(«A cryptographic provider has been acquired. n»)); >else < MyHandleError( TEXT(«Error during CryptAcquireContext!n»), GetLastError()); goto Exit_MyEncryptFile; >//————————————————————— // Create the session key. if(!pszPassword || !pszPassword[0]) < //———————————————————— // No password was passed. // Encrypt the file with a random session key, and write the // key to a file. //———————————————————— // Create a random session key. if(CryptGenKey( hCryptProv, ENCRYPT_ALGORITHM, KEYLENGTH | CRYPT_EXPORTABLE, _tprintf(TEXT(«A session key has been created. n»)); >else < MyHandleError( TEXT(«Error during CryptGenKey. n»), GetLastError()); goto Exit_MyEncryptFile; >//———————————————————— // Get the handle to the exchange public key. if(CryptGetUserKey( hCryptProv, AT_KEYEXCHANGE, _tprintf( TEXT(«The user public key has been retrieved. n»)); >else < if(NTE_NO_KEY == GetLastError()) < // No exchange key exists. Try to create one. if(!CryptGenKey( hCryptProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, MyHandleError( TEXT(«Could not create » «a user public key.n»), GetLastError()); goto Exit_MyEncryptFile; >> else < MyHandleError( TEXT(«User public key is not available and may «) TEXT(«not exist.n»), GetLastError()); goto Exit_MyEncryptFile; >> //———————————————————— // Determine size of the key BLOB, and allocate memory. if(CryptExportKey( hKey, hXchgKey, SIMPLEBLOB, 0, NULL, _tprintf( TEXT(«The key BLOB is %d bytes long. n»), dwKeyBlobLen); >else < MyHandleError( TEXT(«Error computing BLOB length! n»), GetLastError()); goto Exit_MyEncryptFile; >if(pbKeyBlob = (BYTE *)malloc(dwKeyBlobLen)) < _tprintf( TEXT(«Memory is allocated for the key BLOB. n»)); >else < MyHandleError(TEXT(«Out of memory. n»), E_OUTOFMEMORY); goto Exit_MyEncryptFile; >//———————————————————— // Encrypt and export the session key into a simple key // BLOB. if(CryptExportKey( hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob, _tprintf(TEXT(«The key has been exported. n»)); >else < MyHandleError( TEXT(«Error during CryptExportKey!n»), GetLastError()); goto Exit_MyEncryptFile; >//———————————————————— // Release the key exchange key handle. if(hXchgKey) < if(!(CryptDestroyKey(hXchgKey))) < MyHandleError( TEXT(«Error during CryptDestroyKey.n»), GetLastError()); goto Exit_MyEncryptFile; >hXchgKey = 0; > //———————————————————— // Write the size of the key BLOB to the destination file. if(!WriteFile( hDestinationFile, dwCount, NULL)) < MyHandleError( TEXT(«Error writing header.n»), GetLastError()); goto Exit_MyEncryptFile; >else < _tprintf(TEXT(«A file header has been written. n»)); >//———————————————————— // Write the key BLOB to the destination file. if(!WriteFile( hDestinationFile, pbKeyBlob, dwKeyBlobLen, MyHandleError( TEXT(«Error writing header.n»), GetLastError()); goto Exit_MyEncryptFile; >else < _tprintf( TEXT(«The key BLOB has been written to the «) TEXT(«file. n»)); >// Free memory. free(pbKeyBlob); > else < //———————————————————— // The file will be encrypted with a session key derived // from a password. // The session key will be recreated when the file is // decrypted only if the password used to create the key is // available. //———————————————————— // Create a hash object. if(CryptCreateHash( hCryptProv, CALG_MD5, 0, 0, _tprintf(TEXT(«A hash object has been created. n»)); >else < MyHandleError( TEXT(«Error during CryptCreateHash!n»), GetLastError()); goto Exit_MyEncryptFile; >//———————————————————— // Hash the password. if(CryptHashData( hHash, (BYTE *)pszPassword, lstrlen(pszPassword), 0)) < _tprintf( TEXT(«The password has been added to the hash. n»)); >else < MyHandleError( TEXT(«Error during CryptHashData. n»), GetLastError()); goto Exit_MyEncryptFile; >//———————————————————— // Derive a session key from the hash object. if(CryptDeriveKey( hCryptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, _tprintf( TEXT(«An encryption key is derived from the «) TEXT(«password hash. n»)); >else < MyHandleError( TEXT(«Error during CryptDeriveKey!n»), GetLastError()); goto Exit_MyEncryptFile; >> //————————————————————— // The session key is now ready. If it is not a key derived from // a password, the session key encrypted with the private key // has been written to the destination file. //————————————————————— // Determine the number of bytes to encrypt at a time. // This must be a multiple of ENCRYPT_BLOCK_SIZE. // ENCRYPT_BLOCK_SIZE is set by a #define statement. dwBlockLen = 1000 — 1000 % ENCRYPT_BLOCK_SIZE; //————————————————————— // Determine the block size. If a block cipher is used, // it must have room for an extra block. if(ENCRYPT_BLOCK_SIZE > 1) < dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE; >else < dwBufferLen = dwBlockLen; >//————————————————————— // Allocate memory. if(pbBuffer = (BYTE *)malloc(dwBufferLen)) < _tprintf( TEXT(«Memory has been allocated for the buffer. n»)); >else < MyHandleError(TEXT(«Out of memory. n»), E_OUTOFMEMORY); goto Exit_MyEncryptFile; >//————————————————————— // In a do loop, encrypt the source file, // and write to the source file. bool fEOF = FALSE; do < //———————————————————— // Read up to dwBlockLen bytes from the source file. if(!ReadFile( hSourceFile, pbBuffer, dwBlockLen, MyHandleError( TEXT(«Error reading plaintext!n»), GetLastError()); goto Exit_MyEncryptFile; >if(dwCount < dwBlockLen) < fEOF = TRUE; >//———————————————————— // Encrypt data. if(!CryptEncrypt( hKey, NULL, fEOF, 0, pbBuffer, MyHandleError( TEXT(«Error during CryptEncrypt. n»), GetLastError()); goto Exit_MyEncryptFile; >//———————————————————— // Write the encrypted data to the destination file. if(!WriteFile( hDestinationFile, pbBuffer, dwCount, MyHandleError( TEXT(«Error writing ciphertext.n»), GetLastError()); goto Exit_MyEncryptFile; >//———————————————————— // End the do loop when the last block of the source file // has been read, encrypted, and written to the destination // file. > while(!fEOF); fReturn = true; Exit_MyEncryptFile: //————————————————————— // Close files. if(hSourceFile) < CloseHandle(hSourceFile); >if(hDestinationFile) < CloseHandle(hDestinationFile); >//————————————————————— // Free memory. if(pbBuffer) < free(pbBuffer); >//———————————————————— // Release the hash object. if(hHash) < if(!(CryptDestroyHash(hHash))) < MyHandleError( TEXT(«Error during CryptDestroyHash.n»), GetLastError()); >hHash = NULL; > //————————————————————— // Release the session key. if(hKey) < if(!(CryptDestroyKey(hKey))) < MyHandleError( TEXT(«Error during CryptDestroyKey!n»), GetLastError()); >> //————————————————————— // Release the provider handle. if(hCryptProv) < if(!(CryptReleaseContext(hCryptProv, 0))) < MyHandleError( TEXT(«Error during CryptReleaseContext!n»), GetLastError()); >> return fReturn; > // End Encryptfile. //——————————————————————- // 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(LPTSTR psz, int nErrorNumber)
Источник: learn.microsoft.com
Основы Шифрования за 5 минут — Asymmetric Cryptography — #ityoutubersru
Средства криптографической защиты информации (СКЗИ)
Шифрование данных и их защита от несанкционированного доступа
Выбор средств защиты
Поиск
Мнение
Алексей Булихов
Задать вопрос
Описание и назначение
Средства криптографической защиты информации (СКЗИ) — специальные устройства, службы или программы, обеспечивающие шифрование (кодирование) и расшифрование (раскодирование) информации с целью ее защиты от несанкционированной обработки, доступа и хранения при обмене ею по каналам связи, а также отвечающие за генерацию электронной подписи (ЭП).
При шифровании каждый символ документа, передаваемого по каналу связи, подлежит кодированию, а сама информация, которую необходимо защитить, подразделяется на отдельные блоки, каждый из которых заменяется кодом: буквенным, цифровым или комбинированным. Также широко используются такие методы шифрования, как перестановка, замена, аналитическое преобразование и гаммирование.
Суть работы СКЗИ состоит в том, что созданный пользователем информационный документ соединяется с файлом электронной подписи, для чего применяется собственный закрытый ключ цифровой подписи. Получатель расшифровывает полученный файл с помощью СКЗИ и собственного ключа цифровой подписи. Далее получатель убеждается в том, что в полученный файл не вносились правки и что электронная подпись цела.
Существует два вида СКЗИ. Одни встраиваются в носитель, другие устанавливаются отдельно.
Средства криптографической защиты информации, которые встраиваются в носитель, представляют собой средства кодирования, «вшитые» в систему и запрограммированные на самостоятельную работу. Примерами устройств со встроенными средствами защиты являются JaCarta SE и «Рутокен ЭЦП». При их использовании не требуются лицензия и установка сопутствующих программ.
Средства криптографической защиты информации, которые устанавливаются отдельно, — это приложения для операционной системы компьютера. При этом на одно рабочее место можно установить лишь один экземпляр ПО. Привязанность ПО к одному компьютерному устройству является существенным недостатком, поскольку для каждого нового устройства необходимо докупить лицензию. К таким СКЗИ относятся «КриптоПро CSP» (Cryptographic Service Provider), «КриптоПро JCP» (Java Cryptography Architecture), LISSI-CSP (Лисси-CSP), VipNet CSP.
Источник: www.anti-malware.ru