Яндекс.Метрика

    Подсознание

    Шифрование данных на 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 немного запутывают результат для виду, не неся полезной нагрузки.
    В процессе поисков, кстати, нашёл любопытную заметку:
    В Российской Федерации коммерческая деятельность, связанная с использованием криптографических средств, подлежит обязательному лицензированию. С 22 января 2008 года действует Постановление Правительства РФ от 29 декабря 2007 N 957 «Об утверждении положений о лицензировании отдельных видов деятельности, связанных с шифровальными (криптографическими) средствами», которым приняты Положения о лицензировании деятельности по:
    распространению шифровальных (криптографических) средств
    техническому обслуживанию шифровальных (криптографических) средств
    предоставлению услуг в области шифрования информации
    разработке, производству шифровальных (криптографических) средств, защищенных с использованием шифровальных (криптографических) средств информационных и телекоммуникационных систем

    Не потому ли подобный (вроде невинный) код сложно найти?
    Прошу помочь найти такой алгоритм/класс/функцию.
    Согласно правилам блога «Помогите», обязуюсь выложить работающую функцию и, возможно, описать работу.
    Если хабрасообщество посчитает проблему надуманной либо неактуальной, этот хабратопик исчезнет, как будто его и не было.
    Спасибо.