Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > RSACryptoServiceProvider


Автор: VisualProgrammerNET 16.8.2006, 19:40
Сделал маленький учебный (для себя) код-шифровальщик данных. Вот:

Код

//encrypt
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
            UnicodeEncoding uni = new UnicodeEncoding();
            byte[] input = uni.GetBytes(textBox2.Text);            
            RSA.ImportParameters(RSA.ExportParameters(false));
            byte[] encrypt = RSA.Encrypt(input, false);
            RSACryptoServiceProvider RSA2 = new RSACryptoServiceProvider();
            RSA2.ImportParameters(RSA2.ExportParameters(true));
            byte[] decrypt = RSA2.Decrypt(encrypt, false);
            MessageBox.Show(uni.GetString(decrypt));
            //encrypt end


Запускаю. В текстбоксе пишу просто "FFF". Вылетает эксепшн на строке
Код

byte[] decrypt = RSA2.Decrypt(encrypt, false);

с пометкой "Плохие данные". Что плохого в моих данных?  smile 

Автор: arilou 16.8.2006, 22:49
VisualProgrammerNET, какой exception?

Автор: VisualProgrammerNET 16.8.2006, 23:27
обычный, RSACryptoServiceProviderException

Автор: ivashkanet 16.8.2006, 23:49
Цитата(VisualProgrammerNET @  16.8.2006,  23:27 Найти цитируемый пост)
RSACryptoServiceProviderException

Конкретнее. Что пишет?

Автор: VisualProgrammerNET 17.8.2006, 01:51
я ж и говорю, просто при дебагге жёлтое окошко указывает на вышеприведённую строку и пишет "плохие данные".

Попробуйте скопировать код и скомпилить (при прочих добавлениях, естественно). Может у меня чё-то глючит?

Автор: ivashkanet 17.8.2006, 10:50
VisualProgrammerNET, разведка боем показала, что зашифровать и расшифровать сообщение разными шифровальщиками просто так не выйдет. 
Оно и понятно, что тогда за шифровка такая получается  smile 
А для того чтобы вышло нужно использовать что-то типа ключа, либо еще что-то что будет гарантироваь возможность расшифровки сообщения.
Капай в этом направлении smile 

Автор: mr.DUDA 17.8.2006, 12:11
Дело в том, что ключ для шифрования и расшифровки должен быть один и тот же, а у тебя ImportParameters делается из одного RSACryptoServiceProvider, а ExportParameters при расшифровке - из другого. Так что либо нужно инициализировать RSA и RSA2 одним и тем же ключом (как советует ivashkanet), либо юзать для Export/ImportParameters один и тот же RSACryptoServiceProvider:

Код
using System;
using System.Security.Cryptography;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main()
        {
            string text = Console.ReadLine();

            RSACryptoServiceProvider RSA_key = new RSACryptoServiceProvider();

            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
            UnicodeEncoding uni = new UnicodeEncoding();
            byte[] input = uni.GetBytes(text);
            RSA.ImportParameters(RSA_key.ExportParameters(false));
            byte[] encrypt = RSA.Encrypt(input, false);

            RSACryptoServiceProvider RSA2 = new RSACryptoServiceProvider();
            RSA2.ImportParameters(RSA_key.ExportParameters(true));
            byte[] decrypt = RSA2.Decrypt(encrypt, false);

            Console.WriteLine(uni.GetString(decrypt));
        }
    }
}

Автор: VisualProgrammerNET 19.8.2006, 18:06
А как быть, если я шифрую данные одной программой, а расшифровывать буду другой? Это сработает? Или нужно создать какую-нибудь общую dll-ку с шифратором?

Добавлено @ 18:18 
И почему не работает вот этот код? Опять же "плохие данные"
Код

            RegistryKey RegK = Registry.LocalMachine;
            RegK = RegK.CreateSubKey("Software\\ForeWorld Software\\Remote Manager\\");

            
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
            RSACryptoServiceProvider RSA_key = new RSACryptoServiceProvider();
            UnicodeEncoding uni = new UnicodeEncoding();
            byte[] input = uni.GetBytes(textBox2.Text);            
            RSA.ImportParameters(RSA_key.ExportParameters(false));
            byte[] encrypt = RSA.Encrypt(input, false);      
            RegK.SetValue("Login", textBox1.Text);
            RegK.SetValue("Pass", uni.GetString(encrypt));
            input = uni.GetBytes((string)RegK.GetValue("pass"));
            RSACryptoServiceProvider RSA2 = new RSACryptoServiceProvider();
            RSA2.ImportParameters(RSA_key.ExportParameters(true));
            byte[] decrypt = RSA2.Decrypt(input, false);
            MessageBox.Show(uni.GetString(decrypt));

Автор: mr.DUDA 19.8.2006, 19:43
Цитата(VisualProgrammerNET @  19.8.2006,  18:06 Найти цитируемый пост)
А как быть, если я шифрую данные одной программой, а расшифровывать буду другой? Это сработает? Или нужно создать какую-нибудь общую dll-ку с шифратором?

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

Автор: VisualProgrammerNET 29.8.2006, 13:32
Сделаем вопрос более общим  smile 

Как зашифровать пароль, записать его куда-нибудь (напр, реестр), и потом считать его и расшифровать? Чё-то у меня одна ботва получается...  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)