English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Principio y explicación detallada de la operación de XOR en Java para cifrar cualquier archivo

Introducción simple de XOR: XOR es una operación de bits basada en binario, representada por el símbolo XOR o ^, sus reglas de operación son que para cada bit binario de los números operados, si son iguales, se toma 0, y si son diferentes1.

Entenderlo de manera sencilla es una adición sin carry, como1+1=0,0+0=0,1+0=0=1.

Descripción de las necesidades

En la era de la información, la cifrado de datos es un tema muy importante, en el proceso de realización del proyecto, también implementé un algoritmo de cifrado bastante complejo, pero debido a que la tecnología involucrada es secreta, aquí implemento una versión más simple, que utiliza el flujo de entrada y salida de archivos y la operación de XOR para cifrar cualquier archivo, sobre el algoritmo de descifrado, es muy simple, piense en él y puede resolverlo.

Principios matemáticos

Este algoritmo de cifrado utiliza la función de XOR de dos números, hablemos primero del principio del XOR, el XOR realmente realiza operaciones en la codificación binaria del archivo, para decirlo de manera sencilla, es cuando dos bits binarios son iguales, se toma 0, y cuando son diferentes1Vea el siguiente ejemplo:

//7representación en binario:
00000111
//2representación en binario:
00000010
//El resultado del XOR de ambos:
00000101 //es decir, el número5
//---------------------------
//El resultado del XOR nuevamente con2XOR
//5representación en binario:
00000101
//2representación en binario:
00000010
//El resultado del XOR de ambos:
00000111 //es decir7¿No es sorprendente que vuelva a7¿verdad?

Implementación del código

import java.io.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//Encuentra el archivo a cifrar, especifica el disco por ti mismo, no es necesario que la entrada y salida estén en el mismo disco
		File inFile = new File("unidad:\\el archivo cifrado");
		//El archivo a cifrar se exporta al disco de destino especificado
		File outFile = new File("unidad:\\el archivo desencriptado");
		//Establece un canal de datos, permitiendo que los datos binarios de la imagen fluyan
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//En el proceso de lectura, realiza una XOR con un número leído, este número debe ser generado por algún algoritmo de cifrado, aquí simplemente escribo un número928(mi cumpleaños), luego realiza una XOR, y salida los datos obtenidos
		int content = 0 ;
		//Esta variable se utiliza para almacenar los datos leídos, por supuesto, aquí se puede usar tipos de datos más largos como long, por supuesto, también se puede usar otros tipos de datos, siempre y cuando los tipos de datos en ambos extremos puedan ser convertidos entre sí, al menos se puede realizar una conversión forzada de tipo
		while((content=input.read())!=})-1) // Si no ha llegado al final del archivo, continúe leyendo los datos, los datos leídos se almacenan en la variable content-1Para el marcador de final de archivo
		{
			output.write(content^928);
			//Escribir en el flujo de salida
		}
		//Cerrar recursos
		input.close();
		output.close();
	}
}

Evaluación de la función del código

Para este código, la función básica ya puede satisfacer las necesidades, pero hay deficiencias, primero no se utiliza un algoritmo de cifrado para generar el otro número XOR, segundo no he implementado la descifrado de archivos, en realidad el descifrado es muy simple, simplemente lea la parte de principios matemáticos y sabrá cómo escribir el algoritmo de descifrado, en realidad, el cifrado y la descifrado no se implementan en el mismo lugar al mismo tiempo, sino que ambos utilizan el mismo algoritmo de cifrado para realizar operaciones.

Mejora del algoritmo con números aleatorios

En el proceso anterior, en realidad estamos utilizando un valor dado para realizar una operación de XOR con el archivo binario que leemos, ¿podemos reemplazar este acuerdo con un número aleatorio? La respuesta es sí, primero estamos utilizando una variable de tipo int para almacenar, por lo que el rango que puede representar es: positivo y negativo21representan el número de dígitos que se pueden representar, el código específico es el siguiente:

//Método para generar números aleatorios
import java.util.*;
public class RandomTest{
 public static void main(String[] args){
  Random random = new Random();
  int num = random.nextInt(11);//representa 0-10entre los números aleatorios, este número aleatorio deberíamos poderlo guardar, para que el cifrador y el desencriptador puedan usarlo
  System.out.println("Número aleatorio: "+num);
 }
}

Algoritmo de cifrado mejorado

Código del extremo de cifrado:

