Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шифрование, Шифрование 
:(
    Опции темы
polin11
Дата 6.6.2015, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 6.6.2015

Репутация: нет
Всего: нет



Нашел исходник для шифрования строки при помощи сэссионного ключа.
Код

#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



PM MAIL   Вверх
feodorv
Дата 6.6.2015, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(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, и ключ не был сгенерирован.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
polin11
Дата 7.6.2015, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 6.6.2015

Репутация: нет
Всего: нет



Спасибо за информацию, но я хотел бы узнать, почему не выполняются функции 
CryptGenKey() и CryptEncrypt().
PM MAIL   Вверх
feodorv
Дата 7.6.2015, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



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

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

Если функция Windows API вернула FALSE, то посмотрим на код ошибки, которую она вернула. Как узнать код ошибки? Идем в описании функции 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 

Это сообщение отредактировал(а) feodorv - 7.6.2015, 13:46


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1992 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.