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

Spiegazione dettagliata del principio e dell'uso della crittografia XOR in Java

Introduzione a XOR: XOR è un'operazione di bit binari basata su, simboleggiato con XOR o ^, il suo algoritmo di calcolo è che per ogni bit binario degli operandi, se sono uguali, il risultato è 0, e se sono diversi, il risultato è 1.

Capisco semplicemente come somma senza carry, come 1+1=0, 0+0=0, 1+0=1.

Descrizione delle esigenze

Nell'era dell'informazione, criptare i dati è un argomento molto importante, nel processo di progetto, ho implementato anche un algoritmo di crittografia piuttosto complesso, ma a causa della riservatezza delle tecnologie coinvolte, qui implemento una versione relativamente semplice, utilizzando lo stream di input/output del file e l'operazione XOR per crittografare qualsiasi file, riguardo all'algoritmo di decrittografia, è molto semplice, rifletti su di esso e puoi risolverlo.

Principio matematico

Questa crittografia utilizza la funzione XOR di due numeri, per spiegare semplicemente il principio di XOR, XOR è un'operazione sui codici binari dei file, in altre parole, quando due bit binari sono uguali, il risultato è 0, e quando sono diversi, il risultato è 1, vediamo un esempio sottostante:

//Rappresentazione binaria di 7:
00000111
//Rappresentazione binaria di 2:
00000010
//Il risultato dell'esclusione XOR tra i due:
00000101 // ovvero il numero 5
//---------------------------
//Il risultato ottenuto viene nuovamente XOR con 2
//Rappresentazione binaria di 5:
00000101
//Rappresentazione binaria di 2:
00000010
//Il risultato dell'esclusione XOR tra i due:
00000111 // ovvero 7, non è incredibile che sia tornato a 7?

Implementazione del codice

import java.io.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//Troviamo il file da crittografare, specifica il disco di destinazione, non è necessario che l'input e l'output siano sullo stesso disco
		File inFile = new File("Percorso:\\Il file crittografato");
		//Il file da crittografare viene output al disco di destinazione specificato
		File outFile = new File("Percorso:\\Il file decifrato");
		//Estableciamo un canale di dati, in modo che i dati binari dell'immagine possano fluire
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//Durante la lettura, XOR il dato letto con un numero, questo numero dovrebbe essere generato da un qualche algoritmo di crittografia, qui ho semplicemente scritto un numero 928 (il mio compleanno) e poi XOR, il dato ottenuto viene output
		int content = 0 ;
		//Il variabile viene utilizzato per memorizzare i dati letti, ovviamente qui possiamo utilizzare tipi di dati più lunghi come long, possiamo anche utilizzare altri tipi di dati, purché i tipi di dati alle estremità possano essere convertiti l'uno nell'altro, almeno essere convertiti forzatamente
		while((content=input.read())!=-1) // Se non è alla fine del file, continua a leggere i dati, i dati letti sono stati memorizzati nella variabile content, -1 è il segno di fine del file}}
		{
			output.write(content^928);
			//Scrivi nel flusso di output
		}
		//Chiudi le risorse
		input.close();
		output.close();
	}
}

Valutazione della funzione del codice

Per questo codice, la funzione è in generale in grado di soddisfare le esigenze, ma esiste una lacuna, primo: non viene utilizzato un algoritmo di crittografia per generare l'altro numero XOR, secondo: non ho implementato la decrittografia del file, in realtà la decrittografia è molto semplice, leggi attentamente la parte della teoria matematica per sapere come scrivere l'algoritmo di decrittografia, in realtà la crittografia e la decrittografia non vengono implementate nello stesso luogo, ma entrambi utilizzano lo stesso algoritmo di crittografia per eseguire l'operazione.

Miglioramento dell'algoritmo con numeri casuali

Nel processo precedente, abbiamo effettivamente utilizzato un valore fornito per eseguire l'esclusione XOR con il file binario che abbiamo letto, quindi possiamo sostituire questo accordo con un numero casuale? La risposta è sì, prima di tutto utilizziamo una variabile di tipo int per memorizzare, quindi la gamma che può essere rappresentata è: numeri negativi e positivi di 2,1 miliardi, il codice specifico è come segue:

//Metodo per generare numeri casuali
import java.util.*;
public class RandomTest{
 public static void main(String[] args){
  Random random = new Random();
  int num = random.nextInt(11); //Rappresenta la generazione di numeri casuali tra 0 e 10, questo numero casuale dovrebbe essere salvato, per l'uso da parte di chi crittografa e decrittografa
  System.out.println("Numero casuale: " + num);
 }
}

Algoritmo di crittografia migliorato

Codice del lato crittografante:

import java.io.*;
import java.util.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//Troviamo il file da crittografare, specifica il disco di destinazione, non è necessario che l'input e l'output siano sullo stesso disco
		File inFile = new File("Percorso:\\Il file crittografato");
		//Il file da crittografare viene output al disco di destinazione specificato
		File outFile = new File("Percorso:\\Il file decifrato");
		//Estableciamo un canale di dati, in modo che i dati binari dell'immagine possano fluire
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//Genera un altro numero XOR per la crittografia
		Random random = new Random();
		int num = random.nextInt(11);
		//Rappresenta la generazione di numeri casuali tra 0 e 10, questo numero casuale dovrebbe essere salvato, per l'uso da parte di chi crittografa e decrittografa
		System.out.println("Numero casuale: " + num);
		//Durante la lettura, XOR il dato letto con un numero, questo numero dovrebbe essere generato da un qualche algoritmo di crittografia, qui ho semplicemente scritto un numero 928 (il mio compleanno) e poi XOR, il dato ottenuto viene output
		int content = 0 ;
		//Il variabile viene utilizzato per memorizzare i dati letti, ovviamente qui possiamo utilizzare tipi di dati più lunghi come long, possiamo anche utilizzare altri tipi di dati, purché i tipi di dati alle estremità possano essere convertiti l'uno nell'altro, almeno essere convertiti forzatamente
		while((content=input.read())!=-1) // Se non è alla fine del file, continua a leggere i dati, i dati letti sono stati memorizzati nella variabile content, -1 è il segno di fine del file}}
		{
			output.write(content^num);
			//Scrivi nel flusso di output
		}
		//Chiudi le risorse
		input.close();
		output.close();
	}
}

Il lato crittografante deve comunicare il numero generato dal codice sopra alla parte decrittografante, altrimenti non è possibile decrittografare il file.

Codice del lato decrittografante:

import java.io.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//Troviamo il file da crittografare, specifica il disco di destinazione, non è necessario che l'input e l'output siano sullo stesso disco
		File inFile = new File("Percorso:\\Il file crittografato");
		//Il file da crittografare viene output al disco di destinazione specificato
		File outFile = new File("Percorso:\\Il file decifrato");
		//Estableciamo un canale di dati, in modo che i dati binari dell'immagine possano fluire
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//Durante la lettura, XOR il dato letto con un numero, questo numero dovrebbe essere generato da un qualche algoritmo di crittografia, qui ho semplicemente scritto un numero 928 (il mio compleanno) e poi XOR, il dato ottenuto viene output
		int content = 0 ;
		//Il variabile viene utilizzato per memorizzare i dati letti, ovviamente qui possiamo utilizzare tipi di dati più lunghi come long, possiamo anche utilizzare altri tipi di dati, purché i tipi di dati alle estremità possano essere convertiti l'uno nell'altro, almeno essere convertiti forzatamente
		while((content=input.read())!=-1) // Se non è alla fine del file, continua a leggere i dati, i dati letti sono stati memorizzati nella variabile content, -1 è il segno di fine del file}}
		{
			output.write(content^il numero crittografico trasmesso dall'estremità crittografica);
			//Scrivi nel flusso di output
		}
		//Chiudi le risorse
		input.close();
		output.close();
	}
}

Ancora una volta migliorato

In realtà, nel nostro codice, la chiave di crittografia standard dovrebbe essere generata in modo casuale e dovrebbe includere lettere, numeri e vari simboli. Allora come generiamo questa stringa di crittografia? Dopo aver generato questa stringa di crittografia, come la trasformiamo in codice binario? Fornisco un'idea: possiamo utilizzare l'espressione regolare di Java per generare qualsiasi stringa desiderata e poi utilizzare il metodo di conversione della stringa per generare il codice binario corrispondente. Ho implementato un metodo di generazione di crittografia estremamente complesso, ma non posso pubblicarlo, poiché riguarda i materiali del progetto del laboratorio e ci sono molte classiche algoritmi di crittografia nel campo della crittografia che possono essere utilizzati.

Sommario

Questo è tutto il contenuto riguardante la tecnica XOR in Java per la crittografia di qualsiasi file e la sua spiegazione dettagliata in questo articolo. Spero che sia utile a tutti. Chi è interessato può continuare a consultare il nostro sito:

Esempio di codice di implementazione di un algoritmo di crittografia e decrittografia semplice utilizzando l'operazione XOR in Java

Esempio di codice per l'esecuzione dell'operazione XOR su una stringa esadecimale in Java

Analisi del codice del problema XOR in Java

Se c'è qualcosa che non va, ti preghiamo di lasciare un commento. Grazie per il supporto dei nostri amici!

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, di proprietà del rispettivo autore. Il contenuto è stato contribuito volontariamente dagli utenti di Internet e caricato autonomamente. Questo sito non detiene i diritti di proprietà e non ha effettuato alcuna modifica editoriale, né assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a notice#oldtoolbag.com (sostituisci # con @) per segnalare il problema, fornendo prove pertinenti. Una volta verificata la veridicità, questo sito rimuoverà immediatamente i contenuti sospetti.

Ti potrebbe interessare