Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разница в скорости Шифрование/Дешифрование RSA, Медленное дешифрование 
:(
    Опции темы
LLlaMaH
Дата 19.5.2008, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



У меня в коде реализована работа с RSACryptoServiceProvider
Суть программы необходимо шифровать бинарный файл размер которого варьирует от 100 килобайт до 60 мегабайт.

основной кусок кода который проводит шифрование

OpenStream - поток из которого читаю открытые данные
byte[] Buffer = new byte[1032000];  - размер выбран как 86 * 12000 
потому что при длинне ключа 1024, заявленный размер пакета который может за один проход корректно зашифровать и расшифровать обратно RSACryptoServiceProvider
а 12000 просто выбрал , потому что много 8-)

Код



while (OpenStream.Position != OpenStream.Length)
            {
                /// прочитал большой кусок данных
                ByteRead = OpenStream.Read(Buffer, 0, Buffer.Length);
                /// теперь нужно разбить его по 86 байт
                for (int x = 0; x < ((float)ByteRead / 86); x++)
                {

                    /// копирую кусок из основного массива с помошью Marshal
                    IntPtr pointer = Marshal.AllocHGlobal(86);
                    Marshal.Copy(Buffer, x*86, pointer, 86);
                    byte[] tmp = new byte[86];
                    Marshal.Copy(pointer, tmp, 0, 86);


                    /// шифрую
                    byte[] res = RSA.Encrypt(tmp, false);

                    /// записываю в выходной поток
                    OutStream.Write(res, 0, 128);
                }
                
                /// если в конце остался недошифрованный хвост( конец файла) то добиваю его
                if (ByteRead != Buffer.Length)
                {
                    /// вычисляю размер хвоста и позицию
                    int Tail = (int)(ByteRead - Math.Truncate((float)ByteRead / 86) * 86);
                    int Pos = ByteRead - Tail - 1;

                    /// дочитываю хвостик
                    IntPtr pointer1 = Marshal.AllocHGlobal(Tail);
                    Marshal.Copy(Buffer, Pos, pointer1, Tail);
                    byte[] tmp1 = new byte[Tail];
                    Marshal.Copy(pointer1, tmp1, 0, Tail);

                    /// шифрую
                    byte[] res1 = RSA.Encrypt(tmp1, false);
                    
                    OutStream.Write(res1, 0, 128);
                }
            }



при дешифрации разбиваю данные на куски по 128 байт
Хвоста в таком куске не бувает, обычно размер файла кратен 128
процедура дешифрации выглядит так:

Код


byte[] Buffer = new byte[1536000]; // 12000 * 128 

while (OpenStream.Position != OpenStream.Length)
            {
                ByteRead = OpenStream.Read(Buffer, 0, Buffer.Length);
                /// теперь нужно разбить его по 128 байт
                for (int x = 0; x < ((float)ByteRead / 128); x++)
                {
                    IntPtr pointer = Marshal.AllocHGlobal(128);
                    Marshal.Copy(Buffer, x * 128, pointer, 128);
                    byte[] tmp = new byte[128];
                    Marshal.Copy(pointer, tmp, 0, 128);
                    byte[] res = RSA.Decrypt(tmp, false);
                    OutStream.Write(res, 0, res.Length);
                }
}




код рабочий и в том и в другом направлении. 
Загвоздка в том что 50 метров он шифрует за минуту, а при расшифровке уходит около 30 секунд на 1 метр.
вначале слабым местом было то что читал по 128 и соответственно по 86 байт, но потом исправил и стал читать большими кусками по метру (выше написан уже исправленный код)
после исправления шифрование стало нормальным а вот дешифровка так и осталась медленной. Поставил временный замеры возле функции шифрования и дешифрования
Шифрует за мгновенья, а дешифрует очень долго раз так в 10-15 дольше
так что сделал вывод что гонит RSACryptoServiceProvider на расшифровку

Внимание вопрос:

ЧТО ДЕЛАТЬ ЧТОБЫ УВЕЛИЧИТЬ СКОРОСТЬ?
просто распаковка 50 мегабайт за 25 минут меня не устраивает..
PM   Вверх
v2v
Дата 19.5.2008, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



для шифрования больших объёмов данных надо использовать симметрический алгоритм шифрования(DES, AES, Rijindal), а не ассиметрический (RSA).
ассиметрический алгоритм работает значительно медленней , так что большое время вполне оправдано, тем более лоя .net.
тем более то что ты разбиваешь на куски и шифруешь отдельно куски по 128 бит значительно понижает криптостойкость...


--------------------
PM   Вверх
LLlaMaH
Дата 19.5.2008, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



чем я понижаю криптостойкость блочного алгоритма?
У RSA шифрование идет блоками, а DES AES они поточные
поэтому я вынужден бить весь поток на блоки по 86 байт.
Криптостойкость его я никак не снижаю абсолютно, кто считают что я неправ пусть первый бросит в меня камень(ну или хотябы объяснит мне где я ошибаюсь).
Меня интересует вопрос не криптостойкости а увеличения скорости.
А в программе вместе с алгоритмом RSA также используются и DES и AES.
Просто пользователю на выбор предлагается алгоритм.

а при тестовом сравнении скоростей, блочный RSA в такой реализации ненамного уступает поточным....может максимум раза в 2....
я считаю что шифрование 50 метров за минуту или за 20-30 секунд...это не такая уж и большая разница...

С учетом того что RSA при расшифровке теоретически делает туже процедуру что и при шифровании, только немного измененную, то сильно большой разницы в скорости шифровка-дешифровка быть не должно, а она не только есть...ОНА ОГРОМНА....
вот это меня и смущает

Это сообщение отредактировал(а) LLlaMaH - 19.5.2008, 08:25
PM   Вверх
ptr
Дата 19.5.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: нет
Всего: 14



LLlaMaH, ну и посмотри где производительность проседает. Профайлер в руки и вперед  smile 

Это сообщение отредактировал(а) ptr - 19.5.2008, 11:16


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
jonie
Дата 19.5.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



обычно используют такую схему : берут симметричный алгоритм и шифруют его ключ ассиметричным алгоритмом.
т.о. имеем в теории невосстановимый ключ потокового шифра симметричного, который зашифровал поток....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
LLlaMaH
Дата 19.5.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Цитата(ptr @  19.5.2008,  11:15 Найти цитируемый пост)
LLlaMaH, ну и посмотри где производительность проседает. Профайлер в руки и вперед  smile 


я же сказал где производительность падает, именно на методе RSA.Decrypt
я хотел узнать может я параметры какие забыл поставить, или еще что нибудь.....

Цитата(jonie @  19.5.2008,  11:46 Найти цитируемый пост)
обычно используют такую схему : берут симметричный алгоритм и шифруют его ключ ассиметричным алгоритмом.
т.о. имеем в теории невосстановимый ключ потокового шифра симметричного, который зашифровал поток.... 



спасибо за предложение, оно уже используется ключи всех алгоритмов шифруются.
PM   Вверх
v2v
Дата 19.5.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Цитата(LLlaMaH @  19.5.2008,  08:22 Найти цитируемый пост)
У RSA шифрование идет блоками, а DES AES они поточные

не правильно
Цитата(LLlaMaH @  19.5.2008,  08:22 Найти цитируемый пост)
Криптостойкость его я никак не снижаю абсолютно,

не правильно
Цитата(LLlaMaH @  19.5.2008,  08:22 Найти цитируемый пост)
кто считают что я неправ

я
Цитата(LLlaMaH @  19.5.2008,  08:22 Найти цитируемый пост)

Меня интересует вопрос не криптостойкости а увеличения скорости.

книгу Шенона в руки и посмотри что такое шифрование в рса , а что такое расшифрование и быстро всё поймёшь.

тебе правильно сказали ассиметричным алгоритмом максимум что шифруют - это ключи (небольшой размер).
тебе надо удалить из списка на выбор рса. прога некорректна.



--------------------
PM   Вверх
LLlaMaH
Дата 20.5.2008, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.6.2007

Репутация: нет
Всего: нет




Цитата(v2v @  19.5.2008,  13:38 Найти цитируемый пост)
Цитата(LLlaMaH @  19.5.2008,  08:22 Найти цитируемый пост)
У RSA шифрование идет блоками, а DES AES они поточные

не правильно


что именно неправильно? RSA шифрует данные блоками в зависимости от размера ключа. при размере ключа 1024 бит максимальный выходной блок будет 128 байт.
DES и AES шифруют также блоками но в потоке, т.е. суть реализации такова что данные шифруются в потоке поблочно, в дефолтных параметрах ключа при длинне ключа 32 и вектора 16 блок получается 128

Цитата(v2v @  19.5.2008,  13:38 Найти цитируемый пост)
Цитата(LLlaMaH @  19.5.2008,  08:22 Найти цитируемый пост)
Криптостойкость его я никак не снижаю абсолютно,

не правильно


что здесь не правильно?

чем я снижаю криптостойкость? я также реализую поток шифрования данных. только блоками по 86 байт с выходом по 128.
Почему Вы считает что данный метод снизит криптостойкость?


Цитата(v2v @  19.5.2008,  13:38 Найти цитируемый пост)
Цитата(LLlaMaH @  19.5.2008,  08:22 Найти цитируемый пост)
кто считают что я неправ

я

аргументируй!

Цитата(v2v @  19.5.2008,  13:38 Найти цитируемый пост)
Цитата(LLlaMaH @  19.5.2008,  08:22 Найти цитируемый пост)
Меня интересует вопрос не криптостойкости а увеличения скорости.


книгу Шенона в руки и посмотри что такое шифрование в рса , а что такое расшифрование и быстро всё поймёшь.


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

алгоритм шифрвания/дешифрования  выполняют приблизительно одинаковый набор действий
и данные операции по времени должны быть соразмерны, а не превышать в 30-50 раз.


Цитата(v2v @  19.5.2008,  13:38 Найти цитируемый пост)
Цитата(LLlaMaH @  19.5.2008,  08:22 Найти цитируемый пост)
тебе правильно сказали ассиметричным алгоритмом максимум что шифруют - это ключи (небольшой размер).
тебе надо удалить из списка на выбор рса. прога некорректна.


я согласен что ассиметричным алгоритмом удобно шифровать ключи, и его также можно использовать в достаточно большом диапазоне целей. Но я не соглашусь с Вами на счет того что здесь он не корректен. Почему я не могу его использовать, если он ненамного уступает производительности того же Des или AES с учетом того что я также могу в дальнейшем расширить функционал ПО за счет его ассиметричности.

И не нужно субъективно судить, ведь суть самой программы вам не известна, и серьезность данных которые она защищает тоже может очень варьироваться, я не спорю для документов некоторого уровня секретности можно использовать DES и AES а вот для серьезных данных, я бы лично предпочел RSA.



PM   Вверх
v2v
Дата 20.5.2008, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Цитата(LLlaMaH @  20.5.2008,  07:35 Найти цитируемый пост)

алгоритм шифрвания/дешифрования  выполняют приблизительно одинаковый набор действий

нет.

Цитата(LLlaMaH @  20.5.2008,  07:35 Найти цитируемый пост)

что здесь не правильно?

чем я снижаю криптостойкость? я также реализую поток шифрования данных. 

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

ваш RSA. 
Вы разделили 50 Мб по 128 байт получается ~ 390 тыс блоков. 
Все эти блоки вы шифруете одним и тем же ключём, без никаких изменений.
Если криптоаналитик (читай хакер)  получит такое количество секретных данных он сможет определить алгоритм шифрования, а также размер ключа.
И ему не составит труда методом подбора выудить ключ, а значит и открытый текст. 
если по простому то: 
Решить систему уравнений с N неизвесным размером 390 тыс уравнений легче.
Решить систему уравнений с N неизвесным размером 1 уравнение.


--------------------
PM   Вверх
LLlaMaH
Дата 22.5.2008, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



спасибо за развернутый ответ.
Но все равно я с вами не соглашусь.
Криптоаналитик получивший весь поток того же AES может также вычислить длинну ключа и якобы решить это уравнение, хотя это фактически ОЧЕНЬ трудно реализуемо

а по сути RSA, даже если вы имеет на рукаж 390 тысяч кусков зашифрованных одним и тем же ключем, это вам абсолютно ничего не даст, если вы не знаете какие данные зашифрованны, а с учетом того что шифруются бинарные данные, то проанализировать исходные данные невозможно, даже если предположить что там есть какие либо ключевые шаблонные куски, о которых криптоаналитик точно знает (например заголовочные теги редактора Word) то все равно в каком виде они запакоываны в бинарник фактически злоумышленнику не известно.

а при длине ключа 1024 бита простые числа участвующие в работе алгоритма составляют очень серьезную загадку
если ориентировочно в 128 байт помещается число 3,4028236692093846346337460743177e+38
то узнать два простых числа, вообще практически невозможно, даже если злоумышленник получит эты 390 тысяч кусков, для него они будут лишь мусором.

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


А на счет действий RSA  я немного не согласен
http://ru.wikipedia.org/wiki/RSA

шифрование 
с = m^e MOD n


расшифрование 

m = c^d MOD n


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






PM   Вверх
v2v
Дата 22.5.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Цитата(LLlaMaH @  22.5.2008,  08:53 Найти цитируемый пост)

Криптоаналитик получивший весь поток того же AES может также вычислить длинну ключа и якобы решить это уравнение, хотя это фактически ОЧЕНЬ трудно реализуемо

это принципиально разные алгоритмы , в AES надо используя метод перебора подбирать правильный ключ , и не важно ты будешь проверять правильность варианта на одном блоке или на сотне блоков, это не поможет найти быстрее ключ. Атаку на rsa , которая угрожает твоей программе в данном случае я уже расписал в предыдущем посте.

Цитата(LLlaMaH @  22.5.2008,  08:53 Найти цитируемый пост)

скажите плиз, разве это не одинаковый набор действий?

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



--------------------
PM   Вверх
LLlaMaH
Дата 23.5.2008, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Пробовал разные ключи,  и разные объемы данных, результат один и тот же. Все больше склоняюсь к тому что RSA все таки не очень корректно реализован.
PM   Вверх
v2v
Дата 23.5.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



LLlaMaH, зря так думаешь , в микрософте не глупые дядьки сидят ;)


--------------------
PM   Вверх
LLlaMaH
Дата 26.5.2008, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



ФЯ ничего не имею против этих дядек.... я их даже уважаю....но человеческий фактор остается всегда.....каждый раз убеждаюсь что зеленых человечков не бывает и во всем виноваты мои кривые руки ..8-), но сейчас я уже реально свел аолгоритм обработки файла до минимума....он абсолютно одинкавый (фактический копи-паст) с записи (шифрования).... и скорость все равно разная.....
я уже выше писал...что ставил замеры по времни....и получилось что при шифровании у меня 0 целых хрен десятых миллисекунды  на шифрование.... а на расшифровку.. тоже самое только каждый 8-14 проход он зависает на 14-16 милисекунд...

и тут сомнений в том что тонкое место именно тут у меня не осталось....
может там какойнибудь буфер обнулять нужно...либо еще чего... все примеры МСДН молчат...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1488 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.