Este artículo presentará un algoritmo de cifrado/descifrado simple y fácil de usar: utilizando la operación OR exclusiva (XOR). El principio de este algoritmo es simple y tiene como objetivo brindar a los lectores una impresión más intuitiva del cifrado/descifrado de información.
Principio del algoritmo XOR
Desde la perspectiva del método principal de cifrado, el método de transposición es demasiado simple, especialmente cuando la cantidad de datos es pequeña, es fácil adivinar el texto sin formato del texto cifrado y el método de sustitución es eficaz y simple. algoritmo.
A juzgar por las características de varias operaciones de sustitución, la operación XOR es más adecuada para operaciones simples de cifrado y descifrado. El principio de este método es: cuando se realiza XOR a un número A y a otro número B, se generará otro número C. una operación XOR en C y B, y C se restaurará en A.
En comparación con otros algoritmos de cifrado simples, las ventajas del algoritmo XOR son las siguientes.
(1) El algoritmo es simple y se puede implementar fácilmente en lenguajes de alto nivel.
(2) Es rápido y se puede utilizar en cualquier momento y en cualquier lugar.
(3) Es válido para cualquier carácter. A diferencia de algunos algoritmos de cifrado simples, que solo son válidos para caracteres occidentales, los caracteres chinos no se pueden restaurar a los caracteres originales después del cifrado y descifrado.
Implementación del algoritmo XOR
La parte anterior introdujo el principio de cómo utilizar la operación XOR para cifrar/descifrar. Esta sección la utilizará para cifrar la información de inicio de sesión del usuario. De acuerdo con el principio del algoritmo de cifrado XOR presentado en la sección anterior, no es difícil escribir las siguientes funciones de cifrado y descifrado. Los algoritmos de cifrado se enumeran primero.
1 <!--encrypy_xor: una función de cifrado que simplemente usa la operación XOR-------------------------------->
2 <?php
3 //Función de cifrado
4 función myEncrypt($cadena, $clave)
5 {
6 para($i=0; $i<STRLEN($STRING); p $i++)<>
7 {
8 para($j=0; $j<STRLEN($KEY); p $j++)<>
9 {
10 $cadena[$i] = $cadena[$i]^$clave[$j];
11 }
12}
13 devuelve $cadena;
14}
La línea 4 define la función de cifrado myEncrypt(). El parámetro de entrada $string es texto sin formato y $key es la clave; la salida es el texto cifrado generado usando $key como clave y usando el algoritmo de cifrado XOR.
El bucle for externo en las líneas 6 a 12 recorre cada carácter de la cadena de texto sin formato, mientras que el bucle for interno (líneas 8 a 11) recorre cada carácter del texto sin formato y realiza una excepción en cada bit de la operación OR. El principio se introdujo en la sección anterior y no se reiterará.
Nuevamente, de manera similar a la función de cifrado, se puede escribir la siguiente función de descifrado.
1 //función de descifrado
2 función myDecrypt($cadena, $clave)
3 {
4 para($i=0; $i<STRLEN($STRING); p $i++)<>
5 {
6 para($j=0; $j<STRLEN($KEY); p $j++)<>
7 {
8 $cadena[$i] = $clave[$j]^$cadena[$i];
9}
10}
11 devuelve $cadena;
12}
13?>
La línea 4 define la función de descifrado myDecrypt (), el parámetro de entrada $string es el texto cifrado y $key es la clave; la salida es el texto sin formato generado usando $key como clave y usando el algoritmo de descifrado XOR.
A continuación, se utiliza un ejemplo de aplicación para ilustrar mejor la función de la función de cifrado.
1 //Ejemplo
2 $my_password="silla";
3 echo "mi_contraseña = $mi_contraseña";
4 $mi_clave="1234567890";
5 $mi_contraseña_en=myEncrypt($mi_contraseña,$mi_clave);
6 echo "mi_contraseña_en = $mi_contraseña_en";
7 $mi_contraseña_de=myDecrypt($mi_contraseña_en,$mi_clave);
8 echo "my_password_de = $my_password_de";
la línea 3 primero define un texto claro $my_password y luego define la clave $my_key en la línea 4.
Las líneas 5 y 6 llaman respectivamente a la función de cifrado para generar texto cifrado y generarlo, a su vez, el texto cifrado se descifra en las líneas 7 y 8;
Los resultados de ejecutar el ejemplo anterior son los siguientes.
my_password = presidente
my_password_en = RYPXC
my_password_de = presidente
Implementación de autenticación de identidad usando el algoritmo XOR
Las dos partes anteriores introdujeron el principio y la implementación del cifrado/descifrado de información usando la operación XOR. A continuación, este método se utilizará para cifrar la contraseña de inicio de sesión del usuario. En este ejemplo, para proteger la contraseña del usuario, el sistema quiere lograr los siguientes propósitos.
·Al registrarse, el usuario deberá rellenar el formulario de contraseña de usuario.
·Además del propio usuario, nadie más puede obtener la información de su contraseña, incluidos los diseñadores de sistemas y administradores de bases de datos.
·El sistema puede verificar la legitimidad del usuario en función de la contraseña ingresada por el usuario.
Para lograr el propósito anterior, cuando utilice el algoritmo XOR, puede elegir el nombre de usuario como texto sin formato y la clave es una contraseña definida por el usuario, y luego almacenar el nombre de usuario cifrado en la base de datos.
Además, cuando un usuario inicia sesión, existen las dos formas siguientes de verificar a los usuarios legítimos.
(1) Vuelva a cifrar según la información enviada del nombre de usuario (texto sin formato) y la contraseña (clave) y utilice la información cifrada para compararla con la información de la contraseña almacenada en la base de datos. Si son iguales, el usuario es legal; de lo contrario, , el usuario es ilegal.
(2) Descifre según la información de la contraseña (texto sin formato) almacenada en la base de datos y la información de la contraseña (clave) ingresada por el usuario, y compare la información cifrada con el nombre de usuario enviado por el usuario. Si son iguales, el usuario. es legítimo, en caso contrario, para usuarios ilegales.
Ambos métodos pueden lograr el tercer propósito. En este ejemplo, se utilizará el segundo método. El código de implementación de este ejemplo se puede implementar basándose en la implementación de la Sección 18.4.1 "Inicio de sesión de usuario" y la Sección 18.4.2 "Verificar usuario". No es necesario cambiar la página "Inicio de sesión de usuario". Verificar usuario" es el siguiente.
1 <?php
2 session_start(); //Carga la biblioteca de sesiones, que debe colocarse en la primera línea
3 $nombre_usuario=$_POST["nombre_usuario"];
4 session_register("user_name"); // Registre la variable $user_name, tenga en cuenta que no hay ningún símbolo $
5
6 require_once("sys_conf.inc"); //Archivo de configuración del sistema, incluida la información de configuración de la base de datos.
7 require_once("encrypy_xor.php"); //Contiene el archivo de función de cifrado xor
8
9 //Conectarse a la base de datos
10 $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD);
11 mysql_select_db($DBNAME); //Selecciona la base de datos my_chat;
12
13 // Consultar si hay información de usuario registrado
14 $str="seleccione nombre, contraseña del usuario donde nombre ='$nombre_usuario'";
15 $resultado=mysql_query($str,$link_id); //Ejecutar consulta
16 @$rows=mysql_num_rows($result); //El número de registros obtenidos de los resultados de la consulta.
17 $nombre_usuario=$_SESSION["nombre_usuario"];
18 $contraseña=$_POST["contraseña"];
19 $contraseña_en=myEncrypt($nombre_usuario,$contraseña); //Cifrar información del usuario;
20
21 //Para usuarios antiguos
22 si($filas!=0)
veintitrés {
24 lista($nombre,$contraseña)=mysql_fetch_row($resultado);
25 $password_de=myDecrypt($pwd,$contraseña); //Descifrar información del usuario
26
27 //Si la contraseña se ingresa correctamente
28 si($nombre_usuario==$contraseña_de)
29 {
30 $str="actualizar conjunto de usuarios is_online =1 donde nombre ='$nombre_usuario' y contraseña='$contraseña_en'";
31 $resultado=mysql_query($str, $link_id); //Ejecutar consulta
32 require("main.php"); //Ir a la página de chat
33}
34 //Error al ingresar la contraseña
35 más
36 {
37 requerir("relogin.php");
38 }
39 }
40 //Para nuevos usuarios, escribe su información en la base de datos.
41 más
42 {
43 $str="insertar en valores de usuario (nombre,contraseña,está_en línea)('$nombre_usuario', '$contraseña_en',1)";
44 $resultado=mysql_query($str, $link_id); //Ejecutar consulta
45 require("main.php"); //Ir a la página de chat
46 }
47 //Cerrar la base de datos
48 mysql_close($enlace_id);
49 ?>
La línea 7 presenta el archivo de función de cifrado encrypy_xor.php, incluidas las dos funciones introducidas en la sección anterior.
En la línea 19, el valor de la contraseña cifrada se obtiene utilizando el nombre de usuario y la contraseña enviados por el usuario, y para los nuevos usuarios, este valor cifrado se almacena en la base de datos en la línea 44.
Además, para los usuarios antiguos, obtenga el nombre de usuario y la información de la contraseña cifrada en la base de datos en la línea 24, use estos dos valores para descifrar en la línea 25 y luego compare el valor descifrado con la información del nombre de usuario enviada por el usuario en la línea 28 para comprobar la legitimidad del usuario.
La parte anterior sobrela generación automática de claves
presentó cómo usar el algoritmo de cifrado XOR para cifrar la información del usuario. La información de la contraseña ingresada por el usuario en realidad se convierte en la clave en el algoritmo de cifrado, y el nombre de usuario se usa como texto sin formato. Muy Cumple bien la función, pero lógicamente este método parece un poco irrazonable.
Este artículo presentará una tecnología que genera claves automáticamente. Puede utilizar las claves generadas automáticamente para cifrar el texto sin formato de la contraseña enviada por el usuario, lo que hace que la lógica sea más razonable.
En este ejemplo, se supone que la clave generada es de 512 bits. El código es el siguiente.
1 <!--keygen.php: Generar claves automáticamente------------------------------------>
2 <?php
3
4 //Generar automáticamente una clave con longitud $len
5 función generar_key ($ len)
6 {
7 $límite inferior = 35;
8 $límite superior = 96;
9 $strMiClave = "";
10
11 para($i=1;$i<=$len;$i++)
12 {
13 $rnd=rand(0,100); //Generar números aleatorios
14 $k = (($límite superior - $límite inferior) + 1) * $rnd + $límite inferior;
15 $cadenaMiClave=$cadenaMiClave.$k;
16}
17 devuelve $strMyKey;
18}
19
20 //Escribe la clave del archivo $file_name
21 función write_key ($key,$file_name)
Veintidós {
23 $nombredearchivo="C:clave.txt";
24 $clave=generar_clave($clave,512);
25
26 //Abre $filename usando el modo agregar, el puntero del archivo estará al final del archivo
27 si(!$handle=fopen($nombre de archivo,'w'))
28 {
29 print "No se puede abrir el archivo $nombredearchivo";
30 salidas;
31}
32
33 //Escribe $key en el archivo que abrimos.
34 si (! fwrite ($ mango, $ clave))
35 {
36 print "No se puede escribir en el archivo $nombredearchivo";
37 salidas;
38 }
39 fclose($manejar);
40}
41
42 //Leer la clave en el archivo de claves
43 función get_key($nombre_archivo)
44 {
45 //Abrir archivo
46 $fp = fopen ($nombre_archivo, "r");
47 $resultado="";
48 //Leer línea por línea
49 mientras (!feof($fp))
50 {
51 $búfer = fgets($fp, 4096);
52 $resultado=$resultado.$buffer;
53}
54 devolver $resultado;
55 }
56
57 ///*
58 $KeyLocation = "C:key.txt" //Archivo para guardar la clave
59 $clave="123456";
60 write_key($clave,$UbicaciónClave);
61 echo get_key($KeyLocation);
62 //*/
63 ?>
El código incluye 3 funciones.
·generate_key($len): genera automáticamente una clave con longitud $len
·write_key($key,$file_name): escribe la clave en el archivo $file_name
·get_key($file_name): lee el archivo clave $file_name Cuando el valor de la clave
Se utiliza, cuando el usuario inicia sesión en el sistema por primera vez, el valor clave se genera automáticamente para el usuario. Hay dos formas de manejar este valor clave.
(1) Almacénelo en un campo determinado de la base de datos. La desventaja de este método es que no se puede garantizar la seguridad de la clave en la base de datos.
(2) Guarde la clave en el archivo local del usuario, de modo que esto evite la clave; de ser obtenido por otros, pero la desventaja de este método es que cuando los usuarios usan otras máquinas para acceder al sistema, no pueden iniciar sesión.
En este ejemplo, se utilizará el método 2.
Específicamente, las líneas 11 a 18 del código anterior generan claves continuamente generando números aleatorios y mejoran su complejidad mediante un cálculo. Los valores de límite inferior y superior son en realidad el rango de caracteres ASCII que desea utilizar para el cifrado. A continuación se muestra un ejemplo de un archivo de clave generado.
208123915925183361116049369344372701567721435181102718332639307390344373445407
524316475863232913993383189547474747394154915312639841226741894189965623523913
011164730113445201935692839710274127251577929493941487145611337531549110895367
593586318332391170941272701152344371709270125776235313540032267139933835677407
617384135696111239130732949469623520815987524358635491542913374933524334454251
400327015367133759324537171709152357391089524342514685239122673135531363151191
833412771743139654…
最后,需要把密钥保存在服务器上一个安全的地方,然后就可以利用其和诸如XOR这样的加密算法来对用户信息进行加密/解密了。 Cómo utilizar esta clave en el XOR presentado en la sección anterior es muy simple y no se describirá en detalle. 2 páginas en total. 9 7 1 2