В этой статье будет представлен простой и удобный в использовании алгоритм шифрования/дешифрования: использование операции исключающее ИЛИ (XOR). Принцип этого алгоритма прост и призван дать читателям более интуитивное представление о шифровании/дешифровании информации.
Принцип алгоритма XOR
. С точки зрения основного метода шифрования метод транспозиции слишком прост, особенно когда объем данных невелик, открытый текст легко угадать из зашифрованного текста, а метод замены является эффективным и простым. алгоритм.
Судя по характеристикам различных операций подстановки, операция XOR наиболее подходит для простых операций шифрования и дешифрования. Принцип этого метода заключается в следующем: когда число A и другое число B подвергаются операции XOR, будет сгенерировано другое число C. If then. операция XOR над C и B, и C будет восстановлен до A.
По сравнению с другими простыми алгоритмами шифрования преимущества алгоритма XOR заключаются в следующем.
(1) Алгоритм прост и может быть легко реализован на языках высокого уровня.
(2) Он быстрый и может использоваться в любое время и в любом месте.
(3) Он действителен для любого символа. В отличие от некоторых простых алгоритмов шифрования, которые действительны только для западных символов, китайские символы не могут быть восстановлены до исходных символов после шифрования и дешифрования.
Реализация алгоритма XOR
В предыдущей части был описан принцип использования операции XOR для шифрования/дешифрования. В этом разделе она будет использоваться для шифрования информации для входа пользователя. Согласно принципу алгоритма шифрования XOR, представленному в предыдущем разделе, нетрудно написать следующие функции шифрования и дешифрования. Алгоритмы шифрования перечислены первыми.
1 <!--encrypy_xor: функция шифрования, которая просто использует операцию XOR ----------------------->
2 <?php
3 //Функция шифрования
4 функции myEncrypt($string, $key)
5 {
6 for($i=0; $i<STRLEN($STRING); p $i++)<>
7 {
8 for($j=0; $j<STRLEN($KEY); p $j++)<>
9 {
10 $string[$i] = $string[$i]^$key[$j];
11 }
12}
13 вернуть $строку;
14}
Строка 4 определяет функцию шифрования myEncrypt(). Входной параметр $string — это открытый текст, а $key — это ключ; выходной параметр — это зашифрованный текст, сгенерированный с использованием $key в качестве ключа и с использованием алгоритма шифрования XOR.
Внешний цикл for в строках с 6 по 12 проходит по каждому символу строки открытого текста, а внутренний цикл for (строки с 8 по 11) проходит по каждому символу открытого текста и выполняет исключение для каждого бита операции ИЛИ. Этот принцип был представлен в предыдущем разделе и не будет повторяться.
Опять же, аналогично функции шифрования, можно написать следующую функцию дешифрования.
1 //функция дешифрования
2 функция myDecrypt($string, $key)
3 {
4 for($i=0; $i<STRLEN($STRING); p $i++)<>
5 {
6 for($j=0; $j<STRLEN($KEY); p $j++)<>
7 {
8 $string[$i] = $key[$j]^$string[$i];
9}
10}
11 вернуть $строку;
12}
13?>
Строка 4 определяет функцию дешифрования myDecrypt(), входной параметр $string — это зашифрованный текст, а $key — это ключ; выходные данные — это открытый текст, сгенерированный с использованием $key в качестве ключа и с использованием алгоритма дешифрования XOR.
Ниже пример приложения используется для дальнейшей иллюстрации функции функции шифрования.
1 //Пример
2 $my_password="стул";
3 echo "my_password = $my_password";
4 $my_key="1234567890";
5 $my_password_en=myEncrypt($my_password,$my_key);
6 echo "my_password_en = $my_password_en";
7 $my_password_de=myDecrypt($my_password_en,$my_key);
8 echo "my_password_de = $my_password_de";
строка 3 сначала определяет открытый текст $my_password, а затем определяет ключ $my_key в строке 4.
Строки 5 и 6 соответственно вызывают функцию шифрования для генерации зашифрованного текста и вывода его по очереди, зашифрованный текст расшифровывается в строках 7 и 8;
Результаты выполнения приведенного выше примера следующие.
my_password = Chair
my_password_en = RYPXC
my_password_de = Chair
Реализация аутентификации личности с использованием алгоритма XOR
В предыдущих двух частях были представлены принцип и реализация шифрования/дешифрования информации с использованием операции XOR. Далее этот метод будет использоваться для шифрования пароля пользователя для входа. В этом примере, чтобы защитить пароль пользователя, система хочет достичь следующих целей.
·При регистрации пользователю необходимо заполнить форму пароля пользователя.
·Помимо самого пользователя, никто другой не сможет получить информацию о его пароле, включая проектировщиков систем и администраторов баз данных.
·Система может проверить легитимность пользователя на основе пароля, введенного пользователем.
Для достижения вышеуказанной цели при использовании алгоритма XOR вы можете выбрать имя пользователя в виде обычного текста, а ключ — определяемый пользователем пароль, а затем сохранить зашифрованное имя пользователя в базе данных.
Кроме того, когда пользователь входит в систему, существуют следующие два способа проверки законных пользователей.
(1) Повторно зашифровать на основе предоставленной информации об имени пользователя (обычный текст) и пароле (ключе) и использовать зашифрованную информацию для сравнения с информацией о пароле, хранящейся в базе данных. Если они равны, пользователь является законным, в противном случае. , пользователь нелегален.
(2) Расшифровать на основе информации о пароле (обычный текст), хранящейся в базе данных, и информации о пароле (ключе), введенной пользователем, и сравнить зашифрованную информацию с именем пользователя, предоставленным пользователем. Если они равны, пользователь. является законным, в противном случае — для нелегальных пользователей.
Оба метода могут достичь третьей цели. В этом примере будет использоваться второй метод. Код реализации этого примера может быть реализован на основе реализации раздела 18.4.1 «Вход пользователя» и раздела 18.4.2 «Проверка пользователя». Страницу «Вход пользователя» менять не нужно. Проверка пользователя» заключается в следующем.
1 <?php
2 session_start(); //Загружаем библиотеку сессий, которую необходимо разместить в первой строке
3 $user_name=$_POST["user_name"];
4 session_register("user_name"); //Зарегистрируйте переменную $user_name, обратите внимание, что здесь нет символа $.
5
6 require_once("sys_conf.inc"); //Файл конфигурации системы, включая информацию о конфигурации базы данных.
7 require_once("encrypy_xor.php"); //Содержит файл функции шифрования xor.
8
9 //Подключаемся к базе данных
10 $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD);
11 mysql_select_db($DBNAME); //Выбираем базу данных my_chat;
12
13 //Запрос, есть ли вошедшая в систему информация о пользователе
14 $str="выберите имя и пароль пользователя, где имя ='$user_name'";
15 $result=mysql_query($str,$link_id); //Выполнить запрос
16 @$rows=mysql_num_rows($result); //Количество записей, полученных по результатам запроса
17 $user_name=$_SESSION["user_name"];
18 $password=$_POST["пароль"];
19 $password_en=myEncrypt($user_name,$password); //Шифрование информации пользователя;
20
21 //Для старых пользователей
22 если($строки!=0)
двадцать три {
24 список($name,$pwd)=mysql_fetch_row($result);
25 $password_de=myDecrypt($pwd,$password); //Расшифруем информацию пользователя
26
27 //Если пароль введен правильно
28 if($user_name==$password_de)
29 {
30 $str="обновить набор пользователей is_online =1 где name ='$user_name' и пароль='$password_en'";
31 $result=mysql_query($str, $link_id); //Выполнить запрос
32 require("main.php"); //Переходим на страницу чата
33}
34 //Ошибка ввода пароля
еще 35
36 {
37 require("relogin.php");
38 }
39 }
40 //Для новых пользователей записываем их информацию в базу данных
еще 41
42 {
43 $str="вставить в значения пользователя (имя,пароль,is_online)('$user_name', '$password_en',1)";
44 $result=mysql_query($str, $link_id); //Выполнить запрос
45 require("main.php"); //Переходим на страницу чата
46 }
47 //Закрываем базу данных
48 mysql_close($link_id);
49 ?>
В строке 7 представлен файл функции шифрования encrypy_xor.php, включая две функции, представленные в предыдущем разделе.
В строке 19 зашифрованное значение пароля получается с использованием имени пользователя и пароля, предоставленных пользователем, а для новых пользователей это зашифрованное значение сохраняется в базе данных в строке 44.
Кроме того, для старых пользователей получите информацию об имени пользователя и зашифрованном пароле в базе данных в строке 24, используйте эти два значения для расшифровки в строке 25, а затем сравните расшифрованное значение с информацией об имени пользователя, предоставленной user в строке 28, чтобы проверить легитимность пользователя.
В предыдущей частиавтоматического создания ключей
было показано, как использовать алгоритм шифрования XOR для шифрования информации пользователя. Информация о пароле, введенная пользователем, фактически становится ключом в алгоритме шифрования, а имя пользователя используется в виде обычного текста. очень хорошо выполняет свою функцию, но логически этот метод кажется немного необоснованным.
В этой статье будет представлена технология, которая автоматически генерирует ключи. Вы можете использовать автоматически сгенерированные ключи для шифрования простого текста пароля, отправленного пользователем, что делает логику более разумной.
В этом примере предполагается, что сгенерированный ключ имеет длину 512 бит. Код следующий.
1 <!--keygen.php: Автоматически генерировать ключи ------------------------------------>
2 <?php
3
4 //Автоматически генерировать ключ длиной $len
5 функцияgenerate_key($len)
6 {
7 $нижняя граница = 35;
8 $верхняя граница = 96;
9 $strMyKey = "";
10
11 for($i=1;$i<=$len;$i++)
12 {
13 $rnd=rand(0,100); //Генерация случайных чисел
14 $k = (($upperbound - $lowerbound) + 1) * $rnd + $lowerbound;
15 $strMyKey=$strMyKey.$k;
16}
17 вернуть $strMyKey;
18}
19
20 //Записываем ключ в файл $file_name
21 функция write_key($key,$file_name)
двадцать два {
23 $filename="C:key.txt";
24 $key=generate_key($key,512);
25
26 //Открываем $filename в режиме добавления, указатель файла будет в конце файла
27 if(!$handle=fopen($filename,'w'))
28 {
29 print «Невозможно открыть файл $filename»;
30 выход;
31}
32
33 //Записываем $key в файл, который мы открыли.
34 if(!fwrite($handle,$key))
35 {
36 print "Невозможно записать в файл $filename";
37 выход;
38 }
39 fclose($handle);
40}
41
42 //Читаем ключ в файле ключей
43 функция get_key($file_name)
44 {
45 //Открыть файл
46 $fp = fopen ($file_name, "r");
47 $результат="";
48 //Чтение построчно
49 в то время как (!feof($fp))
50 {
51 $buffer = fgets($fp, 4096);
52 $result=$result.$buffer;
53}
54 вернуть $result;
55 }
56
57 ///*
58 $KeyLocation = "C:key.txt" //Файл для сохранения ключа
59 $key="123456";
60 write_key($key,$KeyLocation);
61 эхо get_key($KeyLocation);
62 //*/
63 ?>
Код включает в себя 3 функции.
·generate_key($len): автоматически генерирует ключ длиной $len
·write_key($key,$file_name): записывает ключ в файл $file_name
·get_key($file_name): читает ключевой файл $file_name Когда значение ключа
используется, когда пользователь входит в систему в первый раз, значение ключа автоматически генерируется для пользователя. Существует два способа обработки этого значения ключа.
(1) Сохраните его в определенном поле базы данных. Недостаток этого метода заключается в том, что безопасность ключа в базе данных не может быть гарантирована.
(2) Сохраните ключ в локальном файле пользователя, чтобы предотвратить его использование. от получения другими, но недостатком этого метода является то, что когда пользователи используют другие машины для доступа к системе, они не могут войти в систему.
В этом примере будет использоваться метод 2.
В частности, строки с 11 по 18 приведенного выше кода непрерывно генерируют ключи, генерируя случайные числа, и повышают их сложность за счет вычислений. Значения нижней и верхней границ фактически представляют собой диапазон символов ASCII, который вы хотите использовать для шифрования. Ниже приведен пример сгенерированного файла ключа.
208123915925183361116049369344372701567721435181102718332639307390344373445407
524316475863232913993383189547474747394154915312639841226741894189965623523913
011164730113445201935692839710274127251577929493941487145611337531549110895367
593586318332391170941272701152344371709270125776235313540032267139933835677407
617384135696111239130732949469623520815987524358635491542913374933524334454251
400327015367133759324537171709152357391089524342514685239122673135531363151191
833412771743139654…
最后,需要把密钥保存在服务器上一个安全的地方,然后就可以利用其和诸如XOR这样的加密算法来对用户信息进行加密/解密了。 Как использовать этот ключ в XOR, представленном в предыдущем разделе, очень просто и не будет описываться подробно. Всего 2 страницы. 9 7 1 2