Приветствую всех.
Хочу поделиться своей реализацией алгоритма шифрования на PHP. Зачем это здесь? Дело в том что я приступил к изучению PHP и попалось задание, реализацию которого я и выкладываю на суд общественности. В процессе поиска информации выяснилось — реализаций не много. Одна из них на хабре — Обратимое шифрование текста — метод «Двойной квадрат».
Ну и во-вторых есть желание писать на хабре о веб-разработке «для самых маленьких». Ведь «учась — учи», как-то так.
Ну собственно, вот функции отвечающие за генерацию ключа, шифрование и расшифровывание текста:
<?php
/**
* return array
*
*Функция возвращает массив с ключами в алфавитном порядке и перемешанными значениями.
*/
function newAlfabet(){
//Формируем алфавит, по желанию набор символов может быть иным
$alfa = range('A','Z');
shuffle($alfa);
$keys = array();
foreach ($alfa as $key => $value){
$keys[chr($key+65)] = $value;
}
return $keys;
}
/**
* @param $text - текст, который шифруем
* @param $newalfabet - сгенерированный массив с алфавитом
* return array|string
*/
function enCode($text, $newalfabet){
$text = strtoupper($text);
$len = strlen($text);
for($i = 0; $i <$len; $i++){
foreach ($newalfabet as $key => $value){
if($text[$i] == $key){
$text[$i] = $value;
break;
//с break у меня была загвоздка - без него функция пробегается до конца массива и может
//повторно заменить букву. Восстановлению в этом случае текст не подлежит.
}
}
}
return $text;
}
/**
* @param $text - зашифрованный текст
* @param $keys - строка с ключом (она выводится при шифровании текста)
* return array
*/
function deCode($text, $keys){
foreach ($keys as $key => $value){
$alfabet[chr($key+65)] = $value;
}
$len = strlen($text);
for($i = 0; $i <$len; $i++){
foreach ($alfabet as $key => $value){
if($text[$i] == $value){
$text[$i] = $key;
break;
}
}
}
return $text;
}
А это вывод:
<?php
include './set.php'; // тут подключается кодировка и уровень вывода ошибок
include './funct-kripto.php'; //тот листинг что выше
include_once './tpl/body-begin.php'; //начало html документа
$key = isset($_POST['key']) ? parseString($_POST['key']) : null; //parseString - проверка введенных данных
$text = isset($_POST['text']) ? parseString($_POST['text']) : null;
$textcode = isset($_POST['textcode'])? parseString($_POST['textcode']) : null;
?>
Текст, который необходимо зашифровать, in English please:
Текст, который необходимо расшифровать:
Ключ для расшифровки:
<?php
if(isset($_POST['ok'])){
$keys = newAlfabet();
echo 'Скопируйте код, он пригодится для расшифровки: ',implode('', $keys),'
';
echo 'Твой текст: ',$text,'
';
$textcode = enCode($text, $keys);
echo 'Зашифрованный текст: ',$textcode,'
';
}
if(isset($_POST['ok2'])){
$key = str_split($key);
$text = deCode($textcode, $key);
echo 'Расшифрованный текст: ',$text,'
';
}
include_once './tpl/body-end.php'; //конец html документа
Вот, собственно и всё. Можно было много чего еще накрутить, но хотел показать сам принцип. Хотелось бы услышать замечание старших товарищей.
Всем спасибо.
Автор: kriptomen
Все легко хоть даже нет формы, голову минут 10-15 поломал, разобрался что и как, автору спасибо. Мои пожелания сделать еще по другим методам шифровки, пару уроков.