Как стать автором
Обновить

Комментарии 27

Вы уверены, что понимаете, что вы делаете? Функции RSA_private_encrypt и RSA_public_decrypt, несмотря на их название, работают с подписями, а не с шифрованием (с точки зрения RSA, дешифровка публичным ключом является подписью, а шифрование приватным — проверкой подписи).
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Согласен с Вами насчет непонимания автора. Фактически, исходя из логики алгоритмов ЭП, «шифруется и расшифровывается» результат необратимой функции (ХЭШ), а он, автор, пихает вместо ХЭШ-а текстовую строку… Не одобряю я такое… Это все равно, что в стиральной машине тесто месить — можно, но зачем?
Да дело не в этом. Автор пытается использовать RSA в качестве какого-то симметричного шифра, фактически не используя свойство асимметрии, и, вероятно, из-за непонимания процесса, описывает это в качестве правильного способа использования RSA.

Вот никогда не жаловался на статьи, но это теперь уже, похоже, уровень хабра 2016 года. НЛО должно быть стыдно за то, что за такую статью теперь можно инвайт получить.
Вот и добавить нечего))))) Все в точку)))))
Нда уж…
Читаешь и прям руки чешутся самому написать статью.
Но:
1) нет времени
2) а зачем? кому надо тот сам дойдет — в инете вагон и тележка примеров.
Как-то пришлось переводить один продукт с OpenSSL на SSPI.
В итоге замучившись с трансляцией заголовочных файлов из C++ на Pascal/Delphi, взяли готовый продукт.
Толи Secure Black Box, толи Internet Clever Suite — уже не помню.
Чего и другим советую, когда цена ошибки слишком велика по сравнению с ценой на эти продукты.
Развею догадки. Понимание вопроса имеется. В статье описывается способ реализации RSA от Open SSL конкретно в Delphi. Но никак не призыв того как правильно или неправильно использовать именно алгоритм RSA. Да, RSA используют для сверки подписей, ХЭШей. Но кто сказал, что не могу зашифровать, к примеру, серийный номер карты на клиенте, передать его в зашифрованном виде не сервер и только сервер может расшифровать переданные данные, если длина серийного номера удовлетворяет нужному размеру и крипто стойкости в 1024 бита мне хватает?
передать его в зашифрованном виде не сервер и только сервер может расшифровать переданные данные
В том-то и дело, что не только сервер сможет расшифровать переданные данные, а кто угодно, обладающий публичным (а не приватным!) ключом.

Как обычно работает RSA: данные шифруются публичным ключом, расшифровываются приватным. Публичный можно, скажем, вшить в программу, и в этом случае, действительно, никто не сможет расшифровать данные, даже обладая программой.

Вы же, однако, используете подписи так, словно это и есть данные: вы дешифруете открытый текст (будто это уже шифрованный текст) приватным ключом, а чтобы его расшифровать, наоборот, шифруете текст публичным ключом.

Таким образом, чтобы зашифровать текст, вам нужно вшить приватный ключ в программу, а не публичный, а получить публичный из приватного — плевое дело. И любой человек, имеющий эту програму и способный достать из нее приватный ключ (а это несложно), способен расшифровывать данные.

Так что, боюсь, вы действительно не понимаете, что делаете.
Вы в правду считаете, что я буду шифровать данные секретным ключом на клиенте и передавать их в таком виде? Если конкретно в моем случае, то с клиентом рядом идет публичный ключ, а приватный находится на сервере. В конце статьи я показал пример как «вшить» ключ в программу. Еще раз — это примеры, как туда/обратно зашифровать/расшифровать приватным/публичным ключами, на Delphi используя OpenSSL. А не то как я реализовал проект, правильно или нет. Суть статьи не в том, как правильно шифровать: вначале публичным и секретным расшифровывать или наоборот. Все зависит от задачи.
Я смог внести ясность в то, что понимаю о чем пишу?
Я вас не понимаю. Если это примеры, то почему они неправильные? Еще раз: у вас в статье шифрование осущеставляется приватным ключом, а расшифрование — публичным
Ясно. Я понял о чем Вы. Взгляните пожалуйста на Github. Утилитка, которая написана имеет 4 кнопки: Public Encrypt и для нее Private Decrypt. И отдельно Private Encrypt и для нее Public Decrypt. Для того чтоб показать: если зашифровать Публичным, то расшифровать можно только Приватным и если зашифровать Приватным, то расшифровать можно только Публичным. Конкретно в моем проекте — Публичным ключом шифруется, а Приватным расшифровывается. Я отредактирую куски, которые смущают.
Я вот тоже не понял. Зачем вы вообще показываете пример с шифрованием приватным ключом в ассиметричной системе шифрования? Тем более, раз утверждаете, что сами так не делаете.
На самом деле в полном исходном коде реализованы оба способа, как я написал в комментарии выше. Но для ясности подправил исходники и добавил комментарий.
и если зашифровать Приватным, то расшифровать можно только Публичным
Я надеюсь, вы понимаете, что публичный можно получить из приватного?

Как бы технически можно, конечно, шифровать приватным ключом (дешифровать, на самом деле) и расшифровать публичным (а тут на самом деле шифровать), но для данных это совершенно не подходит, т.к. любой, кто владеет приватным ключом, сможет совершать оба действия, вы же понимаете это?

Даже с технической точки зрения, если смотреть со стороны низкого уровня, у вас кнопки делают не то, что на них написано: Private Crypting будет на самом деле расшифровывать данные приватным ключом, а Public Decrypting наоборот, зашифровывать. Именно поэтому у вас образуется «мусор» в виде паддинга, т.к. Public Decrypting (который на самом деле Encrypting) логично считает, что на вход ему подали открытое сообщение, а у вас оно получается уже с паддингом.
Конечно же я прекрасно понимаю, что из приватного получается публичный, именно таким образом в статье я сгенерировал ключи. Мне казалось это очевидным. Вначале приватный, затем извлек публичный.
Давайте я приведу пример — когда множество клиентов по офису, которые получают сообщения от сервера, будь то настройки или еще какие либо команды. В этом случае сервер имея приватный ключ, шифрует ( по вашей терминологии расшифровывает) сообщение, для клиентов. А клиент, приняв такое сообщение успешно его расшифрует (зашифрует с ссылкой на Вас) публичным ключом и будет точно уверен, что сообщение отправил именно сервер. Поэтому пример работает в обе стороны.
Что касается мусора (это в обоих функциях decrypting публичным или приватным, в приватном точно так) — изначально для data задается размер (в моем примере 128 байт), после дешифрации в data попадает, допустим, всего 27 байт (строка маленькая), остальное место в data остается бинарным мусором. Никак не связанно с паддингом.
В статье исправил порядок функций, чтоб не было путаницы в понимании. Я не стал с самого начала описывать, что такое RSA. цель была в другом, ссылку на отличную статью я привел в конце. Видимо вкратце надо было немного написать.
Сверка подписи именно таким образом и происходит. Отправителем шифруется приватным ключом и клиент публичным ключом сверяет подпись.
Хм, ну можно так, да.
Вас видимо смутил пример с «вшитым» ключом, где как раз приватный ключ в константе, поэтому Вы решили, что с клиентом идет приватный? Публичный ключ у клиента. И он даже не вшит, всегда скачивается, потому, что в любой момент ключи могут поменяться
Уважаемый автор, у меня к Вам есть один главный вопрос и несколько второстепенных. Главный: «Зачем Вы используете криптографию, не разобравшись что к чему?»
Второстепенные: 1) «Если Вы пишете под Windows да еще используете „буржуйские“ криптоалгоритмы, то не проще ли использовать для этого нативный для Windows крипто-сервис-провайдер? Он „искаропки“ присутствует.»
2) «Если Вы заботитесь о безопасности, то почему Вам разрешили на территории РФ (из слов „по долгу службы“ я понял, что это работа под заказчика, не Ваша инициатива… хотя, „шифровать текстовые строки алгоритмом RSA“ отдают амбре профанации либо Вас, либо Вашего заказчика) использовать „буржуйские“ криптоалгоритмы? На этот вопрос можете не отвечать, если Вы разрабатывали курсовик или лабораторку для кого-то.»
Разобравшись. В статье есть дополнения. Проще мне было реализовать на openssl. По Windows крипто провайдеру тоже есть прекрасная статья с примерами реализации на Delphi. Но речь не об выборе. OpenSSL open source, а Windows крипто провайдер куда сольет данные?
Я не из РФ, кто Вам в РФ запрещает? Законы? Религия?
Видимо, не до конца разобравшись, все-таки. Разъясняю, вкратце:
1) асимметричные криптоалгоритмы, и по логике и по устоявшимся правилам и по скорости, предназначены для двух «вещей»: 1) формирование и проверка электронной подписи (там как по Вашему шифруется и расшифровывается отпечаток блока открытых данных — иными словами ХЭШ); 2) криптосхемы с открытым распределением ключей (там уже шифруется и расшифровывается (либо по Диффи-Хелману, либо по Эль-Гамалю) ключ симметричного криптоалгоритма, на котором зашифрован блок открытой информации);
2) если уж Вы решили хранить приватный ключ в коде в виде константы, то зачем Вам беспокоиться о «недокументированном поведении» дефолтного для Windows криптопровайдера?
3) в РФ разрешено использовать только отечественные криптоалгоритмы, если Вы хотите попасть под защиту законодательства РФ в сфере информационной безопасности (если Вы не из РФ, то Вам это и не нужно)…

