Обратимое шифрование текста — метод «Двойной квадрат»
Раздел:
Programming /
PHP
@
04.06.2009 |
Ключевые слова: php шифрование криптография
Автор: runcore Источник: habrahabr
Здравствуйте!
Однажды, мне понадобилось шифровать текст. Я знал что в PHP есть расширение mcrypt, но интуиция подсказывала, что не на всех хостингах это включено. Поэтому я начал подозревать что придется кодить решение самому. Что я собственно и сделал. Получилась функция обратимого шифрования, достаточно быстрая и надежная. Пример работы функции:
<?php
echo dsCrypt(`habrahabr.ru`);
//Выведет: 60634K7T0*0!
echo dsCrypt(`60634K7T0*0!`,1);
//Выведет: habrahabr.ru
?> Если вы все еще пользуетесь XOR шифрованием :), то можете заглянуть под кат и посмотреть как еще можно защищать данные…
Побродив по инету я к своему удивлению, обнаружил что готового решения на PHP практически нет. Я нашел реализации шифрования Цезаря, Различные подстановки и всеми любимый XOR. Более серьезного и стойкого найти не удалось. Тут я вспомнил о достаточно простом и достаточно стойком(для моей задачи) методе шифрования «Двойной квадрат». Для тех кто неслышал о нем, скажу лишь что он дает достаточно стойкий шифр, и им пользовались некоторые спецслужбы во время Второй Мировой войны. Конечно, современный киптоаналитик или программер с головой сможет его вскрыть потратив некоторое время, имея на руках достаточное количество исходного и зашифрованного текста. Поэтому не стоит использовать его для сокрытия важной корпоративной или личной конфиденциальной информации. Мне надо было скрывать информацию от «пионеров», ботов и простых пользователей, поэтому под мои требования стойкости хватало с головой. В результате я реализовал алгоритм «Двойной квадрат» в одной функции.
Copy Source | Copy HTML
- /**
* Обратимое шифрование методом "Двойного квадрата" (Reversible crypting of "Double square" method) * @param String $input Строка с исходным текстом * @param bool $decrypt Флаг для дешифрования * @return String Строка с результатом Шифрования|Дешифрования * @author runcore */
- function dsCrypt($input,$decrypt=false) {
- $o = $s1 = $s2 = array(); // Arrays for: Output, Square1, Square2
- // формируем базовый массив с набором символов
- $basea = array(`?`,`(`,`@`,`;`,`$`,`#`,"]","&",`*`); // base symbol set
- $basea = array_merge($basea, range(`a`,`z`), range(`A`,`Z`), range(0,9) );
- $basea = array_merge($basea, array(`!`,`)`,`_`,`+`,`|`,`%`,`/`,`[`,`.`,` `) );
- $dimension=9; // of squares
- for($i=0;$i<$dimension;$i++) { // create Squares
- for($j=0;$j<$dimension;$j++) {
- $s1[$i][$j] = $basea[$i*$dimension+$j];
- $s2[$i][$j] = str_rot13($basea[($dimension*$dimension-1) - ($i*$dimension+$j)]);
- }
- }
- unset($basea);
- $m = floor(strlen($input)/2)*2; // !strlen%2
- $symbl = $m==strlen($input) ? ``:$input[strlen($input)-1]; // last symbol (unpaired)
- $al = array();
- // crypt/uncrypt pairs of symbols
- for ($ii=0; $ii<$m; $ii+=2) {
- $symb1 = $symbn1 = strval($input[$ii]);
- $symb2 = $symbn2 = strval($input[$ii+1]);
- $a1 = $a2 = array();
- for($i=0;$i<$dimension;$i++) { // search symbols in Squares
- for($j=0;$j<$dimension;$j++) {
- if ($decrypt) {
- if ($symb1===strval($s2[$i][$j]) ) $a1=array($i,$j);
- if ($symb2===strval($s1[$i][$j]) ) $a2=array($i,$j);
- if (!empty($symbl) && $symbl===strval($s2[$i][$j])) $al=array($i,$j);
- }
- else {
- if ($symb1===strval($s1[$i][$j]) ) $a1=array($i,$j);
- if ($symb2===strval($s2[$i][$j]) ) $a2=array($i,$j);
- if (!empty($symbl) && $symbl===strval($s1[$i][$j])) $al=array($i,$j);
- }
- }
- }
- if (sizeof($a1) && sizeof($a2)) {
- $symbn1 = $decrypt ? $s1[$a1[0]][$a2[1]] : $s2[$a1[0]][$a2[1]];
- $symbn2 = $decrypt ? $s2[$a2[0]][$a1[1]] : $s1[$a2[0]][$a1[1]];
- }
- $o[] = $symbn1.$symbn2;
- }
- if (!empty($symbl) && sizeof($al)) // last symbol
- $o[] = $decrypt ? $s1[$al[1]][$a[0]] : $s2[$al[1]][$al[0]];
- return implode(``,$o);
- }
-
Пользуйтесь все кто хочет, но применяйте её с головой, только там где это допустимо.
Кстати, с удовольствием выслушаю критику и посмотрю на реализацию других простых и надежных методов обратимого шифрования. mcrypt не предлагать )
Удачи.
Update1: Подобную функцию я применяю для сокрытия Емайлов от ботов, например.
Это интересно:
Распечатать статью
Вернуться в раздел:
Programming /
PHP
Реклама:
|