CryptographicException: неизвестная ошибка «80007005». при вызове RSACryptoServiceProvider.Decrypt () в .Net Compact Framework - PullRequest
1 голос
/ 02 июня 2010

Я пытаюсь использовать RSACryptoServiceProvider для шифрования / дешифрования. Шифрование работает нормально, но метод Decrypt выдает исключение с сообщением:

Неизвестная ошибка '80007005'.

Это код:

Byte[] plainData = encoding.GetBytes(plainText);
Byte[] encryptedData;
RSAParameters rsap1;
Byte[] decryptedData;
using (RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider())
{
   encryptedData = rsa1.Encrypt(plainData, false);
   rsap1 = rsa1.ExportParameters(false);
}

using (RSACryptoServiceProvider rsa2 = new RSACryptoServiceProvider())
{
   rsa2.ImportParameters(rsap1);
   decryptedData = rsa2.Decrypt(encryptedData, false);
}

decryptedText = encoding.GetString(decryptedData, 0, decryptedData.Length);

Кто-нибудь знает об обходном пути?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 02 июня 2010

При использовании RSA необходимо понимать основы управления ключами. Вы не указали, какой контейнер ключей использовать во время шифрования. Какой ключ вы ожидаете использовать? Ключ пользователя по умолчанию? Ключ машины? Вы понимаете, что пользовательский ключ по умолчанию и машинные ключи являются ? Не говоря уже о очевидном вопросе , почему вы шифруете что-нибудь с помощью RSA? Шифрование RSA используется исключительно для шифрования сеансовых ключей, и существуют специальные протоколы обмена ключами, которые заботятся об этом «из коробки» (поток, ориентированный как TLS, или документ, ориентированный как S / MIME). Вы должны использовать один из этих готовых протоколов и не использовать собственную схему шифрования. Вы испортите управление ключами, это гарантировано.

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

См:

Обратите внимание, что это просто простые примеры кода в MSDN, и они никогда не должны использоваться кем-либо без глубокого понимания криптографии и особенно управления ключами.

Я рекомендую вам использовать класс высокого уровня, такой как SslStream для шифрования обмена данными. Для схемы шифрования хранилища документов лучше использовать возможности ОС или использовать класс ProtectedData . Опять же, не сверните свое собственное шифрование, если вы действительно не знаете, что делаете (в этом случае вы не будете задавать вопросы здесь).

0 голосов
/ 02 июня 2010

Исправлен код! Я думаю, мне не нужно указывать контейнер в конце концов ...

Byte[] plainData = encoding.GetBytes(plainText);
Byte[] encryptedData;
Byte[] decryptedData;
using (RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider())
{
    RSAParameters rsap1 = rsa1.ExportParameters(false);

    using (RSACryptoServiceProvider rsa2 = new RSACryptoServiceProvider())
    {
        rsa2.ImportParameters(rsap1);
        encryptedData = rsa2.Encrypt(plainData, false);
    }

    decryptedData = rsa1.Decrypt(encryptedData, false);
}

decryptedText = encoding.GetString(decryptedData, 0, decryptedData.Length);
0 голосов
/ 02 июня 2010
rsap1 = rsa1.ExportParameters(false);

Передав значение false этому методу, вы решили не экспортировать закрытый ключ. Без закрытого ключа будет сложно расшифровать данные. Попробуйте передать true в метод экспорта.

...