Приношу извинения за то, что, не разобравшись, комментировал Вашу разработку с той точки зрения, что Вы находитесь в РФ и, возможно, зря обвинил Вас за «не РФ-овское» использование крипоалгоритмов (все касается только информационной безопасности в ее правовой и законодательной сфере). Так что, из всего выходит, я начал консультировать иностранного гражданина)))))

З.Ы. вот уже зазвонил сотовый без СИМ-ки и аккумулятора) наверное это «младшие братья» «вежливых людей»)))
1) Хочу привести цитату из статьи, ссылка на нее в конце топика:
Криптосистема RSA, предложенная в 1977 году Ривестом (R. Rivest), Шамиром (A. Shamir) и Адлеманом (L. Adleman), предназначена для шифрования и цифровой подписи. В настоящее время RSA является наиболее распространенной криптосистемой — стандартом де-факто для многих криптографических приложений. Криптосистема RSA широко применяется в составе различных стандартов и протоколов Интернета, включая PEM, S/MIME, PEM-MIME, S-HTTP и SSL. Т.е. необязательно для ЭЛ, хотите криптуйте секретным ключом пароль для всего остального сообщения, хотите сравнивайте ХЭШ сообщения итд.
У меня в одном из проектов клиент генерирует md5 из данных в полученной xml, расшифровывает публичным ключом подпись от сервера, тоже в md5, сравнивает. Далее после определенных действий генерирует xml в ответ, в котором содержится сгенерированный md5, зашифрованный публичным ключом. На сервере может быть аппликация с «вшитым» секретным ключом, может висеть PHP скрипт с «вшитым» секретным ключом.
2) Вопрос не о выборе, что использовать, Windows крипто провайдер, OpenSSLили отечественную разработку. Как и не вопрос на чем реализовывать. Вопрос в примере — Delphi + OpenSSL. Как написали выше примеров на Delphi не вагон и тележка, с/с++ да. На Delphi кусочки какие-то. Зашифровать только, а расшифровать?
3) Но примеры то не запрещены?

P.S. я поделился примерами как использовать RSA от OpenSSL в проектах на Delphi, звонить Вам с тапка на выключенный мобильник не буду )))
На сколько тяжелые библиотеки OpenSSL?
Во времена универа мы сами реализовывали rsa алгоритм, там довольно простой алгоритм.Насколько больше выгода от использования OpenSSL?
В области инф. безопасности лучше не изобретать велосипеды — это чревато дырами. В универе для обучения можно и писать самому такие алгоритмы, а вот в продакшине лучше использовать готовые, хорошо протестированные библиотеки/решения. Потому размер тут не главное.
Совсем забыли о Delphi, спасибо за полезную статью.
В репе есть примечание "Для компиляции в XE необходимо поменять типы у входящих параметров"… Почему нельзя использовать {$IFDEF VERXXX}?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории