Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шифрование\разшифрование файлов 
:(
    Опции темы
Alca
Дата 19.5.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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





--------------------
PM WWW ICQ Skype Jabber   Вверх
Kirgston
Дата 23.5.2009, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alca @  19.5.2009,  10:59 Найти цитируемый пост)
[MFC] CWinCrypto

Пасибки но как вы заметили тут Билдер =)

Ребята... вот нашёл статейку http://www.rsdn.ru/article/crypto/usingcryptoapi.xml
Вроде ознакомился со всем =)

Но вот у меня возникла проблемка.

Код

HCRYPTPROV hProv;
HCRYPTKEY hSessionKey;

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

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

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

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)))
{
  Error("CryptEncrypt");
  return;
}

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

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


Запускаю... и... вижу странную штуку... если консольное приложение то всё проходит на 90% ура. Но после криптовки текста ... текст выходит...выходит... а выходит он таким каким и вошёл... то есть
char string[]="Test";
std::cout << "Encryption completed" << std::endl//так же будет Тест... ничего вообще какбудто не произошло....

Потом сделал уже форменное приложение а там оно мне начало ругатся... точнее не хотело генерировать ключик. Почему - незнаю... всё сделал как было представлено в мануале. 

Может мануал не такой? =) не подходящий? =) может есть какие - либо другие? =) Заранее очень благодарен
 
PM MAIL   Вверх
xvr
Дата 23.5.2009, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Kirgston @ 23.5.2009,  09:40)
Запускаю... и... вижу странную штуку... если консольное приложение то всё проходит на 90% ура. Но после криптовки текста ... текст выходит...выходит... а выходит он таким каким и вошёл... то есть
char string[]="Test";
std::cout << "Encryption completed" << std::endl//так же будет Тест... ничего вообще какбудто не произошло....

Должно работать. Программа точно выглядит именно так? Проверки на ошибки правильные?
Цитата

Потом сделал уже форменное приложение а там оно мне начало ругатся... точнее не хотело генерировать ключик. Почему - незнаю... всё сделал как было представлено в мануале. 
Где и какие ошибки выдает?

PM MAIL   Вверх
Kirgston
Дата 23.5.2009, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну да именно так =) точнее вместо Error (ошибка) я её вывожу. Типа cout<<key gen error . 

Ну не ошибки... но скажем просто ничего не происходит. Я взял и вписал как там было if (!...) и мне выбило типа ошибка генерации ключа. То есть не программная ошибка. А просто в случае если ключ не сгенится то я вывожу что нету ключа. Так именно и вывело =) нету ключа =)
PM MAIL   Вверх
Kirgston
Дата 23.5.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот посмотрите сами... почему так я сам не знаю...


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  Crypt.rar 5,49 Kb
PM MAIL   Вверх
xvr
Дата 23.5.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Kirgston @ 23.5.2009,  22:13)
Вот посмотрите сами... почему так я сам не знаю...

Посмотрел. Правда 2009 CG у меня нет, собрал на 2006. Все работает, ключи генерит, текст шифрует.
Я вставил вместо последней строки в программе это:
Код

AnsiString acc;
for(int i=0;i<count;++i) acc.cat_printf("%02X",(unsigned char)string[i]);
RichEdit1->Lines->Add(acc);
получил 565A7594 или 3A7366B5 или 6A7BF188 и т.д.
Может какие то заморочки с Unicode'ом в CG 2009?

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


Опытный
**


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

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



хе хе ))) 

Cryptographic provider initialized
CryptGenKey Error
Session key generated
CryptEncrypt Error
Encryption completed
Encrypted string: 
54657374

каждый раз получаю одну и ту же строку =)не знаете изза чего это может быть?
PM MAIL   Вверх
xvr
Дата 24.5.2009, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Kirgston @ 23.5.2009,  23:31)
каждый раз получаю одну и ту же строку =)не знаете изза чего это может быть?

Из за этого - 
Цитата

CryptGenKey Error
CryptEncrypt Error
Добавь это 
Код

AnsiString e()
{
 char buff[1000];
 HRESULT hr=GetLastError();
 if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,hr,
               MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
               buff,1000,NULL))
  return AnsiString().sprintf("%08X: %s",hr,buff).Trim();
 return AnsiString().sprintf("%08X",hr);
}

