Компьютеры Программирование Прямое и обратное шифрование на PHP

Прямое и обратное шифрование на PHP

Шифровка и дешифровка на PHP. Прямое и обратное шифрование на PHP.

Не так давно я столкнулся с казалось бы простой задачей - зашифровать строку, используя, ключ или "соль", а затем расшифровать данные. Язык для решения задачи использовался PHP. Решение оказалось сложнее, чем я рассчитывал.

Первое, что я стал делать - поискал уже готовую функцию на php, которая умеет шифровать строчки. Но к моему удивлению я не находил библиотечного варианта, а те что находил - к примеру, crypt - не имеет возможности обратного шифрования - то есть, расшифровать строку уже нельзя. Удобно это, когда вы используете шифрование для хранения паролей в базе данных, к примеру, MySQL в зашифрованном виде. Тогда для проверки правильности пароля вам понадобится проверить соответствия введенного пароля, проведенного через функции шифрования, и пароля из базы. А если базу кто-то украдет, то пароли - он без ключа не расшифрует. Можно вообще хранить все данные в базе в зашифрованном виде для больше безопасности.

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

Итак, вот для чего мне нужно было шифрование. Есть форма авторизации для закрытой части одного сайта. В этой форме я захотел сделать простенькую самодельную капчу. Логика такая - при создании формы генерируется число, затем это число шифруется и передается в два места. Первое место - input с type="hidden", который находится в той же форме, что и капча, поля для логина и пароля. Второе место, куда "передается" зашифрованное число - скрипт, который рисует картинку для капчи. При отправке данных формы на сервер по данным этого скрытого поля будет вестись проверка правильности заполнения капчи.

Сам скрипт, рисующий картинку, принимает зашифрованную строку, расшифровывает её и на основе расшифрованных данных строит картинку. Содержимое такой картинки нужно ввести в одно из полей формы.

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

Зачем функции для работы с данными в HEX формате (16-ричный вид)

Дело в том, что при шифровании с использованием приведенных ниже функций - строка в зашифрованном виде может содержать символы, которые "портят" запрос. Допустим, скрипт, который рисует картинку называется img_script.php. Пусть ему передаётся параметр str, который ему нужно расшифровать и построить на основе полученных данных изображение. Делается это так: img_script.php?str=zashifrovannaya_stroka. И всё хорошо до того момента, когда зашифрованная строка начинается содержать знаки & или ?, которые мешают правильной передачи данных.

К примеру, если в строке будет знак &, то скрипт будет уверен, что после этого знака идёт следующий параметр и ни о какой расшифровке можно даже не мечтать. Поэтому зашифрованную строку можно перевести в HEX с помощью функции strToHex, передать скрипту в таком виде. Скрипт примет данную строку, пройдёт по ней функцией hexToStr и уже полученные данные расшифрует.

Спасибо автору этого сайту за функции шифровки/дешифровки.

function __encode($text, $key)
{
    $td = mcrypt_module_open ("tripledes", '', 'cfb', '');
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
    if (mcrypt_generic_init ($td, $key, $iv) != -1) 
		{
        $enc_text=base64_encode(mcrypt_generic ($td,$iv.$text));
        mcrypt_generic_deinit ($td);
        mcrypt_module_close ($td);
        return $enc_text;
        }       
}

function strToHex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}

function __decode($text, $key){        
        $td = mcrypt_module_open ("tripledes", '', 'cfb', '');
        $iv_size = mcrypt_enc_get_iv_size ($td);
        $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);     
        if (mcrypt_generic_init ($td, $key, $iv) != -1) {
                $decode_text = substr(mdecrypt_generic ($td, base64_decode($text)),$iv_size);
                mcrypt_generic_deinit ($td);
                mcrypt_module_close ($td);
                return $decode_text;
        }
    }
	
function hexToStr($hex)
{
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2)
    {
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}	

 

P.S. вот интересная статья про php и MySQL

 

Случайная новость

Новая прошивка iOS 5 для iPhone, iPad, iPod

Долго мы ждали новой прошивки, чтобы прямо вот не только какие-то ошибки были исправлены, но и новые функции изменения интерфейса. Дождались - вот она iOS 5 для iPhone, iPad, iPod.

Подробнее ...

Материал о ПК

Краш-тест падения на плитку Aplle Iphone 4S против Samsung Galaxy S II

Несколько американских ребят решили проверить на прочность два довольно дорогих устройства - Apple iPhone 4S и Samsung Galaxy S II. Как видно оба телефона сбрасывали с высоты пояса и уровня плеч. Как ни странно - хуже себя в таком краш-тесте повёл iPhone 4S, хотя лично я думал, что он явный фаворит.

Подробнее ...


Нажимай!

Кто на сайте

Сейчас 17 гостей онлайн

Голосуй

Используете ли вы плёнку на сенсорных экранах?
 

Valid XHTML 1.0 Transitional Читать в Яндекс.Ленте