Как расшифровать зашифрованный текст с помощью RSACryptoServiceProvider? - PullRequest
3 голосов
/ 20 июля 2011

Я зашифровал текст с помощью RSACryptoServiceProvider. Я экспортировал открытый и закрытый ключи. Очевидно, я просто хочу открыть открытый ключ внутри приложения декодера, поэтому я написал код следующим образом:

private const string PublicKey = "<RSAKeyValue><Modulus>sIzQmj4vqK0QPd7RXKigD7Oi4GKPwvIPoiUyiKJMGP0qcbUkRPioe2psE/d3c1a2NY9oj4Da2y1qetjvKKFad2QAhXuql/gPIb1WmI+f6q555GClvHWEjrJrD/ho7SLoHbWd6oY6fY609N28lWJUYO97RLVaeg2jfNAUSu5bGC8=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

private string Decrypt()
        {
            byte[] encryptedKeyAsBytes = Convert.FromBase64String(_encryptedKey);
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(PublicKey);
            // read ciphertext, decrypt it to plaintext
            byte[] plainBytes = rsa.Decrypt(encryptedKeyAsBytes, false);
            string plainText = System.Text.Encoding.ASCII.GetString(plainBytes);

            return plainText;
        }

Но в строке выдается исключение "byte [] plainBytes = rsa.Decrypt (encryptedKeyAsBytes, false);" и говорит "Ключ не существует". Однако, если я открою весь закрытый и открытый ключ, он будет счастлив. Так как же мне расшифровать данные, используя только информацию открытого ключа?

Ответы [ 3 ]

6 голосов
/ 20 июля 2011

Вы не можете - это точка шифрования с открытым / закрытым ключом. Общественность делает шифрование; частный делает расшифровку.

Похоже, вам нужен какой-то шаблон обмена ключами. Например; если ваше приложение декодера пытается расшифровать информацию из другого источника данных (Source Application), я бы реализовал что-то вроде этого:

  1. Исходное приложение генерирует симметричный ключ, как AES.
  2. Приложение Decoder создает пару открытого и закрытого ключей.
  3. Исходное приложение запрашивает у приложения декодера открытый ключ.
  4. Исходное приложение шифрует симметричный ключ с помощью открытого ключа и отправляет его обратно в приложение декодера.
  5. Приложение декодера использует закрытый ключ для расшифровки симметричного ключа.
  6. Приложение декодера получает данные, зашифрованные с помощью симметричного ключа, из исходного приложения.
  7. Приложение декодера использует обмененный симметричный ключ для расшифровки полученной информации.

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

5 голосов
/ 20 июля 2011

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

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

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

2 голосов
/ 30 августа 2016

Проблема в том, что вы путаете шифрование и подпись.

Шифрование - это когда каждый может написать сообщение, но только владелец личного ключа может прочитать Это.Во время подписи каждый может прочитать сообщение, но только владелец личного ключа может написать его.

Когда вы вызываете Decrypt, RSACryptoServiceProvider ищет шифрование , то есть публичное чтение с приватным чтением.Таким образом, он ищет закрытый ключ.

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

...