2009-08-29 4 views
2

Мой сервер создает RSACryptoServiceProvider и экспортирует его параметры в переменную (RSAKeyInfo).Как дешифровать данные RSA в C# .NET соответственно?

Затем открытый ключ отправляется клиенту, а клиент шифрует что-то с этим открытым ключом.

Теперь мне нужно иметь возможность расшифровать эти данные при отправке обратно на сервер - следовательно, RSA полезен в моем случае.

Однако при попытке воссоздать RSACryptoServiceProvider с импортированными параметрами из первого созданного ранее RSACryptoServiceProvider я получаю исключение «Плохие данные».

... Код может быть яснее.

Создание криптографии:

class Cryptograph 
{ 
    public Cryptograph() 
    { 
     this.RSAKeyInfo = new RSACryptoServiceProvider(2048, new CspParameters(1)).ExportParameters(true); 
    } 
} 

Доступ позже для расшифровки:

byte[] encrypted = ...; 

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
rsa.ImportParameters(this.Cryptograph.RSAKeyInfo); 

byte[] decrypted = rsa.Decrypt(encrypted, false); 
Console.WriteLine(Utilities.ByteArrayToHexString(decrypted)); 

я получаю исключение "Bad Data" на этой линии:

byte[] decrypted = rsa.Decrypt(encrypted, false); 

Что же я делать не так? Как я могу сделать это правильно? Спасибо :)

P.S .: Пожалуйста, не отправляйте MSDN или очевидные ссылки на результаты Google, я прочитал все эти страницы и до сих пор не могу заставить его работать.

+0

Является ли клиент также .net-клиентом? Используют ли они ту же версию .net? –

ответ

0

Мне понадобилось шифрование/дешифрование, которое не использовало дополнение, а C# .NET не предоставляет его по умолчанию. OpenSSL.NET выполнит эту работу, однако я застрял, пытаясь ее использовать. (See this question if you want to help me make it work). :(

3

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

Я понимаю, что вы уже читали, но вы можете прочитать на странице Зашифровать и эту страницу Расшифровать, и убедитесь, что вы следуете шаги: http://msdn.microsoft.com/en-us/library/te15te69.aspx

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

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

+0

Определенно согласен с длиной сообщения. RSA обычно намного медленнее, чем симметричный шифрование/дешифрование, поэтому часто используется для шифрования ключевая фраза или симметричный ключ – zebrabox

+0

Позвольте мне реорганизовать мой вопрос:. у меня есть массив байт 128 байт, содержащих данные, зашифрованные с помощью открытого ключа у меня есть массив байт 128 байт, содержащих секретный ключ Как я расшифровать. зашифрованный массив байтов? Thanks :) – Lazlo

+0

Как был закрыт ключ в массив байтов? Ваш 128-битный ключ должен быть симметричным. Итак, был ли зашифрован закрытый ключ? Если это так, то вы расшифровываете его с помощью открытого ключа, но тогда вам нужно будет воссоздать симметричный ключ из дешифрованного ключа.Какой API или язык превратили ключи в представление байтов? –