![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
frying |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 17.10.2011 Репутация: нет Всего: нет |
Доброго времени суток!
Проблема такая: почему-то зашифрованные данные ничем не отличаются от исходных. В чём ошибка не понятно.
Проверялось на Visual C++. |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
А это что такое:
Почему strlen? Как это вообще могло работать??? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
в принципе, могло бы: а вот здесь, думаю есть ошибка: CryptEncrypt возвращает чсисло зашифрованных байт в count3, так что если там 0, вполне возможно, что данные на выходе остались неизменными, наверное, что-то не так с логикой: флаги, порядок вызовов API и т.п. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
frying |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 17.10.2011 Репутация: нет Всего: нет |
Попробовал сделать так:
На экране всё время выводится 8. Насчёт флагов - ведь там сейчас всего один действующий flag, который показывает последний блок из файла или нет будет передан. |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
флаг тут может быть только 0 либо CRYPT_OAEP, ничего другого быть не должно, а последний параметр должен принимать размер буфера buf3 в байтах, ни где не вижу, чтобы он был распределен на 40 байт, чтобы определить необходимый размер буфера, который требуется выделить для CryptEncrypt, необходимо вызвать его с pbData=NULL, тогда размер буфера будет возвращен в параметре pdwDataLen документация: http://msdn.microsoft.com/en-us/library/wi...4(v=vs.85).aspx -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Я, в сущности, к тому, что CryptEncrypt и принимает число приготовленных байт для шифрования тоже в count3, а если там 0? Вот сколько байт считано из файла: вот столько и надо определять в count3:
на каждом шаге цикла чтения из файла. +1 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
frying |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 17.10.2011 Репутация: нет Всего: нет |
GremlinProg, флаг нужен, в спецификации он называется Final.
Пробую получить размер буфера:
Но pdwDataLen всегда 0. Почему? |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
извиняюсь ![]() -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
А чем оно инициализируется?
Скорее всего, там 0, что в купе с true даёт 0 в pdwDataLen... Добавлено через 3 минуты и 47 секунд
Кстати, переменную лучше назвать как dwDataLen, так как p... намекает на указатель ![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
frying |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 17.10.2011 Репутация: нет Всего: нет |
feodorv спасибо за совет, но я думал, что если dwDataLen будет всё равно инициализироваться в функции, зачем задавать начальное значение. Сейчас, если инициализирую нулём, то функция с флагом final = true даёт значение 8, если же final = false, то значение 0.
Посмотрите, пожалуйста, переделанный код
Несколько блоков отрабатывают нормально, потом выбрасывается 234 ошибка cryptencrypt. Скажите в чём ошибка. |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Нет, нет. Если в CryptEncrypt dwBufLen означает доступный размер буфера, то dwDataLen - число байт в буфере, которые нужно закриптовать. Дело в том, что для потоковых алгоритмов шифрование идёт байт в байт (хотя и в этом случае в конце в хвост зашифрованным данным могут быть записаны дополнительные байты), для блоковых (а CALG_RC2 - это блоковый алгоритм) шифрование осуществляется блоками бит (в Вашем случае - по 64 бита), поэтому если на входе будет, скажем, 2 байта, то на выходе уже 8! Соответственно, в этом случае до вызова CryptEncrypt устанавливаем dwDataLen в 2, а после вызова получаем значение 8. То есть dwDataLen - это аргумент функции, который как передаёт значение в функцию при её вызове, так и получает возвращаемое значение из функции. Поэтому dwDataLen нужно (правильно!) инициализировать до вызова CryptEncrypt Код посмотрю, но попозже... Кстати, CryptAcquireContext в начале программы Вы делаете, а CryptReleaseContext в конце - нет. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Основное, что я вижу не так, это одновременное шифрование-дешифрование. Это очень плохо.
Во-первых, в общем случае, состояние ключа может зависеть от шифруемых данных, и если мы сначала зашифруем buf1, а потом buf2, то результат может отличаться от того, который получен, если сначала зашифровать buf2, а потом buf1. То же с одновременным шифрованием-дешифрованием: состояние ключа в случае
может отличаться от того, который получим при
В результате мы не сможем правильно дешифровать данные. У Вас всё ещё хуже: Вы два раза подряд запрашиваете функции шифрования с finish, равной TRUE. При первом TRUE ключ уже невозвратимо искажается:
При втором TRUE ключ переиницилизирован, и CryptDecrypt дешифрует неизвестно что... То есть: надо сначала (непрерывно) всё закриптовать (до финального TRUE) и уже потом всё разкриптовать (то же до финального TRUE). Добавлено @ 18:28 Кстати:
Это сообщение отредактировал(а) feodorv - 4.5.2012, 19:45 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Есть небольшая тонкость: при финализировании данных, выровненных по границе блока, CryptEncrypt в конец буфера добавляет дополнительный блок в 8 байт. То есть буфер требуется большей длины (на те самые 8 байт). То есть:
Но вообще, логику программы стоит переделать... Это сообщение отредактировал(а) feodorv - 4.5.2012, 19:47 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
frying |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 17.10.2011 Репутация: нет Всего: нет |
feodorv, большое спасибо за развёрнутый ответ.
Сделал сейчас по-другому: просто весь текст передаю одним блоком и шифрую. Основная моя ошибка была в том, что
Т.е. для шифрованного теста буфер должен изначально подходить. Это сообщение отредактировал(а) GremlinProg - 10.5.2012, 07:13 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |