Можно ли зашифровать закрытым ключом с помощью .net RSACryptoServiceProvider?

Я знаю, что RSACryptoServiceProvider может шифровать с помощью открытого ключа, а затем его можно расшифровать с помощью закрытого ключа.

Можно ли зашифровать закрытым ключом и расшифровать открытым ключом с помощью RSACryptoServiceProvider?


person guaike    schedule 25.07.2009    source источник
comment
Шифрование закрытым ключом не является допустимой криптографической операцией. Если вы пытаетесь выполнить эту операцию, обычно вам нужна Схема подписи с восстановлением.   -  person jww    schedule 25.02.2017


Ответы (9)


Нет. Шифрование с открытым / закрытым ключом работает не так. Вы можете зашифровать только открытым ключом и расшифровать только закрытым ключом.

Если вы хотите применить закрытый ключ к сообщению, возможно, вам нужна подпись. , а не шифрование? Это другая криптографическая схема, которая также может использовать ключи RSA.

person blowdart    schedule 25.07.2009
comment
Спасибо! Я хочу указать серийный номер для защиты своего программного обеспечения, если RSA не может зашифровать с помощью закрытого ключа, как сделать другим способом? - person guaike; 25.07.2009
comment
На самом деле, шифрование с помощью закрытого ключа может иметь свое применение. Вы можете зашифровать и опубликовать что-то, а публика может расшифровать сообщение с помощью вашего открытого ключа, зная, что зашифрованный файл пришел от вас. Он работает как элементарная форма подписи / аутентификации. Старый PGP на основе dos позволял это. - person CraigTP; 25.07.2009
comment
Крейг, ты говоришь о подписании, а это совсем другое дело. Подпись - это не шифрование (хотя это криптография). Даже в этом случае подпись может быть сгенерирована только с помощью закрытого ключа, но проверена с помощью открытого. - person blowdart; 25.07.2009
comment
Guakie, если вы хотите сделать это с помощью шифрования, попросите клиентское программное обеспечение сгенерировать собственную пару ключей RSA. Затем в рамках регистрации он отправляет вам открытый ключ, и вы зашифровываете серийный номер этого клиента против него. Таким образом, только этот клиент сможет его расшифровать. - person blowdart; 25.07.2009
comment
Привет, дурачок, спасибо за ответ. Это мне очень помогло. Кстати, если я использую закрытый ключ в лицензии на создание подписи на стороне сервера, а клиент использует publicKey, проверьте его, это безопасно? - person guaike; 25.07.2009
comment
Это действительно зависит от того, чем вы хотите заниматься. Если все, что вам нужно, это выдача лицензионных ключей с подписью, это нормально. Если вы хотите зашифровать лицензионный ключ для конкретного клиента, вам следует подписать его закрытым ключом на сервере и предоставить открытый ключ, чтобы можно было проверить подпись. - person blowdart; 25.07.2009
comment
Чтобы прояснить ситуацию, если вы используете RSA, математически да, вы можете зашифровать своим закрытым ключом, который может быть расшифрован только открытым ключом. Однако с точки зрения рабочего процесса это обычно не имеет особого смысла (за исключением конкретного случая использования как части создания цифровой подписи). - person Lie Ryan; 17.06.2015
comment
Этот ответ кажется вводящим в заблуждение ... задаваемый вопрос: можно это сделать (это вопрос, который у меня был), и этот ответ начинается с Нет, когда на самом деле это возможно (хотя, как указано, почему вы хотел бы сделать это другой вопрос) - person davidhood2; 14.05.2017
comment
@ davidhood2 Нет, это правильный ответ. Конечно, можно применить возведение в степень RSA с закрытым ключом, но тогда то, что вы делаете, не является шифрованием. - person Gilles 'SO- stop being evil'; 23.05.2019

Просто чтобы немного прояснить ситуацию:

RSA может использоваться либо для шифрования (гарантируя, что Ева не может читать сообщения, которые Алиса отправляет Бобу), либо для подписи (гарантируя, что, если Алиса отправит сообщение Бобу, Боб знает, что на самом деле это Алиса отправила сообщение, а не Ева притворяется быть Алисой)

RSA генерирует пару ключей - открытый ключ и закрытый ключ. RSA разработан таким образом, что если вы примените открытый ключ, а затем примените закрытый ключ, или наоборот, вы получите то же сообщение обратно. И открытый ключ может быть получен из закрытого ключа, но обратное невозможно.

Чтобы использовать RSA для шифрования, Алиса шифрует сообщение, используя открытый ключ Боба. Единственный способ прочитать это сообщение - использовать закрытый ключ Боба, который есть только у него. Таким образом, Ева не может прочитать сообщение, потому что у него нет этого ключа. С другой стороны, это не обеспечивает аутентификации источника сообщения. Ева также может получить открытый ключ Боба (поскольку он общедоступен) и отправить сообщение Бобу, выдавая себя за Алису.

Чтобы использовать RSA для подписи, Алиса берет хэш сообщения, шифрует его, используя свой собственный закрытый ключ, и добавляет результат (это подпись) к сообщению. Ева, конечно, все еще может расшифровать это, используя открытый ключ Алисы. Однако Боб может расшифровать подпись, используя открытый ключ Алисы, и посмотреть, совпадает ли она. Если это так, значит, он должен быть зашифрован с использованием закрытого ключа Алисы, который есть только у нее, поэтому он должен быть получен от Алисы.


Я не знаком с API криптографии .NET, поэтому не уверен, работает ли он именно так, как описано здесь. Но это объяснение может помочь вам понять некоторые ответы, которые вы получаете.

person Alex319    schedule 27.07.2009
comment
Что вы имеете в виду, говоря «применить открытый ключ, а затем применить закрытый ключ», или наоборот? Что здесь значит «применить»? - person WarLord; 03.10.2017
comment
Что произойдет, если Алиса зашифрует само сообщение вместо хеша? Разве это не было бы проще, или в этом есть недостаток безопасности? Я говорю, конечно, о подписи, а не о шифровании. - person Maciej Krawczyk; 17.11.2017
comment
Nitpick - RSA не гарантирует, что открытый ключ не может быть получен из закрытого ключа. На самом деле, это часто бывает тривиально. См. этот ответ. - person GregRos; 19.03.2018
comment
@MaciejKrawczyk Алиса подписывает свой закрытый ключ. если она подписала сообщение вместо хеша сообщения, то Ева могла бы расшифровать подпись с помощью открытого ключа и, таким образом, получить сообщение - person Cpt. Senkfuss; 21.06.2019

РЕДАКТИРОВАТЬ: я должен предварить этот ответ, сказав, что конкретный .NET RSACyrptoServiceProvider, вероятно, не будет поддерживать это из-за «знания» культа груза о том, что это невозможно, или из-за более прагматического знания, которое редко бывает полезно на практике.

ОРИГИНАЛ:

Все, кто утверждает, что такого нет, либо не знают, как работает RSA, либо застревают в колее «подписания».

Шифрование закрытым ключом вполне возможно и имеет смысл. Да, это похоже на подписывание, но это совсем НЕ то, что большинство современных библиотек воспринимают как подписание. Для них это означает вычисление дайджеста сообщения или HMAC и шифрование с помощью закрытого ключа. Сравнивать шифрование с закрытым ключом с подписью имеет такой же смысл, как и сказать, что хранение документа в сейфе и оставление ключа без дела является заменой подписи документа.

Да, это шифрование, потому что это та же операция. Зашифрованный с закрытым ключом зашифрованный текст так же неразборчив, как и зашифрованный с открытым ключом зашифрованный текст; для расшифровки зашифрованного текста нужны оба ключа.

См. http://fringe.davesource.com/Fringe/Crypt/RSA/Algorithm.html для справки по алгоритму RSA.

