Шифруемся =)

+17
1.8K
Ребят, привет😊 Всегда хотел написать что нибудь связанное с шифрованием, не слишком сложное, но достаточное что бы потешить свое самолюбие😊

Самым простым я посчитал алгоритм многоалфавитной подстановки, смысл в том что каждый символ заменяется своим кодом в зависимости от таблицы, для расшифровки нужна собственно оригинальная таблица и ключ. Алгоритм уязвим для длинных текстов, об этом вы можете почитать в википедии =))



Класс для работы:

  1.  
  2.  
  3. class crypt{
  4.  
  5. private static $instance;
  6.  
  7. public $chars = '|abcdefghigklmnopqrstuvwxyz0123456789.ABCDEFGHIGKLMNOPQRSTUVWXYZ ';
  8. public $separator = '_';
  9. public $code_chars = 8;
  10.  
  11. public static function getInstance(){
  12. if (self::$instance === null) {
  13. self::$instance = new self;
  14. }
  15. return self::$instance;
  16. }
  17.  
  18. public function __construct(){
  19. return true;
  20. }
  21.  
  22. // создание короткой строки символов
  23. public function createChars($data){
  24. $ar_chars = str_split($data);
  25. foreach($ar_chars as $char){
  26. $ar_chars_temp[$char] = $char;
  27. }
  28. $this->chars = implode('', $ar_chars_temp);
  29. return $this->chars;
  30. }
  31.  
  32. // Создание ключа для шифрования
  33. public function getKey(){
  34. // последовательность симвовлов
  35. $chars = $this->chars;
  36. //колличество символов в коде
  37. $code_chars = $this->code_chars;
  38. // разделитель
  39. $separator = $this->separator;
  40. // массив ключа шифра
  41. $ar_key = array();
  42. $n = 0;
  43. while($n < strlen($chars)){
  44. // гененирруем код
  45. $x = $this->getCode($chars, $code_chars);
  46. // проверяем на совпадение в том числе и с сепаратором
  47. while (in_array($x, $ar_key) || strpos($x, $separator) !== false){
  48. $x = $this->getCode($chars, $code_chars);
  49. echo $x . '<hr />';
  50. }
  51. // добавляем в массив
  52. $ar_key[$n] = $x;
  53. $n = $n + 1;
  54. }
  55. $key = implode($separator, $ar_key);
  56. return base64_encode($key);
  57. }
  58.  
  59. // функция генерации кода для символа
  60. private function getCode($chars, $code_chars){
  61. $n = 0;
  62. $x = '';
  63. while($n < $code_chars){
  64. $x = $x . substr($chars, rand(0, strlen($chars)-1), 1);
  65. $n = $n + 1;
  66. }
  67. return $x;
  68. }
  69.  
  70. public function encode($data, $key){
  71. // строка символов
  72. $chars = $this->chars;
  73. // разделитель
  74. $separator = $this->separator;
  75. // получаем массив ключа
  76. $key = base64_decode($key);
  77. $ar_key = explode($separator, $key);
  78. // массив символов
  79. $ar_chars = str_split($chars);
  80. // массив ключа для шифровки
  81. $ar_key_sum = array();
  82. //собираем массив
  83. foreach ($ar_chars as $key=>$value){
  84. $ar_key_sum[$value] = $ar_key[$key];
  85. }
  86. // разбиваем строку на символы
  87. $ar_data_chars = str_split($data);
  88. // шифрованный массив
  89. $ar_code = array();
  90. foreach($ar_data_chars as $char){
  91. $ar_code[] = $ar_key_sum[$char];
  92. }
  93. // собираем в строку
  94. $code = implode($separator, $ar_code);
  95. // кодируем и выводим
  96. return base64_encode($code);
  97. }
  98.  
  99. public function decode($data, $key){
  100. // строка символов
  101. $chars = $this->chars;
  102. // разделитель
  103. $separator = $this->separator;
  104. // получаем массив ключа
  105. $key = base64_decode($key);
  106. $ar_key = explode($separator, $key);
  107. // массив символов
  108. $ar_chars = str_split($chars);
  109. // получаем массив зашифрованной строки
  110. $data = base64_decode($data);
  111. $ar_data = explode($separator, $data);
  112. // собираем масив для расшифровки
  113. $decode_key = array();
  114. foreach($ar_key as $k => $v){
  115. $decode_key[$v] = $ar_chars[$k];
  116. }
  117. // собираем декодированную строку
  118. $data = '';
  119. foreach($ar_data as $value){
  120. $data = $data . $decode_key[$value];
  121. }
  122. return $data;
  123. }
  124.  
  125. }
  126.  
  127.  
Можно создать свою уникальную таблицу и сгенерировать уникальный ключ. Генерация ключа каждый раз происходит рандомно =)

файл класса можно скачать из моего профиля

Это конечно не формат инстанта, просто хотел поделиться.
Нет комментариев. Ваш будет первым!

Еще от автора

Социальный замок
По мотивам темы на форуме. Скрипт был взят на сайте pluso, обернут в виджет для легкого использования.
Защищаем учетную запись администратора.
Приветствую сообщников Пару дней назад думал над защитой пароля администратора, в общем то вариантов не много и все они стандартны - увеличиваем длину
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.