Подсознание →
Шифрование данных на php с открытым ключом
Необходимо решить банальнейшую проблему: написать на php алгоритм шифрования данных (строки), использую ключ.
Например:
$data=«Текст, который надо зашифровать»;
$pass=«Серктный ключ»;
print my_encrypt($data,$pass) выведет зашифрованный текст, расшифровать который можно, только владея ключом.
Разумеется, я бы не стал сломя голову ломиться на хабр, на полазив по форумам и википедиям.
Перерыл довольно много и Я н д е к с а , и википедии
Существует функция mcrypt, но она требует подключения дополнительных библиотек, существует также множество готовых стандартных алгоритмов, но нет их достойной (или не очень) реализации на php. В основном они либо на c (вот пример), либо на perl.
Такжо существуют модули для PEAR, которого также нет.
Также есть классическая «Университетская» реализация при помощи XOR:
function x_crypt($data, $key)
{
$strlen_key = strlen($key);
$sbuf = '';
for ($i= $n = 0, $strlen_data = strlen($data); $i < $strlen_data; $i++)
{
if ($n >= $strlen_key) $n = 0;
$sbuf .= chr(ord($key[$n++]) ^ ord($data[$i]));
}
return $sbuf;
}
Шифрование и дешифрование выполняется одной функцией. Явный минус:
Исходная строка: Прривет, товарищи!!, ключ: «Лоль»
Попытка подобрать ключом «Соль», результат:
ри т ов ищ!
Явно видно, что часть зашифрованного текста видна, поэтому такая реализация не очень хороша.
Красота зашифрованного текста на важна, дополнительно можно использовать конструкции
function x_hex_decode($str)
{
for ($i = 0, $sbuf = null, $strlen = strlen($str); $i < $strlen; $i= $i + 5)
{
$sbuf .= chr(hexdec(substr($str, $i+3, 2)));
}
return $sbuf;
}
function x_hex_code($str)
{
for ($i = 0, $sbuf = null, $strlen = strlen($str); $i < $strlen; $i++)
{
$sbuf .= chr(rand(65,70)).rand(0,9).chr(rand(65,70)).sprintf('%X', ord(substr($str, $i, 1)));
}
return $sbuf;
}
function decodex($data,$key)
{
return x_hex_decode(x_crypt(base64_decode(gzinflate($data)),$key));
}
function codex($data,$key)
{
return gzdeflate(base64_encode(x_crypt(x_hex_code($data),$key)),9);
}
Где x_hex_code добавляет случайный мусор, x_hex_decode его убирает, base64_encode и gzdeflate немного запутывают результат для виду, не неся полезной нагрузки.
В процессе поисков, кстати, нашёл любопытную заметку:
Не потому ли подобный (вроде невинный) код сложно найти?
Прошу помочь найти такой алгоритм/класс/функцию.
Согласно правилам блога «Помогите», обязуюсь выложить работающую функцию и, возможно, описать работу.
Если хабрасообщество посчитает проблему надуманной либо неактуальной, этот хабратопик исчезнет, как будто его и не было.
Спасибо.
Например:
$data=«Текст, который надо зашифровать»;
$pass=«Серктный ключ»;
print my_encrypt($data,$pass) выведет зашифрованный текст, расшифровать который можно, только владея ключом.
Разумеется, я бы не стал сломя голову ломиться на хабр, на полазив по форумам и википедиям.
Перерыл довольно много и Я н д е к с а , и википедии
Существует функция mcrypt, но она требует подключения дополнительных библиотек, существует также множество готовых стандартных алгоритмов, но нет их достойной (или не очень) реализации на php. В основном они либо на c (вот пример), либо на perl.
Такжо существуют модули для PEAR, которого также нет.
Также есть классическая «Университетская» реализация при помощи XOR:
function x_crypt($data, $key)
{
$strlen_key = strlen($key);
$sbuf = '';
for ($i= $n = 0, $strlen_data = strlen($data); $i < $strlen_data; $i++)
{
if ($n >= $strlen_key) $n = 0;
$sbuf .= chr(ord($key[$n++]) ^ ord($data[$i]));
}
return $sbuf;
}
Шифрование и дешифрование выполняется одной функцией. Явный минус:
Исходная строка: Прривет, товарищи!!, ключ: «Лоль»
Попытка подобрать ключом «Соль», результат:
ри т ов ищ!
Явно видно, что часть зашифрованного текста видна, поэтому такая реализация не очень хороша.
Красота зашифрованного текста на важна, дополнительно можно использовать конструкции
function x_hex_decode($str)
{
for ($i = 0, $sbuf = null, $strlen = strlen($str); $i < $strlen; $i= $i + 5)
{
$sbuf .= chr(hexdec(substr($str, $i+3, 2)));
}
return $sbuf;
}
function x_hex_code($str)
{
for ($i = 0, $sbuf = null, $strlen = strlen($str); $i < $strlen; $i++)
{
$sbuf .= chr(rand(65,70)).rand(0,9).chr(rand(65,70)).sprintf('%X', ord(substr($str, $i, 1)));
}
return $sbuf;
}
function decodex($data,$key)
{
return x_hex_decode(x_crypt(base64_decode(gzinflate($data)),$key));
}
function codex($data,$key)
{
return gzdeflate(base64_encode(x_crypt(x_hex_code($data),$key)),9);
}
Где x_hex_code добавляет случайный мусор, x_hex_decode его убирает, base64_encode и gzdeflate немного запутывают результат для виду, не неся полезной нагрузки.
В процессе поисков, кстати, нашёл любопытную заметку:
В Российской Федерации коммерческая деятельность, связанная с использованием криптографических средств, подлежит обязательному лицензированию. С 22 января 2008 года действует Постановление Правительства РФ от 29 декабря 2007 N 957 «Об утверждении положений о лицензировании отдельных видов деятельности, связанных с шифровальными (криптографическими) средствами», которым приняты Положения о лицензировании деятельности по:
распространению шифровальных (криптографических) средств
техническому обслуживанию шифровальных (криптографических) средств
предоставлению услуг в области шифрования информации
разработке, производству шифровальных (криптографических) средств, защищенных с использованием шифровальных (криптографических) средств информационных и телекоммуникационных систем
Не потому ли подобный (вроде невинный) код сложно найти?
Прошу помочь найти такой алгоритм/класс/функцию.
Согласно правилам блога «Помогите», обязуюсь выложить работающую функцию и, возможно, описать работу.
Если хабрасообщество посчитает проблему надуманной либо неактуальной, этот хабратопик исчезнет, как будто его и не было.
Спасибо.
03.12.2008 17:21+0300