person smaudet    schedule 28.05.2012
comment
Две ссылки в этом сообщении рассказывают о конкретной реализации RSA и о том, насколько надежно шифрование закрытого ключа. - person Jett; 28.01.2014
comment
Я нахожу этот ответ забавным ... Я не уверен, что не согласен с академическим сообществом криптографов и математиков. - person jww; 25.02.2017
comment
Ага, так это специфично для имплантации RSA, верно? E и D - это общедоступная / частная магия, и вам нужен только один из них для шифрования / дешифрования. Так уж получилось, что RSA включает некоторые другие данные в открытый ключ P и Q (которые также могут быть в закрытом ключе). - person therealsix; 05.01.2018
comment
«Да, это шифрование, потому что это та же операция» Нет, это НЕ шифрование, потому что это не та же операция. Модульное возведение в степень такое же, но часть заполнения отличается. Ни одна общая библиотека не предлагает шифрование с помощью закрытого ключа. Я думаю, вы делаете то, в чем обвиняете других: путаете подпись с шифрованием. - person Gilles 'SO- stop being evil'; 19.03.2019
comment
Думаю, единственное, что я сделал не так, это недостаточно внимательно прочитал вопрос @Gilles - pastebin.com/ekARXSgp - Библиотека RSACryptoProvider, вероятно, не может этого сделать, потому что MS реализовала это именно так. Но это действительно работает. Если я займусь этим, я могу предоставить реализацию на C #, но только на C. Дело в том, что это та же самая операция под капотом, а не то, что существуют непримитивные алгоритмы с имплементами, не относящимися к RSA. RSA не определяет схему заполнения или кодирования. people.csail.mit.edu/rivest/pubs/RSA78.pdf Цитируй, где это происходит. - person smaudet; 23.05.2019
comment
@jww Я не знаю, не согласен ли я с какими-либо академическими организациями. Я реализую только так, как обычно делается и указано в оригинальной академической статье. Как указывалось ранее, моя единственная ошибка с моим ответом состоит в том, что RSACryptoServiceProvider, вероятно, не дает вам достаточно базовых знаний для этого. Насколько мне известно, то, что я написал, не является неправдой, я только не согласен с некоторыми популярными глупостями. - person smaudet; 23.05.2019
comment
Шифрование закрытым ключом не является допустимой криптографической операцией. Один шифрует открытым ключом, а дешифрует частным ключом. Вернитесь к статье [uncited] и прочтите определения еще раз. Подпись будет описана аналогично тому, как обработает сообщение как экземпляр зашифрованного текста и выполнит операцию дешифрования [с закрытым ключом]. Когда люди хотят зашифровать закрытым ключом, они часто имеют в виду схему подписи с восстановлением. - person jww; 23.05.2019
comment
@blowdart получил точный ответ, но толпа в Stack Overflow не стала мудрее. Они отклонили правильный ответ, который был им вручен на серебряном блюде ... Вот что происходит на сайтах ответов разработчиков, таких как Stack Overflow. - person jww; 23.05.2019
comment
@smaudet Статья 1978 года, в которой описывается перестановка лазеек в RSA, не является полной историей RSA, которую еще не поняли. Документ, который кодифицирует RSA как механизм шифрования или подписи, - это PKCS # 1, в настоящее время версия 2.2. . Речь идет не о «культе карго» или о том, что он «редко бывает полезен», а о людях, которые понимают, что они делают, и о том факте, что применение лазейки RSA с открытым ключом является одной из частей выполнения шифрования RSA, в то время как Люк RSA с закрытым ключом - это вообще не шифрование. - person Gilles 'SO- stop being evil'; 23.05.2019
comment
@Gilles: Да, конечно, я согласен с тем, что полная история RSA намного шире. Тем не менее, операция модуля не изменилась, основная математика не изменилась (не AFAIK, последнее, что я слышал, мы были очень хороши в факторизации простых чисел, но недостаточно хороши, чтобы надежно сломать каждый ключ размером более 2048). Тем не менее, «расхожее мнение» состоит в том, что это «невозможно сделать», но, как мы говорим, планка качества разработчиков на S.O. может означать, что подробное объяснение того, что можно или нельзя делать, на самом деле не исследуется. Я думаю, что знание основ важнее реализации. - person smaudet; 23.05.2019
comment
Не то, чтобы реализация не важна для правильной работы, но чтобы создать впечатление, что это так и есть, без реального обоснования того, почему кажется просто неправильным. Выражаясь несколько вульгарно, сила тяжести 9,8 имеет место всегда, кроме тех случаев, когда это не так. - person smaudet; 23.05.2019
comment
@jww Спасибо за ссылки! Возможно, я постараюсь со временем улучшить этот ответ. Я думаю, что отчасти в голове обычного разработчика крутится слишком много определений, касающихся того, что представляет собой криптографическая операция. Я думаю, вы могли бы предоставить или указать на хорошо определенный, семантически правильный ответ в конкретной предметной области. - person smaudet; 23.05.2019
comment
@Gilles также одна часть вашего ответа, на которую я не ответил должным образом - ваше определение шифрования, означающего запутывание - да, это все еще возможно с закрытым ключом. Независимо от того, могут ли люди обычно это делать, чтобы сохранить свои данные в секрете, - это бизнес-приложение. Без использования алгоритма хеширования у вас есть возможность переходить по байтам и запускать операцию модуля для каждого байта. Никто не сможет увидеть данные, не применив к ним ваш открытый ключ. Это медленно? Конечно. Это обычное дело? Нет. Это возможно? да. - person smaudet; 23.05.2019
comment
@smaudet «Я думаю, что знание основ важнее реализации» - ну, именно так. Вы можете реализовать возведение в степень с помощью закрытого ключа. Но если вы понимаете основы, вы поймете, что это не шифрование. Однако он может быть частью операции дешифрования или подписи. Если дерево упадет в свободнопадающем ускорителе, упадет ли оно на пол? Нет, но это не значит, что можно подвесить дерево в воздухе. - person Gilles 'SO- stop being evil'; 23.05.2019
comment
@Gilles Каким образом он не зашифрован? Шифрование - это метод защиты данных путем шифрования битов файлов компьютера, чтобы они стали неразборчивыми. Байты зашифрованы, они защищены. Без открытого ключа они больше не читаются. Вы можете создать зашифрованный текст из открытого текста, применив закрытый ключ к открытому тексту. На самом деле обратная операция обратится, и открытый ключ создаст открытый текст из зашифрованного текста. Это многое продемонстрировано. - person smaudet; 23.05.2019
comment
Кроме того, это точно такая же математическая операция - поэтому, если вы не собираетесь приводить какой-то конкретный контрпример, я не могу согласиться с вашей позицией @Gilles - мне кажется, вы приняли какое-то юридическое определение или другое определение, которое не согласуется с реальность. Я полностью осведомлен о системах подписи и о том, что они из себя представляют. Обращение по модулю op - это вообще не система подписи, и я не думаю, что когда-либо утверждал, что это так. Вы можете возразить, что вам обычно не следует этого делать, и я в целом согласен, но вы не можете сказать, что вы не можете этого делать. Возможно, можно было бы использовать энтропийный аргумент. - person smaudet; 23.05.2019
comment
Я цитировал стандарт, определяющий RSA, выше. Если вы увеличиваете вход в частную экспоненту, это не шифрование, потому что все, что вам нужно сделать для восстановления оригинала, - это поднять вход в публичную экспоненту, которая не является секретной. Для обеспечения шифрования публичный показатель степени должен оставаться в секрете, но ключи RSA генерируются с фиксированным значением (см., Например, NIST SP 800-56B §6.2), обычно очень маленькое значение (65537 - чрезвычайно популярный выбор), так что публичный показатель степени известен или легко угадывается. - person Gilles 'SO- stop being evil'; 23.05.2019
comment
Позвольте нам продолжить это обсуждение в чате. - person smaudet; 24.05.2019
comment
Что касается вашей аналогии, то нет. Вы хотите, чтобы мы поверили, что для использования дерева вы должны пересадить его из леса в лес - веток, веток, листьев можно использовать во многих случаях. Вы говорите о криптосистеме RSA. Есть примитивные операции и непримитивные операции. Операция остается методом шифрования независимо от того, завершает она криптосистему или нет. - person smaudet; 24.05.2019
comment
NIST SP 800-56B или безопасность ключей не имеют отношения к тому, является ли это операцией шифрования или нет. Шифр Цезаря - это пример чрезвычайно простой системы с легко угадываемым ключом, который по-прежнему является шифрованием. - person smaudet; 24.05.2019

Выполнение необработанной операции RSA с закрытым ключом обычно называется операцией дешифрования (точно так же, как выполнение операции с открытым ключом называется операцией шифрования).

Полезно иметь доступ к этой операции - например, для реализации операции, которая не поддерживается платформой.

Операция существует: это DecryptValue -method, который определяется базовым классом RSACryptoServiceProvider: System.Security.Cryptography.RSA. К сожалению, он не поддерживается RSACryptoServiceProvider (поскольку базовый win32-api, CryptoAPI, не поддерживает его). Однако если бы вы могли заполучить другую .NET-реализацию RSA-класса, вы бы смогли это сделать.

person Rasmus Faber    schedule 25.07.2009

К счастью, нет. Однако вы можете подписать закрытым ключом и проверить подпись открытым ключом.

В то время как математика имеет смысл, когда ключевые роли меняются местами (и так работают подписи), шифрование для обеспечения конфиденциальности не имеет особого смысла, когда ключ дешифрования хорошо известен и общедоступен.

person Remus Rusanu    schedule 25.07.2009
comment
Что ж, когда математика перевернута, обратная функция займет гораздо больше времени, невероятно много времени. - person Sean A.O. Harney; 25.07.2009
comment
Под словом «перевернуть математику» я имею в виду, что математике все равно, поменялись ли в алгоритме местами e и d. Вот что делает подписывание: шифрует хеш-дайджест сообщения закрытым ключом (закрытый показатель 'd'). Очевидно, я не имел в виду, что направление вычислений можно изменить. - person Remus Rusanu; 25.07.2009

Вы можете сделать и то, и другое; зашифровать с помощью private и расшифровать с помощью public, OR, зашифровать с помощью public и расшифровать с помощью private. Вы не можете зашифровать, а затем расшифровать только закрытым ключом, и вы не можете сделать то же самое только с открытыми ключами.

Ремус пригвоздил его; шифрование с помощью закрытого ключа не имеет особого смысла, если ключ дешифрования хорошо известен и общедоступен.

Кроме того, вы можете получить открытый ключ из закрытого ключа, но не наоборот.

person Attila    schedule 21.09.2015
comment
Я нахожу этот ответ тоже забавным ... Я не уверен, что не согласен с академическим сообществом криптографов и математиков. - person jww; 25.02.2017
comment
Да, даже мне интересно, в чем смысл шифрования закрытым ключом, когда предполагается, что открытый ключ известен. Если только открытый ключ (даже если) не назван 'public; на самом деле не публикуется для всех, а только для заинтересованной стороны. - person Binita Bharati; 24.07.2017

Это то, что я понимаю в подписи RSA.

псевдокод:

Сначала Алиса поставила подпись:

alice_signature = encrypt(alice_message, alice_private_key)

Затем Боб Ева ... (любой, у кого есть alice_public_key) проверьте подпись:

decrypted_message = decrypt(alice_signature, alice_public_key)

Подтвердить:

if(received_message_from_alice == decrypted_message)
  the signature proved the message is from alice
person JustWe    schedule 10.07.2019

Вы можете как зашифровать, так и расшифровать с помощью PrivateKey. Факты PrivateKey содержат как PrivateKey, так и PublicKey.

По крайней мере теоретически вы можете зашифровать с помощью PublicKey и расшифровать с помощью PrivateKey и наоборот. В VB.net я вижу, что первый случай работает, а второй выдает ошибку BadKey

person user1770145    schedule 18.03.2015
comment
Мне нужно зашифровать с помощью PrivateKey и расшифровать с помощью PublicKey. После одного дня неудачных попыток я понял, что RSACryptoServiceProvider.Encrypt всегда использует PublicKey, даже когда RSACryptoServiceProvider объект создается из PrivateKey. С другой стороны, я не могу использовать Sign, потому что для этого требуется алгоритм хеширования, но я хочу зашифровать данные без хеша. Другими словами, проблема в реализации .Net. - person i486; 30.06.2015

Безопасность криптосистем с открытым ключом основана на том факте, что функция sign () / encrypt () является односторонняя функция, поскольку для ее расшифровки без открытого ключа" лазейка "потребовалось бы невероятно много времени.

Кроме того, обычно сгенерированные ключи имеют разную длину, хотя могут быть. Об асимметричной длине ключа с RSA написано много.

person Sean A.O. Harney    schedule 25.07.2009