![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Весь листинг из примеров из rsdn. Вопрос -- почему входной файл расшифровывается тем же публичным ключом, ведь должен приватным.
|
|||
|
||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Это так выходит, когда все выполняется единоразово, а если запустить программу два раза, с отдельными действиями для шифрования и расшифровывание, то публичный ключ для расшифровывания не подойдет. Теперь экспортировал приватный ключ, но и им раскриптовать данные не удается.
Ошибка импорта 0x80090003 (NTE_BAD_KEY) Это сообщение отредактировал(а) tofreesky - 8.2.2012, 23:47 |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
tofreesky, очень перегруженная функция. Скорей всего запутались где-то в скобках.
Такой код понять трудно даже вам самому, почему вы думаете что другим будет легче? Вот наприме строки у вас очень не плохо получилось зашифровать ![]() tofreesky, поробуйте разбить функцию на несколько штук, вменяемого размера. Возможно после этого, и помощь уже не понадобится |
|||
|
||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Я же сказал что это с rsdn, тут код не большой и понятный. Так по делу есть какие-то мысли?
На 104 строке где расшифровка, ведь передаваемый приватный ключ был зашифрован сессионным, который нигде не сохранен, из-за этого и ошибка? |
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Это не так. Файл шифруется и дешифруется сессионным ключом, который является симметричным, то есть одинаковым для шифрования и дешифрования. А вот уже сам сессионный ключ шифруется публичным пользовательским ключом и дешифруется приватным. Заголовок с зашифрованным (посредством публичного пользовательского ключа) сессионным ключом прилагается к зашифрованному (посредством сессионного ключа) файлу. Также создаётся специальный файл, содержащий публичный ключ (в коде так и написано: "для обмена"). При дешифровке из репозитария ключей извлекается закрытый пользовательский ключ, им расшифровывается сессионный, а уже последним файл. Вот это странно, так как:
Это сообщение отредактировал(а) feodorv - 9.2.2012, 02:49 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Все равно ничего нового, вот немного измененный код:
GenerateKey(); генерирует приватный и публичный ключи ProcessFile(); шифрует или расшифровывает в зависимости от четвертого параметра. Так вот, теперь не выходит расшифровать файл приватным ключом, NTE_BAD_KEY при импорте. В чем дело? Он же шифруется еще и сессионым, а он ни где не сохранятся, значит его нужно сохранить и предварительно расшифровать приватный ключ? Но как? |
|||
|
||||
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Ещё раз. По оригинальному коду MS. Файл шифруется и расшифровывается симметричным сессионным ключом. Он создаётся при "encode":
Таким образом, hKey (сессионный ключ) шифруется с помощью hPubKey (открытый пользовательский ключ), и всё это записывается в виде набора байт в kb. А уже потом структура EncFileHeader вместе с зашифрованным сессионным ключом сбрасывается в выходный файл в виде заголовка этого файла, после которого будет записано шифруемое содержимое оригинального файла. Поэтому: в корне не верно:
Добавлено через 5 минут и 27 секунд И для полной картины не хватает
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Все равно не понятно почему приватным ключом не удается расшифровать файл?
tools.h
|
|||
|
||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
В общем надо забить на эту все кривую реализацию RSA у MS, на другой системе уже падает на:
Самом начале функции
С ошибкой NTE_BAD_KEYSET. Есть ли нормальные либы для RSA, только не по 25 мб, которые. |
|||
|
||||
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Прилизал немного код и перевёл в Си:
Файл нормально зашифровывается и расшифровывается, только подпись не проходит проверку, пока не разобрался, почему. Добавлено через 13 минут и 53 секунды Разобрался. Для подписи использовался приватный AT_SIGNATURE ключ, а для проверки подписи - публичный AT_KEYEXCHANGE ключ. Нестыковочка ![]() Достаточно в коде
поменять AT_SIGNATURE на AT_KEYEXCHANGE и... все работает!!! Всё, даже вариант без
![]() Это сообщение отредактировал(а) feodorv - 9.2.2012, 19:15 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Что-то я сомневаюсь, что понятный ![]() Ха, может, криво где-то в другом месте??? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Только я не пойму что нового в вашем коде, по прежнему те же изначальные проблемы, приватный ключ не расшифровывает сообщение, да и генирирование приватного ключа в вашем коде нет.
|
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Так это тот же майксрософтовский код, только сизированный ![]() А вот новое это то, что он работает. Не понял, о чём Вы. Ох... Может Вы имеете в виду, что , но никакого отношения к расшифровке файла, да ещё и приватным(!) ключом это не имеет. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Так в чем смысл, это получается симметричное шифрование, а не асимметричность, раз можно зашифровать и расшифровать одним ключом.
Добавлено через 10 минут и 13 секунд
|
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Сам файл шифруется симметричным сессионным ключом, который должен быть ещё передан вместе с зашифрованным файлом, чтобы его ещё можно было расшифровать. А вот уже сессионный ключ шифруется открытым (несимметричным) пользовательским ключом и дешифруется закрытым пользовательским. Такая схема совершенно обычна в современной криптографии. Если Вы начнёте закрытым ключом шифровать всё подряд (чтобы послать данные владельцу открытого), то опытный криптолог в конце концов сможет вычислить Ваш закрытый ключ, имея на руках множество данных. В то же время, сессионный ключ короткий (256 байт), почти случайный, существует короткое время - на сессию (то есть не повторяется), фиг выявишь какие-то закономерности в паре закрытый/открытый ключ ![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Вы вопроса не видите что ли? Все что вы говорите понятно, но так где в вашем коде приватный ключ? Одним и тем же расшифровывается.
|
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Гм. По-моему, так это Вы ответа не видите. А ещё говорите понятный код(((( Код не мой. А приватный ключ получаем через вызов CryptGetUserKey. Добавлено через 42 секунды Им расшифровывается сессионный ключ. Добавлено через 5 минут и 3 секунды То, что Вы нагородили с "key_pub.rsa" и "key_prv.rsa" - совершенно неверно, так как в случае дешифровки публичный ключ нужен только для проверки подписи. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Там мне нужно одним ключом(публичным) шифровать, а приватным расшифровывать. Обычная схема. Только в вашем(моем) коде используется один ключ для всего. А мне нужно два отдельных.
|
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Да нет же. Используются и открытый, и приватный ключи.
Так не делают. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
tofreesky |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Где же? Видно что экспортируется публичный ключ.
Лол. А как делают? Извините, но, вы вообще о асимметричной криптографии не слышали походу.... Добавлено через 2 минуты и 15 секунд Ассиметричное шифрование (криптография с открытым ключом) - асимметричная схема, в которой применяются пары ключей: открытый ключ (public key), который зашифровывает данные, и соответствующий ему закрытый ключ (private key), который их расшифровывает. Открытый ключ можно распространить хоть по всему миру, в то время как закрытый держится в тайне. Любой человек с копией открытого ключа может зашифровать информацию, которую сможет прочитать только владелец закрытого ключа. Кто угодно. Даже люди, с которыми вы прежде никогда не встречались. |
||||
|
|||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Так можно, но так не делают:
Использование Crypto API Поражён Вашими знаниями ![]() Мдя. Экспортируется публичный ключ "для обмена". Это значит, что Вы можете файл с незашифрованным публичным ключом перенести на другую инсталляцияю ОС и с помощью него зашифровывать данные, которые может расшифровать только владелец приватного ключа. Но не "им зашифровывать", а "с помощью него зашифровывать", так как схема более изощрённая. Экспорт приватного ключа для расшифровки данных не имеет смысла. Схема зашифровки файла:
Схема расшифровки файла:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Откуда его берут? |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Как откуда??? Из локального контейнера ключей! Как Вы думаете, что кроме всего делает функция CryptAcquireContext?
Если контейнера ключей с именем, совпадающим с именем текущего пользователя (второй аргумент функции - NULL), не существует, то создадим его (на что указывает флаг CRYPT_NEWKEYSET). Если задать флаг CRYPT_DELETEKEYSET, то можно удалить этот контейнер. Именно в этом контейнере хранятся пары открытый/закрытый ключ (AT_KEYEXCHANGE или AT_SIGNATURE). -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Не поленился воспользоваться советом volatile:
Ну и немного изменил код, убив всякое упоминание о "key.rsa". Генерация ключей
Шифрование файла
Дешифрование файла
Заголовочный файл utils.h
Код рабочий, хотя я и мог где-нибудь напортачить))) Как видно, при шифровании и дешифровании файла вызывается одна и та же функция CryptGetUserKey( hProv, AT_KEYEXCHANGE, &hPubKey или &hPrivKey), в реальности возвращающая сразу пару ключей. В зависимости от функции используется либо открытый, либо закрытый ключ. В MS-коде просто подчеркнули использование публичного ключа для шифрования, чтобы не было никаких сомнений, а вот использование приватного ключа не столь очевидно. ![]() Это сообщение отредактировал(а) feodorv - 10.2.2012, 00:58 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Так, сугубо для уточнения - этой программой (и с закрытым ключем) вы сможете расшифровать файл только на той машине, где его шифровали. Если же вам нужно расшифровывать его на другой машине, то туда нужно будет перенести этот самый KEYSET (или сменить способ шифрования и обмена ключами) |
||||
|
|||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Мне не нужно хранить ключи в контейнерах, мне нужно два файла на жестком диске публичный ключ и приватный ключ.
Публичным шифровать, а приватным расшифровывать. Так видимо на криптоапи сделать невозможно. |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Что именно диктует такую необходимость? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
Как мне отдавать пользователям публичный ключ, и носить с собой программу работающую с приватным ключом?
|
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Это возможно, схему распишу немного позже. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Бр, устал бороться, экспорт работает, импорт - нет ((( Ошибка NTE_BAD_VER... Хотя вряд ли это с криптопровайдером связано)))
Экспорт:
Импорт:
Это сообщение отредактировал(а) feodorv - 28.5.2014, 18:52 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
А экспорт публичного ключа и импорт его и использование, все как в старом коде?
|
|||
|
||||
feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Хотя ошибку нашёл (в экспорте):
а нужно:
Что уж там выводилось, одному Богу известно))) Экспорт и импорт работают. Осталось проверить шифрование. Добавлено через 12 минут и 30 секунд
На своём (домашнем) компьютере выполняется "экспорт.exe", получается файл с именем mykey.rsa. На (любом) удалённом компьютере выполняется "импорт.exe" (с прилагающимся файлом mykey.rsa). И на домашнем, тоже, так как имена контейнеров я сделал разными))) Больше ничего в плане генерации ключей делать не нужно. Ключевая пара импортируется в контейнер с именем Movable2 (можно поменять в коде). Далее берутся исходники отсюда, заменяется NULL в вызовах CryptAcquireContext на "Movable2", компиляться только encrypt.exe и decrypt.exe, которыми Вы как раз шифруете и дешифруете файлы. Для постороннего человека надо написать свою утилиту экспорта только публичного ключа и шифрования им. В любом случае логику задачи нужно проработать, чтобы не запутаться, кто, что и чем шифрует))) А сама задача вполне решаема средствами CryptoAPI. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Итак: задача естественным образом разделяется на 2 части - "для себя" и "для других".
Для себя:
Для других:
Все названия условны. Примеры кода, реализующие каждую из этих программ, у Вас есть. При модификации примерного кода в рабочий нужно учесть 3-а момента:
Как-то так))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
darklight131080 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 3.7.2012 Репутация: нет Всего: нет |
Здравствуйте!!! Я только начинаю разбираться.
Если тупо сменить во всём коде 1024 на 2048 то получим 2048 bit - ключ? При компиляции вылезли такие варнинги: 1>RSADEMO.CPP(77): warning C4293: <<: отрицательное или слишком большое смещение; поведение не определено unsigned __int64 fSize = (dwSzHigh << 32) + dwSzLow; 2>RSADEMO.CPP(142): warning C4293: <<: отрицательное или слишком большое смещение; поведение не определено fEncSize = (dwSzHigh << 32) + dwSzLow - sizeof(EncFileHeader) - 1024/8; //размер зашифрованных данных Спасибо за внимание!!! P.S. Прошу не пинать сильно, а по возможности подсказать как из данных сорцев сделать 2048 и критичны ли варнинги\как их устарнить? |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
darklight131080 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 3.7.2012 Репутация: нет Всего: нет |
Кто может помочь модифицировать до 2048 bit?
Цена вопроса? ![]() Это сообщение отредактировал(а) darklight131080 - 3.7.2012, 16:24 |
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Какой именно ключ Вы хотите сделать 2048-битным: симметричный или несимметричный? Критичны. Устраняются так:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
И как все же экспортировать пару ключей?
|
|||
|
||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
???????
|
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Все коды даны. Все соображения высказаны. Вам остаётся только немного поэкспериментировать и довести задуманное до конца. ![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
tofreesky |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 9.6.2010 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) tofreesky - 17.8.2012, 18:21 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |