iTEYE

Реализация RSA класса на PHP

1 июня 2009

По ходу работы, я часто сталкиваюсь с интересными и неординарными задачами, в очередной раз такая задача была направленна на применение криптоалгоритма (буквенная аббревиатура от фамилий , и ). Описание было опубликовано в августе 1977 года в журнале Scientific American.

Криптографические системы с открытым ключом используют однонаправленные функции, они обладают следующим свойством:
Если X известно, то функцию от X вычислить относительно просто
Если известно, что Y = функция от X, то для X нет простого пути вычисления
Под однонаправленностью понимается не теоретическая однонаправленость, а практическая невозможность вычислить обратное значение, применяя современные средства, за обозримый интервал времени.
В основу криптографической системы положена задача умножения и разложения простых чисел на множители, которая является вычислительно однонаправленной задачей.
В криптографической системе с открытым ключом каждый располагает как открытым ключом (public key), так и секретнымприватным ключом (secretprivate key). Каждый ключ — это часть информации. В криптографической системе каждый ключ состоит из пары целых чисел. Каждый участник создаёт свой открытый и секретный ключ самостоятельно. Секретный ключ каждый из них держит в секрете, а открытые ключи можно сообщать кому угодно или даже публиковать их. Открытый и секретный ключи каждого участника обмена сообщениями образуют «согласованную пару» в том смысле, что они являются взаимно обратными.

На 2009 год система шифрования на основе считается надёжной, начиная с размера N в 1024 бита.

Зная разложение модуля на произведение двух простых чисел, противник может легко найти секретную экспоненту d и тем самым взломать . Однако на сегодняшний день самый быстрый алгоритм факторизации — решето обобщённого числового поля (General Number Field Sieve), скорость которого для k-битного целого числа не позволяет разложить большое целое за приемлемое время.

И теперь перейдем от теории к практике. Я не стал изобретать велосипед и взял уже готовый класс от Khaled Al-Sham’aa. Какие у него плюсы? Плюс один и очень большой — его класс легко читаем, и прост для изучения. В добавок прилагается пример и краткое описание принципа открытых ключей и теория .

качаем тут Khaled Al-Sham’aa RSA Class PHP

Расмотрим пример:

тут мы подключаем класс и создаем его экземпляр

далее мы создаем пару ключей из исходных простых чисел (как их генерировать на лету я расскажу позже)

тут мы видим пример шифрования и дешифрования фразы

также чуть ниже мы видим вывод сигнатуры закриптованного сообщения (с его помощью мы можем проверить правильно ли все работает)

собственно вот тут мы и проверяем подлинность (предварительно мы опредилили переменную $fake_msg которая отличается от переменной $message, но $signature осталась прежняя)

данный код выведет False

Если смотреть пример далее то мы можем увидеть, что в этом классе существует возможность шифровать и проверять файлы используя функции signFile и proveFile.

В принципе алгоритм рабочий. Однако я сделал небольшое усовершенствование зашифровав оба ключа base64_encode для лучшего восприятия, но это не все.

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

естественно это находится внутри класса

а при генерации ключей включил вот такой код

что дает нам генерацию ключей с псевдослучайной рандомизацией.

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

Все ошибки и прочее прошу в комментарии, будет интересно обсудить.

technology, , , , ,

Comments

Алексей 1 сентября 2013 • 20:55

С небольшими значениями P и Q почему-то не работает. Например при P = 422431, Q = 422239. Конечно, не стоит брать малые значения, но хочется понять причину и не будет ли проблем с большими значениями P и Q?

Eugene 2 сентября 2013 • 21:45

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

Алексей 4 сентября 2013 • 20:42

Было бы очень круто! :)

Eugene 4 сентября 2013 • 22:35

Вот реализация на JavaScript http://iteye.ru/wp-content/uploads/2013/09/cryptico-master.zip

Eugene 4 сентября 2013 • 22:46

Стоит посмотреть еще это http://phpseclib.sourceforge.net/ и этот вопрос http://stackoverflow.com/questions/4484246/encrypt-and-decrypt-text-with-rsa-in-php

Leave a Reply

Скидки до 5% на заказ хостинга!

Сайт работает на быстром VPS/VDS хостинге от FASTVPS