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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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


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

Ответ 3

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

ОРИГИНАЛ:

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

Это то, что я понимаю подпись 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

Ответ 9

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

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