Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Шифрование


Автор: polin11 6.6.2015, 16:29
Нашел исходник для шифрования строки при помощи сэссионного ключа.
Код

#include "stdafx.h"
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
HCRYPTPROV hProv;
HCRYPTKEY hSessionKey;

// Получение контекста криптопровайдера
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
{
    std::cout<<"CryptAcquireContext" <<std::endl;;
}

std::cout << "Cryptographic provider initialized" << std::endl;

// Генерация сессионного ключа
if (!CryptGenKey(hProv, CALG_RC4, CRYPT_ENCRYPT | CRYPT_DECRYPT, &hSessionKey))
{
    std::cout<<"CryptGenKey" <<std::endl;;
}

std::cout << "Session key generated" << std::endl;

// Данные для шифрования
char string[]="Test";
DWORD count=strlen(string);

// Шифрование данных
if (!CryptEncrypt(hSessionKey, 0, true, 0, (BYTE*)string, 
    &count, strlen(string)))
{
    std::cout<<"CryptEncrypt" <<std::endl;
    std::cout << "Encrypted string1: " << string << std::endl;
}

std::cout << "Encryption completed" << std::endl;

// Тестовый вывод на экран
std::cout << "Encrypted string2: " << string << std::endl;    


int n;
std::cin>>n;
return 0;
}


Пробовал на visual studio 2010, с++ bulder 6. Не шифрует строку Test, кто знает почему
Вывод:
Cryptographic provider initialize
CryptGenKey
Session key generated
CryptEncrypt
Encrypted string1: Test
Encryption completed
Encrypted string2: Test



Автор: feodorv 6.6.2015, 23:07
Цитата(polin11 @  6.6.2015,  16:29 Найти цитируемый пост)
кто знает почему

Посмотрите на описание криптографических функций. Например, CryptGenKey:
Цитата

BOOL WINAPI CryptGenKey(...);

Если Ваш код
Цитата(polin11 @  6.6.2015,  16:29 Найти цитируемый пост)

if (!CryptGenKey(hProv, CALG_RC4, CRYPT_ENCRYPT | CRYPT_DECRYPT, &hSessionKey))
{
    std::cout<<"CryptGenKey" <<std::endl;;
}

при исполнении выдаёт на экран
Цитата(polin11 @  6.6.2015,  16:29 Найти цитируемый пост)
CryptGenKey

то вызов CryptGenKey вернул FALSE, и ключ не был сгенерирован.

Автор: polin11 7.6.2015, 09:01
Спасибо за информацию, но я хотел бы узнать, почему не выполняются функции 
CryptGenKey() и CryptEncrypt().

Автор: feodorv 7.6.2015, 13:38
Цитата(polin11 @  7.6.2015,  09:01 Найти цитируемый пост)
но я хотел бы узнать, почему не выполняются функции

Для этого нужно проделать совершенно несложную исследовательскую работу.

Если функция Windows API вернула FALSE, то посмотрим на код ошибки, которую она вернула. Как узнать код ошибки? https://msdn.microsoft.com/en-us/library/windows/desktop/aa379941%28v=vs.85%29.aspx в описании функции CryptGenKey (первой, давшей сбой) и находим:
Цитата
Return value

Returns nonzero if successful or zero otherwise.

For extended error information, call GetLastError.
Следовательно, вызвав GetLastError() (к которому в паре вполне можно вызвать FormatMessage()), узнаём код ошибки. 

Какой код ошибки у Вас будет, я не знаю, но скорее всего что-то вроде ERROR_INVALID_PARAMETER, потому что при внимательном чтении мануала по CryptGenKey никаких применяемых к нему флагов CRYPT_ENCRYPT и CRYPT_DECRYPT обнаружено не было. Заменив соответствующий аргумент на 0, получаем работающую программу smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)