Vladimir Kim ([info]vladimirkim) wrote,

Простая и надежная PHP функция для обратимого шифрования

 

Всем привет! :)

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

Как оказалось в инете с этим тоже глухо, не нашел при беглом взгяде ни одной готовой процедуры или скрипта. Правда нашел библиотеку к PHP для шифрования - mcrypt, но что бы ее поставить, нужно пересобирать ядро PHP или просить поставить техподдержку хостинга эту библиотеку и не на всех хостингах это возможно, в общем с mcrypt настоящий гемммморой. :)

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

Итак подумав решил организовать классическое и эффективное наложение шифруемой строки на надежную гамму (псевдослучайную последовательность) с помощью XOR. Вопрос только, где взять приемлимую по надежности гамму. Конгруэнтные генераторы отлетают сразу. Регистры сдвига долго, да и легко они ломаются по куску открытого текста. В общем подумав еще минут 10 придумал использовать для генерации гаммы обычную хэш функцию. :)

Т.е. математика такая:
K(i+1) = sha1(K[i])

Но, если вдуматься, в таком виде ее использовать для гаммы нельзя, ибо такая гамма будет уязвима к куску открытого текста размером примерно в 20 байт (sha1 выдает хэш размером в 20 байт).

Однако если для гаммы брать только, например, первый байт от K[i] (сам он по себе 20 байт), то проблема уходит. Однако встает вопрос производительности на относительно больших текстах.

По этому я решил брать первые 8 байт (можно меньше или больше - на ваш выбор и соответственно решаемой задаче). В этом случае криптостойкость (по открытому куску текста) пораждаемой гаммы будет составлять сложность взлома sha1 по оставшимся 12 байтам от 20. Что более чем достаточно для большинства задач.

Реализовав это все в код у меня получилось:

//PHP функция для обратимого шифрования
//-------------------------------------
function encode($String, $Password)
{
    $Salt='BGuxLWQtKweKEMV4';
    $StrLen = strlen($String);
    $Seq = $Password;
    $Gamma = '';
    while (strlen($Gamma)<$StrLen)
    {
        $Seq = pack("H*",sha1($Seq.$Salt)); //в PHP5 эту строку можно заменить на $Seq = sha1($Seq.$Salt, true);
        $Gamma.=substr($Seq,0,8);
    }
   
    return $String^$Gamma;
}

Переменную $Salt='BGuxLWQtKweKEMV4'; я ввел для того, что бы случайно не возникло коллизии, если вы будете хранить пароль, которым шифровали рядом в виде хэша (того же sha1). В принципе, вы можете подставить в нее свое значение, главное, что бы она была не пустая! :)

Ну и еще один момент, если хотите еще усилить криптостойкость ко взлому, то можно строку         $Seq = pack("H*",sha1($Seq.$Salt)); переделать на такую: $Seq = pack("H*",sha1($Gamma.$Seq.$Salt)); что сделает бесполезной попытку взлома по открытому куску текста из середины.

В общем, в конце концов у меня получилось так:

//PHP функция для обратимого шифрования
//-------------------------------------
function encode($String, $Password)
{
    $Salt='BGuxLWQtKweKEMV4';
    $StrLen = strlen($String);
    $Seq = $Password;
    $Gamma = '';
    while (strlen($Gamma)<$StrLen)
    {
        $Seq = pack("H*",sha1($Gamma.$Seq.$Salt));
        $Gamma.=substr($Seq,0,8);
    }
   
    return $String^$Gamma;
}

Пользуйтесь на здоровье! :)

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

Надеюсь, вам смог помочь этот пост. А если у вас есть пожелания замечания к моим выкладкам обязательно пишите, буду очень рад!  :)

С уважением, Владимир.

Tags: php, программирование, шифрование

  • Post a new comment

    Error

  • 16 comments

Anonymous

April 6 2008, 13:24:28 UTC 4 years ago

А расшифровывать как?

А расшифровывать как?

Anonymous

May 16 2008, 15:31:09 UTC 4 years ago

Re: А расшифровывать как?

Блин, ещё раз функцию шифрования примени=)

Anonymous

December 28 2008, 11:57:59 UTC 3 years ago

Re: А расшифровывать как?

...Блин, ещё раз функцию шифрования примени=)...
Если ещё раз применить функцию, то мы еще(!) раз зашифруем.
А нам надо рас-шиф-ро-вать?

Anonymous

June 5 2008, 17:00:53 UTC 3 years ago

Спасибо друг

Спасибо )))

[info]6b31na1da82_34

June 20 2008, 12:18:34 UTC 3 years ago

