Шифрование открытым ключом
От: vityanya Узбекистан  
Дата: 23.06.09 13:03
Оценка:
Всем доброго времени суток.

Есть задача — шифровать файлы открытым ключом и отправлять их на сервер, где они будут расшифровываться закрытым. При этом рзмер файлов неизвестен, они могут быть от 100 килобайт до 10 мегабайт. Как это можно реализовать? После поиска в инете я обнаружил, что RSACryptoServiceProvider не может шифровать больше 117 байт. С ним так удобно
Re: Шифрование открытым ключом
От: 18сс Россия  
Дата: 23.06.09 13:39
Оценка: +1
Здравствуйте, vityanya, Вы писали:

Шифруйте на 3Des, а ключ для него шифруйте на RSA и передавайте на сервер.
Кодом людям нужно помогать!
Re: Шифрование открытым ключом
От: Spiceman  
Дата: 23.06.09 13:58
Оценка:
Здравствуйте, vityanya, Вы писали:

V>Всем доброго времени суток.


V>Есть задача — шифровать файлы открытым ключом и отправлять их на сервер, где они будут расшифровываться закрытым. При этом рзмер файлов неизвестен, они могут быть от 100 килобайт до 10 мегабайт. Как это можно реализовать? После поиска в инете я обнаружил, что RSACryptoServiceProvider не может шифровать больше 117 байт. С ним так удобно


Прекрасно им шифрую большие объемы блоками. Шифрую до нескольких сот мегабайт. Больше не требовалось.
Re[2]: Шифрование открытым ключом
От: vityanya Узбекистан  
Дата: 23.06.09 14:04
Оценка:
Здравствуйте, Spiceman, Вы писали:

S>Здравствуйте, vityanya, Вы писали:


V>>Всем доброго времени суток.


V>>Есть задача — шифровать файлы открытым ключом и отправлять их на сервер, где они будут расшифровываться закрытым. При этом рзмер файлов неизвестен, они могут быть от 100 килобайт до 10 мегабайт. Как это можно реализовать? После поиска в инете я обнаружил, что RSACryptoServiceProvider не может шифровать больше 117 байт. С ним так удобно


S>Прекрасно им шифрую большие объемы блоками. Шифрую до нескольких сот мегабайт. Больше не требовалось


А как? примерчик не покажете?
Re[3]: Шифрование открытым ключом
От: Spiceman  
Дата: 23.06.09 14:37
Оценка: 3 (1)
Здравствуйте, vityanya, Вы писали:

S>>Прекрасно им шифрую большие объемы блоками. Шифрую до нескольких сот мегабайт. Больше не требовалось


V>А как? примерчик не покажете?


        public static byte[] Encrypt(byte[] mess, string publicKey)
        {
            CspParameters CspParams = new CspParameters();
            CspParams.Flags = CspProviderFlags.UseMachineKeyStore;
            RSA key = new RSACryptoServiceProvider(CspParams);
            try
            {
                key.FromXmlString(publicKey);
            }
            catch (Exception ex)
            {
                // Логирование ошибки
...
                // Освобождение всех ресурсов, используемых объектом AsymmetricAlgorithm.
                key.Clear();
                throw;
            }

            int blockSize = (key.KeySize >> 3) - 11;
            AsymmetricKeyExchangeFormatter format = 
                new RSAPKCS1KeyExchangeFormatter(key);
            int modulusSize = blockSize + 11;
                
            using( MemoryStream msin = new MemoryStream(mess) )
            using( MemoryStream msout = new MemoryStream(blockSize) )
            {
                byte[] buffer = new byte[blockSize];
                int bytesRead;
                try
                {
                    do 
                    {
                        buffer.Initialize();
                        bytesRead = msin.Read(buffer, 0, blockSize);
                        if(bytesRead == blockSize)
                        {
                            msout.Write( format.CreateKeyExchange(buffer), 0, modulusSize );
                        }
                        else

                        {
                            byte[] final = new byte[bytesRead];
                            Array.Copy(buffer, final, bytesRead); 
                            msout.Write( format.CreateKeyExchange(final), 0, modulusSize);
                        }                        
                    } while (bytesRead == blockSize);
                }
                catch (Exception ex)
                {
                        // Логирование ошибки
                    throw;
                }
                finally 
                {
                    // Освобождение всех ресурсов, используемых объектом AsymmetricAlgorithm.
                    key.Clear();
                }
                return msout.ToArray();
            }
        }

        public static byte[] Decrypt(byte[] mess, string secretKey)
        {
            CspParameters CspParams = new CspParameters();
            CspParams.Flags = CspProviderFlags.UseMachineKeyStore;
            RSA key = new RSACryptoServiceProvider(CspParams);
            try
            {
                key.FromXmlString(secretKey);
            }
            catch (Exception ex)
            {
                // Логирование ошибки
...
                // Освобождение всех ресурсов, используемых объектом AsymmetricAlgorithm.
                key.Clear();
                throw;
            }
            AsymmetricKeyExchangeDeformatter format =
                new RSAPKCS1KeyExchangeDeformatter(key);

            int modulusSize = key.KeySize >> 3;

            using (MemoryStream msin = new MemoryStream(mess))
            using (MemoryStream msout = new MemoryStream(modulusSize))
            {
                byte[] buffer = new byte[modulusSize];
                int bytesRead;

                try
                {
                    do
                    {
                        //buffer.Initialize();
                        bytesRead = msin.Read(buffer, 0, modulusSize);
                        if (bytesRead > 0)
                        {

                            byte[] plain = new byte[] { };
                            Array.Clear(plain, 0, plain.Length);
                            plain = format.DecryptKeyExchange(buffer);
                            msout.Write(plain, 0, plain.Length);
                            Array.Clear(plain, 0, plain.Length);

                        }
                    } while (bytesRead > 0);
                }
                catch (Exception ex)
                {
                    throw;
                }
                finally
                {
                    // Освобождение всех ресурсов, используемых объектом AsymmetricAlgorithm.
                    key.Clear();
                }
                return msout.ToArray();
            }
        }
Re[2]: Шифрование открытым ключом
От: Аноним  
Дата: 23.06.09 20:30
Оценка: 7 (2)
Здравствуйте, Spiceman, Вы писали:

S>Здравствуйте, vityanya, Вы писали:


V>>Всем доброго времени суток.


V>>Есть задача — шифровать файлы открытым ключом и отправлять их на сервер, где они будут расшифровываться закрытым. При этом рзмер файлов неизвестен, они могут быть от 100 килобайт до 10 мегабайт. Как это можно реализовать? После поиска в инете я обнаружил, что RSACryptoServiceProvider не может шифровать больше 117 байт. С ним так удобно


S>Прекрасно им шифрую большие объемы блоками. Шифрую до нескольких сот мегабайт. Больше не требовалось.


Это не совсем хорошо в плане производительности, хотя работать тоже будет. Лучше делать как рекомендовали ранее. Для передачи данных используйте симметричный криптоалгоритм, а для передачи секретного ключа от него — ассиметричный. Так по фен-шую
Re[3]: Шифрование открытым ключом
От: Spiceman  
Дата: 24.06.09 12:49
Оценка:
Здравствуйте, Аноним, Вы писали:

S>>Прекрасно им шифрую большие объемы блоками. Шифрую до нескольких сот мегабайт. Больше не требовалось.


А> Это не совсем хорошо в плане производительности, хотя работать тоже будет. Лучше делать как рекомендовали ранее. Для передачи данных используйте симметричный криптоалгоритм, а для передачи секретного ключа от него — ассиметричный. Так по фен-шую


Про несколько сот мегабайт я пожалуй погорячился. Оно конечно работает, но меееедленно.
Провел тесты. Результаты неутешительны.
RSA на несколько порядков проседает по сравнению с DES, если шифровать большие объемы. Скажем, до 100КБ еще терпимо. Но большие объемы нужно DES, а ключ как и советовали — RSA.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.