Шифр простой замены на PHP

в 7:42, , рубрики: php, шифрование на php, метки:

Приветствую всех.

Хочу поделиться своей реализацией алгоритма шифрования на 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


  1. TEST:

    Все легко хоть даже нет формы, голову минут 10-15 поломал, разобрался что и как, автору спасибо. Мои пожелания сделать еще по другим методам шифровки, пару уроков.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js