и это перед всеми 'Error' выдачами
Код

 RichEdit1->Lines->Add(e());

Посмотрим, что за ошибки   smile 

Это сообщение отредактировал(а) xvr - 24.5.2009, 09:31
PM MAIL   Вверх
Kirgston
Дата 24.5.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Получил :

Cryptographic provider initialized
80090022: Поставщик не смог выполнить действие, поскольку контекст был получен как "тихий".
CryptGenKey Error
Session key generated
00000057: Параметр задан неверно.
CryptEncrypt Error
Encryption completed
Encrypted string: 
54657374

о_О а что такое тихий контекст? )))
PM MAIL   Вверх
Kirgston
Дата 24.5.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А да и кстати... вот в компоненте RichEdit есть 2 входящих параметра при записи\чтении в\из потока. Первый непосредственно сам поток, а второй TEncode *Encode . Что такое этот второй параметр? =) это же вроде так же крипт? Конечно я не говорю что он мне сейчас подходит, но просто стало интересно т.к. раньше даже не замечал его =)

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Kirgston @ 24.5.2009,  10:54)
Получил :

Cryptographic provider initialized
80090022: Поставщик не смог выполнить действие, поскольку контекст был получен как "тихий".
CryptGenKey Error

о_О а что такое тихий контекст? )))

Про 'тихий' контекст сказано в описании CryptAcquireContext (точнее ее параметре flags, бит CRYPT_SILENT)
Цитата

The application requests that the CSP not display any user interface (UI) for this context. If the CSP must display the UI to operate, the call fails and the NTE_SILENT_CONTEXT (собственно и есть ошибка 80090022) error code is set as the last error. In addition, if calls are made to CryptGenKey with the CRYPT_USER_PROTECTED flag with a context that has been acquired with the CRYPT_SILENT flag, the calls fail and the CSP sets NTE_SILENT_CONTEXT.

CRYPT_SILENT is intended for use with applications for which the UI cannot be displayed by the CSP.
У тебя его нет, а есть только CRYPT_VERIFYCONTEXT, но кто знает, попробуй и его убрать  smile 

Цитата

А да и кстати... вот в компоненте RichEdit есть 2 входящих параметра при записи\чтении в\из потока. Первый непосредственно сам поток, а второй TEncode *Encode . Что такое этот второй параметр? =) это же вроде так же крипт?
Это не крипт. Это преобразователь формата (например из plain text в RTF) В теории, если задать необходимый преобразователь, то в RichText можно будет загрузить что угодно, например HTML страницу  smile

Добавлено через 11 минут и 18 секунд
Нашел ошибку - в CryptGenKey параметры CRYPT_ENCRYPT и CRYPT_DECRYPT заданны не верно, они вообще для другой функции. Для CryptGenKey они соответствуют CRYPT_EXPORTABLE и CRYPT_USER_PROTECTED 
Для последнего написано:
Цитата

If this flag is set, the user is notified through a dialog box or another method when certain actions are attempting to use this key. The precise behavior is specified by the CSP being used.If the provider context was opened with the CRYPT_SILENT flag set, using this flag causes a failure and the last error is set to NTE_SILENT_CONTEXT.
Еще есть опция CRYPT_FORCE_KEY_PROTECTION_HIGH, для нее написано:
Цитата

This flag specifies strong key protection. When this flag is set, the user is prompted to enter a password for the key when the key is created. The user will be prompted to enter the password whenever this key is used.

This flag is only used by the CSPs that are provided by Microsoft. Third party CSPs will define their own behavior for strong key protection.

Specifying this flag causes the same result as calling this function with the CRYPT_USER_PROTECTED flag when strong key protection is specified in the system registry.

If this flag is specified and the provider handle in the hProv parameter was created by using the CRYPT_VERIFYCONTEXT or CRYPT_SILENT flag, this function will set the last error to NTE_SILENT_CONTEXT and return zero.
Подай 0 вместо них

PM MAIL   Вверх
yudinetz
Дата 26.8.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



так все-таки, если провайдер просит гуи интерфейс, то что делать-то? 
у меня консольное приложение, функция CryptAcquireContext вылетает с ошибкой этого тихого контекста.
PM MAIL   Вверх
xvr
Дата 28.8.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Читать мой предыдущий ответ - от 'Добавлено через 11 минут и 18 секунд' и далее

PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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