Я знаю, что RSACryptoServiceProvider может шифровать с помощью открытого ключа, а затем его можно расшифровать с помощью закрытого ключа.
Можно ли зашифровать закрытым ключом и расшифровать открытым ключом с помощью RSACryptoServiceProvider?
Я знаю, что RSACryptoServiceProvider может шифровать с помощью открытого ключа, а затем его можно расшифровать с помощью закрытого ключа.
Можно ли зашифровать закрытым ключом и расшифровать открытым ключом с помощью RSACryptoServiceProvider?
Нет. Шифрование с открытым / закрытым ключом работает не так. Вы можете зашифровать только открытым ключом и расшифровать только закрытым ключом.
Если вы хотите применить закрытый ключ к сообщению, возможно, вам нужна подпись. , а не шифрование? Это другая криптографическая схема, которая также может использовать ключи RSA.
Просто чтобы немного прояснить ситуацию:
RSA может использоваться либо для шифрования (гарантируя, что Ева не может читать сообщения, которые Алиса отправляет Бобу), либо для подписи (гарантируя, что, если Алиса отправит сообщение Бобу, Боб знает, что на самом деле это Алиса отправила сообщение, а не Ева притворяется быть Алисой)
RSA генерирует пару ключей - открытый ключ и закрытый ключ. RSA разработан таким образом, что если вы примените открытый ключ, а затем примените закрытый ключ, или наоборот, вы получите то же сообщение обратно. И открытый ключ может быть получен из закрытого ключа, но обратное невозможно.
Чтобы использовать RSA для шифрования, Алиса шифрует сообщение, используя открытый ключ Боба. Единственный способ прочитать это сообщение - использовать закрытый ключ Боба, который есть только у него. Таким образом, Ева не может прочитать сообщение, потому что у него нет этого ключа. С другой стороны, это не обеспечивает аутентификации источника сообщения. Ева также может получить открытый ключ Боба (поскольку он общедоступен) и отправить сообщение Бобу, выдавая себя за Алису.
Чтобы использовать RSA для подписи, Алиса берет хэш сообщения, шифрует его, используя свой собственный закрытый ключ, и добавляет результат (это подпись) к сообщению. Ева, конечно, все еще может расшифровать это, используя открытый ключ Алисы. Однако Боб может расшифровать подпись, используя открытый ключ Алисы, и посмотреть, совпадает ли она. Если это так, значит, он должен быть зашифрован с использованием закрытого ключа Алисы, который есть только у нее, поэтому он должен быть получен от Алисы.
Я не знаком с API криптографии .NET, поэтому не уверен, работает ли он именно так, как описано здесь. Но это объяснение может помочь вам понять некоторые ответы, которые вы получаете.
РЕДАКТИРОВАТЬ: я должен предварить этот ответ, сказав, что конкретный .NET RSACyrptoServiceProvider
, вероятно, не будет поддерживать это из-за «знания» культа груза о том, что это невозможно, или из-за более прагматического знания, которое редко бывает полезно на практике.
ОРИГИНАЛ:
Все, кто утверждает, что такого нет, либо не знают, как работает RSA, либо застревают в колее «подписания».
Шифрование закрытым ключом вполне возможно и имеет смысл. Да, это похоже на подписывание, но это совсем НЕ то, что большинство современных библиотек воспринимают как подписание. Для них это означает вычисление дайджеста сообщения или HMAC и шифрование с помощью закрытого ключа. Сравнивать шифрование с закрытым ключом с подписью имеет такой же смысл, как и сказать, что хранение документа в сейфе и оставление ключа без дела является заменой подписи документа.
Да, это шифрование, потому что это та же операция. Зашифрованный с закрытым ключом зашифрованный текст так же неразборчив, как и зашифрованный с открытым ключом зашифрованный текст; для расшифровки зашифрованного текста нужны оба ключа.
См. http://fringe.davesource.com/Fringe/Crypt/RSA/Algorithm.html для справки по алгоритму RSA.
RSACryptoServiceProvider
, вероятно, не дает вам достаточно базовых знаний для этого. Насколько мне известно, то, что я написал, не является неправдой, я только не согласен с некоторыми популярными глупостями.
- person smaudet; 23.05.2019
Выполнение необработанной операции RSA с закрытым ключом обычно называется операцией дешифрования (точно так же, как выполнение операции с открытым ключом называется операцией шифрования).
Полезно иметь доступ к этой операции - например, для реализации операции, которая не поддерживается платформой.
Операция существует: это DecryptValue -method, который определяется базовым классом RSACryptoServiceProvider: System.Security.Cryptography.RSA. К сожалению, он не поддерживается RSACryptoServiceProvider (поскольку базовый win32-api, CryptoAPI, не поддерживает его). Однако если бы вы могли заполучить другую .NET-реализацию RSA-класса, вы бы смогли это сделать.
К счастью, нет. Однако вы можете подписать закрытым ключом и проверить подпись открытым ключом.
В то время как математика имеет смысл, когда ключевые роли меняются местами (и так работают подписи), шифрование для обеспечения конфиденциальности не имеет особого смысла, когда ключ дешифрования хорошо известен и общедоступен.
Вы можете сделать и то, и другое; зашифровать с помощью private и расшифровать с помощью public, OR, зашифровать с помощью public и расшифровать с помощью private. Вы не можете зашифровать, а затем расшифровать только закрытым ключом, и вы не можете сделать то же самое только с открытыми ключами.
Ремус пригвоздил его; шифрование с помощью закрытого ключа не имеет особого смысла, если ключ дешифрования хорошо известен и общедоступен.
Кроме того, вы можете получить открытый ключ из закрытого ключа, но не наоборот.
Это то, что я понимаю в подписи 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
Вы можете как зашифровать, так и расшифровать с помощью PrivateKey. Факты PrivateKey содержат как PrivateKey, так и PublicKey.
По крайней мере теоретически вы можете зашифровать с помощью PublicKey и расшифровать с помощью PrivateKey и наоборот. В VB.net я вижу, что первый случай работает, а второй выдает ошибку BadKey
RSACryptoServiceProvider.Encrypt
всегда использует PublicKey, даже когда RSACryptoServiceProvider
объект создается из PrivateKey. С другой стороны, я не могу использовать Sign
, потому что для этого требуется алгоритм хеширования, но я хочу зашифровать данные без хеша. Другими словами, проблема в реализации .Net.
- person i486; 30.06.2015
Безопасность криптосистем с открытым ключом основана на том факте, что функция sign () / encrypt () является односторонняя функция, поскольку для ее расшифровки без открытого ключа" лазейка "потребовалось бы невероятно много времени.
Кроме того, обычно сгенерированные ключи имеют разную длину, хотя могут быть. Об асимметричной длине ключа с RSA написано много.