Прикольный пост... :)
Всегда завидовала творческим людям... Когда нибудь и я научусь...
Буду очень признательна, если поможете мне победить в конкурсе красоты.
Победа в этом конкурсе ОЧЕНЬ много для меня значит! Заранее благодарна всем, кто откликнется на мою просьбу.

С Уважением, Зинаида.

Anonymous

December 28 2008, 11:54:12 UTC 3 years ago

А расшифровывать то как?

Мы перемешали, а вернуться к исходному - как?
Расшифровывать то как?

[info]juicy_emad

March 2 2009, 12:58:02 UTC 3 years ago

Re: А расшифровывать то как?

Да ёпта.

$str = "secret info";
$pass = "pass";
echo encode(encode($str, $pass), $pass);

[info]ted_m

April 26 2009, 06:16:34 UTC 3 years ago

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

Anonymous

September 4 2009, 12:39:24 UTC 2 years ago

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

[info]nightcoder

October 16 2009, 20:19:38 UTC 2 years ago

Спасибо за функцию

Спасибо за функцию

Anonymous

November 27 2009, 01:52:39 UTC 2 years ago

Скачать XRumer 5 ( Хрумер 5 ) - программа массовой рассылки п

Уважамая администрация сайта vladimirkim.livejournal.com!
Предлогаем Вам c помощью софта Xrumer 5 поднять тиц + 450 и pr + 3 для вашего сайта - vladimirkim.livejournal.com.

http://xrumers.ru/xrumer.jpg (http://xrumers.ru/)

Скачать XRumer 5 ( Хрумер 5 ) - программа массовой рассылки по форумам и гостевым, блогам, каталогам и доскам объявлений.

С помошью программы XRumer 5 Вы сможете поднять посещаемость своего ресурса и сильно увеличить тиц и pr ваших сайтов. Вы можете скачать XRumer (http://xrumers.ru/)
и попробовать демоверсию бесплатно после регистрации. Скачайте Хрумер 5 (http://xrumer-5.com/) сейчас и попробуйте как он работает!!! При покупке программы хрумер 5 + парсер поисковых систем, свежие базы форумов и блогов – Вам в подарок!

Программа XRumer 5 Palladium (http://xrumers.ru/) – Массовая рассылка на форумы и каталоги.

Программный продукт хрумер 5 поможет Вам в кратчайшие сроки увеличить посещаемость Вашего сайта в сотни, тысячи раз. Система разрабатывалась несколько лет, при создании использовался опыт профессиональных оптимизаторов для поисковых систем. Оценить и использовать поистине уникальные и мощные возможности программы XRumer (http://xrumers.ru/) смогут как профессионалы, так и новички. При использовании хрумер 5 резко увеличивается не только прямой приток посетителей – кроме того, значительно повышаются позиции Вашего сайта в поисковых системах вплоть до лидирующих позиций.Сейчас лучшим и эффективнейшим софтом (программой) для рекламы сайта, раскрутки сайта, продвижения сайта, пиара и т.п. – является комплекс “XRumer 5.0 Palladium (http://xrumer-5.com/)” Это разработка компании Botmaster Labs, продукт Xrumer развивается динамично, 5-ю версию вот только недавно выпустили. Правда стоимость подняли с $450 до $540, и цена продолжает расти. Однако в руках профессионала софт "Xrumer (http://xrumer-5.com/)" отбивает свою стоимость в среднем за неделю, у новичка – за месяц-два.

Но меньше воды, больше фактов… Что же это за программа такая – XRumer 5.0 (http://xrumers.ru/)? Вот ооочень краткое описание:

* умеет автоматом регистрироваться и создавать сообщения (топики) на форумах, гостевых книгах, блогах, каталогах
* распознаёт капчу (картинки типа “введите число которое видите”) на ПОЛНОМ АВТОМАТЕ!
* автоматически аппрувит аккаунты через e-mail (когда нужно подтверждение через письмо, которое отсылается на указанный ящик)
* полностью АВТОМАТИЧЕСКИ регистрирует почтовые ящики на gmail.com, mail.ru и других крупных почтовиках
+ умеет рассылать ПМ-ки (персональные сообщения) всем пользователям форумов
* умеет варьировать рассылаемый текст так, что из 10.000 сообщений не будет ни одного похожего
* имеет встроенную систему “вопрос-ответ”, массовое пост-редактирование (можно отредактировать ранее разосланные сообщения)
* умеет рассылать по mamba.ru и loveplanet.ru, обходя их защиты от рассылок
* многое, многое другое – разработчики постоянно совершенствуют комплекс Хрумер!


XRumer 5 (http://xrumer-5.com/) является авторитетным комплексом, который уже успело полюбить огромное число профессиональных дорвейщиков, сеошников, адалтщиков, и просто рядовых вебмастеров которые хотят раскрутить сайт!

Подробнее… (http://xrumers.ru/) Купить XRumer 5 за 540$ (http://xrumer-5.com/) – пока программа ещё не подорожала!

Программу Xrumer 5 часто ищут по следующим запросам: xrumer (http://xrumer-5.com/), xrumer 5.0 (http://xrumers.ru/), скачать xrumer (http://xrumer-5.com/), crack xrumer (http://xrumers.ru/), xrumer 5.0 palladium (http://xrumer-5.com/), xrumer бесплатно (http://xrumers.ru/), форум xrumer (http://xrumer-5.com/), xrumer скачать бесплатно (http://xrumers.ru/), xrumer 4.0 (http://xrumer-5.com/), xrumer 4.0 platinum (http://xrumers.ru/), xrumer 5 (http://xrumer-5.com/), xrumer 4 (http://xrumers.ru/). Купить программу Xrumer можно на http://xrumer-5.com/ или http://xrumers.ru/

Anonymous

January 9 2011, 00:50:37 UTC 1 year ago

znakomstva dn ua

http://vkontakte.ru/id118364192
киев клуб знакомств
клуб знакомств в калуге
международный сайт гей знакомств (http://vkontakte.ru/id118357807)
[url=http://vkontakte.ru/id118387035]islam znakomstva[/url]

Anonymous

February 1 2011, 12:49:44 UTC 1 year ago

БД и зашифрованный текст

Здравствуйте, решил испробовать ваш алгоритм шифрования с сохранение зашифрованного текста в БД (MySQL). Создал таблицу с 3 полями (id, login, password), для поля password задал кодировку cp1251_general_ci (varchar 40). Для начала записываю в бд логин и шифрованный текст (в поле password). После произвожу запрос к бд, выташить записи, пытаюсь расшифровать текст по полученному шифру из бд, но бестолку. Что пришло с базы то он и возвращает. Ниже приведён листинг кода, которым я пытался вывполнить выше указанные действия (не стал вписывать подключение к бд). В чём может быть проблема? Либо в кодировка на уровне БД, либо...
$login="vasa";
$password="mypass";//str
$key="pass";//pass
$shifr=encode($password, $key);
echo "Шифруем:".$shifr;
$rashift=encode(encode($password, $key), $key);
echo "
Расшифровываем = ".encode(encode($password, $key), $key);
$result = mysql_query ("INSERT INTO `test`.`table` (`login`, `password`) VALUES ( '$login','".encode($password, $key)."')") or die ("
Вставка!!!! ");

//Тянем с бд записи
$myrow = mysql_query("SELECT `login`, `password` FROM `table`",$db) or die ("
запрос селект ");
while ($result = mysql_fetch_array($myrow))
{
echo "
логин".$result['login']." Пароль шифрованный".$result['password']." Расшифрованный".encode(encode($result['password'], $key), $key);
}

Если возможно пришлите ответ мне на почту - bodryjj@mail.ru

Anonymous

March 17 2011, 08:03:18 UTC 1 year ago

Re: БД и зашифрованный текст

Где же вас таких делают?!

Ответ:
$login="vasa";
$password="mypass";//str
$key="pass";//pass
$shifr=encode($password, $key);
echo "Шифруем: $shifr\n";
$rashift=encode(shifr, $key);
echo "Расшифровываем: rashift\n";
$result = mysql_query ("INSERT INTO `test`.`table` (`login`, `password`) VALUES ( '$login','".mysql_escape_string($shifr)."')") or die ("Вставка!!!!\n");

//Тянем с бд записи
$myrow = mysql_query("SELECT `login`, `password` FROM `table`",$db) or die ("
запрос селект\n");
while ($result = mysql_fetch_array($myrow))
{
echo "логин".$result['login'].
"\nПароль шифрованный".$result['password'].
"\nРасшифрованный".encode($result['password'], $key).
"\n";
}

Anonymous

April 11 2011, 09:06:04 UTC 1 year ago

Крутой сайт! Все хорошо сделано.

Познавательно, но не убедительно. Чего-то не хватает, а чего не пойму. Но, скажу прямо: – светлые и доброжелательные мысли.

Прикольный сайт! Все полезно сделано.

[info]Олег Denik

March 3 2012, 21:32:17 UTC 2 months ago

Поясните, пожалуйста, почему будет уязвимость на открытый текст в 20 байт при K(i+1) = sha1(K[i])
как я понял, если конкретно в ЭТОМ случае брать только первый байт - крипто-сила не поменяется.

Другое дело, когда в примере берутся первые 8 байт, для того чтобы чаще сработал хеш.
Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…