Главная » Статьи » Статьи из Интернета » Разное

PHP → Обратимое шифрование текста — метод «Двойной квадрат»
Пример работы функции:

Если вы все еще пользуетесь XOR шифрованием :), то можете заглянуть под кат и посмотреть как еще можно защищать данные…

Побродив по инету я к своему удивлению, обнаружил что готового решения на PHP практически нет.
Я нашел реализации шифрования Цезаря, Различные подстановки и всеми любимый XOR. Более серьезного и стойкого найти не удалось.
Тут я вспомнил о достаточно простом и достаточно стойком(для моей задачи) методе шифрования «Двойной квадрат».
Для тех кто неслышал о нем, скажу лишь что он дает достаточно стойкий шифр, и им пользовались некоторые спецслужбы во время Второй Мировой войны.
Конечно, современный киптоаналитик или программер с головой сможет его вскрыть потратив некоторое время, имея на руках достаточное количество исходного и зашифрованного текста.
Поэтому не стоит использовать его для сокрытия важной корпоративной или личной конфиденциальной информации.
Мне надо было скрывать информацию от «пионеров», ботов и простых пользователей, поэтому под мои требования стойкости хватало с головой.
В результате я реализовал алгоритм «Двойной квадрат» в одной функции.

Copy Source | Copy HTML
  1. /**
    * Обратимое шифрование методом "Двойного квадрата" (Reversible crypting of "Double square" method)
    * @param  String $input   Строка с исходным текстом
    * @param  bool   $decrypt Флаг для дешифрования
    * @return String          Строка с результатом Шифрования|Дешифрования
    * @author runcore
    */
  2. function dsCrypt($input,$decrypt=false) {
  3.    $o = $s1 = $s2 = array(); // Arrays for: Output, Square1, Square2
  4.    // формируем базовый массив с набором символов
  5.    $basea = array('?','(','@',';','$','#',"]","&",'*'); // base symbol set
  6.    $basea = array_merge($basea, range('a','z'), range('A','Z'), range(,9) );
  7.    $basea = array_merge($basea, array('!',')','_','+','|','%','/','[','.',' ') );
  8.    $dimension=9; // of squares
  9.    for($i=;$i<$dimension;$i++) { // create Squares
  10.        for($j=;$j<$dimension;$j++) {
  11.            $s1[$i][$j] = $basea[$i*$dimension+$j];
  12.            $s2[$i][$j] = str_rot13($basea[($dimension*$dimension-1) - ($i*$dimension+$j)]);
  13.        }
  14.    }
  15.    unset($basea);
  16.    $m = floor(strlen($input)/2)*2; // !strlen%2
  17.    $symbl = $m==strlen($input) ? '':$input[strlen($input)-1]; // last symbol (unpaired)
  18.    $al = array();
  19.    // crypt/uncrypt pairs of symbols
  20.    for ($ii=; $ii<$m; $ii+=2) {
  21.        $symb1 = $symbn1 = strval($input[$ii]);
  22.        $symb2 = $symbn2 = strval($input[$ii+1]);
  23.        $a1 = $a2 = array();
  24.        for($i=;$i<$dimension;$i++) { // search symbols in Squares
  25.            for($j=;$j<$dimension;$j++) {
  26.                if ($decrypt) {
  27.                    if ($symb1===strval($s2[$i][$j]) ) $a1=array($i,$j);
  28.                    if ($symb2===strval($s1[$i][$j]) ) $a2=array($i,$j);
  29.                    if (!empty($symbl) && $symbl===strval($s2[$i][$j])) $al=array($i,$j);
  30.                }
  31.                else {
  32.                    if ($symb1===strval($s1[$i][$j]) ) $a1=array($i,$j);
  33.                    if ($symb2===strval($s2[$i][$j]) ) $a2=array($i,$j);
  34.                    if (!empty($symbl) && $symbl===strval($s1[$i][$j])) $al=array($i,$j);
  35.                }
  36.            }
  37.        }
  38.        if (sizeof($a1) && sizeof($a2)) {
  39.            $symbn1 = $decrypt ? $s1[$a1[]][$a2[1]] : $s2[$a1[]][$a2[1]];
  40.            $symbn2 = $decrypt ? $s2[$a2[]][$a1[1]] : $s1[$a2[]][$a1[1]];
  41.        }
  42.        $o[] = $symbn1.$symbn2;
  43.    }
  44.    if (!empty($symbl) && sizeof($al)) // last symbol
  45.        $o[] = $decrypt ? $s1[$al[1]][$al[]] : $s2[$al[1]][$al[]];
  46.    return implode('',$o);
  47. }


Пользуйтесь все кто хочет, но применяйте её с головой, только там где это допустимо.

Кстати, с удовольствием выслушаю критику и посмотрю на реализацию других простых и надежных методов обратимого шифрования. mcrypt не предлагать )

Удачи.

Update1: Подобную функцию я применяю для сокрытия Емайлов от ботов, например.



Источник: http://habrahabr.ru/blogs/php/61309/
Категория: Разное | Добавил: mobilekid ( 04.06.2009 )
Просмотров: 774 | Рейтинг: 0.0/0
Всего комментариев: 0


Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]