import java.io.*;
import java.util.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//Encuentra el archivo a cifrar, especifica el disco por ti mismo, no es necesario que la entrada y salida estén en el mismo disco
		File inFile = new File("unidad:\\el archivo cifrado");
		//El archivo a cifrar se exporta al disco de destino especificado
		File outFile = new File("unidad:\\el archivo desencriptado");
		//Establece un canal de datos, permitiendo que los datos binarios de la imagen fluyan
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//Genera otro número para la XOR de cifrado
		Random random = new Random();
		int num = random.nextInt(11);
		//representa 0-10entre los números aleatorios, este número aleatorio deberíamos poderlo guardar, para que el cifrador y el desencriptador puedan usarlo
		System.out.println("Número aleatorio: "+num);
		//En el proceso de lectura, realiza una XOR con un número leído, este número debe ser generado por algún algoritmo de cifrado, aquí simplemente escribo un número928(mi cumpleaños), luego realiza una XOR, y salida los datos obtenidos
		int content = 0 ;
		//Esta variable se utiliza para almacenar los datos leídos, por supuesto, aquí se puede usar tipos de datos más largos como long, por supuesto, también se puede usar otros tipos de datos, siempre y cuando los tipos de datos en ambos extremos puedan ser convertidos entre sí, al menos se puede realizar una conversión forzada de tipo
		while((content=input.read())!=})-1) // Si no ha llegado al final del archivo, continúe leyendo los datos, los datos leídos se almacenan en la variable content-1Para el marcador de final de archivo
		{
			output.write(content^num);
			//Escribir en el flujo de salida
		}
		//Cerrar recursos
		input.close();
		output.close();
	}
}

El extremo de cifrado necesita informar al extremo de desencriptación del número num generado en el código anterior, de lo contrario no se puede realizar la desencriptación del archivo.

Código del extremo de desencriptación:

import java.io.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//Encuentra el archivo a cifrar, especifica el disco por ti mismo, no es necesario que la entrada y salida estén en el mismo disco
		File inFile = new File("unidad:\\el archivo cifrado");
		//El archivo a cifrar se exporta al disco de destino especificado
		File outFile = new File("unidad:\\el archivo desencriptado");
		//Establece un canal de datos, permitiendo que los datos binarios de la imagen fluyan
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//En el proceso de lectura, realiza una XOR con un número leído, este número debe ser generado por algún algoritmo de cifrado, aquí simplemente escribo un número928(mi cumpleaños), luego realiza una XOR, y salida los datos obtenidos
		int content = 0 ;
		//Esta variable se utiliza para almacenar los datos leídos, por supuesto, aquí se puede usar tipos de datos más largos como long, por supuesto, también se puede usar otros tipos de datos, siempre y cuando los tipos de datos en ambos extremos puedan ser convertidos entre sí, al menos se puede realizar una conversión forzada de tipo
		while((content=input.read())!=})-1) // Si no ha llegado al final del archivo, continúe leyendo los datos, los datos leídos se almacenan en la variable content-1Para el marcador de final de archivo
		{
			output.write(content ^ número de cifrado recibido desde el extremo cifrado);
			//Escribir en el flujo de salida
		}
		//Cerrar recursos
		input.close();
		output.close();
	}
}

Mejora una vez más

En realidad, en nuestro código, la clave de cifrado debe ser generada aleatoriamente y debe contener letras, números y varios símbolos. ¿Cómo generamos tal cadena de cifrado? ¿Cómo se convierte esta cadena de cifrado en código binario? Proporciono una idea: puede usar expresiones regulares de Java para generar cualquier cadena que desee, y luego usar métodos de conversión de cadena para generar el código binario correspondiente. He implementado un método de generación de cifrado extremadamente complejo, pero no puedo hacerlo público, ya que involucra información de proyectos de laboratorio y hay muchos algoritmos de cifrado clásicos en el campo de la criptografía que también se pueden utilizar.

Resumen

Esto es todo sobre la explicación detallada de la lógica de cifrado de archivos aleatorios y el uso de XOR en Java en este artículo. Espero que sea útil para todos. Los amigos interesados pueden continuar consultando nuestro sitio:

Ejemplo de código de algoritmo de cifrado y descifrado simple utilizando XOR en Java

Ejemplo de código de implementación de operaciones de XOR de cadenas de hexadecimal en Java

Análisis de código de problemas de XOR en Java

¡Bienvenidos a dejar comentarios sobre deficiencias. ¡Gracias a todos los amigos por su apoyo a este sitio!

Declaración: El contenido de este artículo se ha obtenido de la red, y los derechos de autor pertenecen a los propietarios originales. El contenido ha sido contribuido y subido por usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume responsabilidad alguna por las leyes de derechos de autor. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar, y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará