English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Présentation simple de XOR : XOR est une opérations de bit binaire basée, représentée par les symboles XOR ou ^, ses règles d'opération sont que pour chaque bit binaire des nombres opérés, si les valeurs sont identiques, elles prennent 0, et si elles sont différentes, elles prennent1.
Comprendre simplement, c'est une addition sans carry, comme1+1=0,0+0=0,1+0=0=1.
Description des besoins
Dans l'ère de l'information, le cryptage des données est un sujet très important, pendant la réalisation du projet, j'ai également mis en œuvre un algorithme de cryptage complexe, mais en raison de la confidentialité des technologies impliquées, je présente ici une version plus simple, utilisant les flux d'entrée et de sortie du fichier et l'opération XOR pour crypter n'importe quel fichier, concernant l'algorithme de décodage, c'est très simple, réfléchissez-y et vous le résoudrez.
Principes mathématiques
Ce cryptage utilise la fonction XOR de deux nombres, parlons d'abord simplement du principe de XOR, XOR est en réalité une opération sur le codage binaire du fichier, pour faire simple, c'est-à-dire que lorsque deux bits binaires sont identiques, ils deviennent 0, et s'ils sont différents, ils deviennent1Voyons l'exemple suivant :
//7représentation binaire : 00000111 //2représentation binaire : 00000010 //Le résultat du XOR des deux : 00000101 //c'est-à-dire le nombre5 //--------------------------- //le résultat du XOR est à nouveau et2XOR //5représentation binaire : 00000101 //2représentation binaire : 00000010 //Le résultat du XOR des deux : 00000111 //c'est-à-dire7n'est-ce pas incroyable de revenir7n'est-ce pas ?
Mise en œuvre du code
import java.io.*; class FileSecret { public static void main(String[] args) throws Exception { //Trouver le fichier à chiffrer, le lecteur doit être spécifié, l'entrée et la sortie ne doivent pas être sur le même lecteur File inFile = new File("盘符:\\加密的文件"); //Le fichier à chiffrer sera exporté vers le lecteur spécifié File outFile = new File("盘符:\\解密的文件"); //Établir un canal de données, permettre aux données binaires de l'image d'entrer FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //En cours de lecture, lire les données XOR avec un nombre, ce nombre devrait être généré par un algorithme de chiffrement, ici je ne fais qu'éditer un nombre simple928(mon anniversaire), puis effectuer une opération XOR, puis sortir les données obtenues int content = 0 ; //Cette variable est utilisée pour stocker les données lues, bien sûr, ici on peut utiliser des types de données plus longs comme long, bien sûr, nous pouvons également utiliser d'autres types de données, tant que les types de données aux deux extrémités peuvent être convertis mutuellement, au moins ils peuvent être convertis par force while((content=input.read())!=})-1) // Si vous n'êtes pas encore à la fin du fichier, continuez à lire les données, les données lues sont déjà stockées dans la variable content-1Pour le symbole de fin de fichier { output.write(content^928); //Écrire dans le flux de sortie } //Fermer les ressources input.close(); output.close(); } }
Évaluation de la fonctionnalité du code
Pour ce segment de code, la fonctionnalité est généralement suffisante pour répondre aux besoins, mais il existe des insuffisances, la première est qu'aucun algorithme de cryptage n'est utilisé pour générer l'autre côté du XOR, la deuxième est que je n'ai pas mis en œuvre le décodage du fichier, en réalité, le décodage est très simple, lisez attentivement la partie des principes mathématiques pour savoir comment écrire l'algorithme de décodage, en réalité, le cryptage et le décodage ne sont pas réalisés en même temps, mais sont tous deux utilisent le même algorithme de cryptage pour effectuer les calculs.
Amélioration de l'algorithme par un nombre aléatoire
Dans le processus ci-dessus, nous utilisons effectivement une valeur donnée pour XOR avec le fichier binaire que nous lisons, alors pouvons-nous remplacer cette convention par un nombre aléatoire ? La réponse est oui, d'abord nous utilisons une variable de type int pour stocker, alors la plage de représentation est : positive et négative21Les chiffres binaires d'un milliard peuvent être représentés, voici le code spécifique :
//Méthode de génération de nombres aléatoires import java.util.*; public class RandomTest{ public static void main(String[] args){ Random random = new Random(); int num = random.nextInt(11);//représente la production de 0-10Entre ces nombres aléatoires, ce nombre généré devrait être sauvegardé, pour que les crypteurs et les décodeurs puissent l'utiliser System.out.println("Le nombre aléatoire est : "+num); } }
Algorithme de cryptage amélioré
Code côté cryptage :
import java.io.*; import java.util.*; class FileSecret { public static void main(String[] args) throws Exception { //Trouver le fichier à chiffrer, le lecteur doit être spécifié, l'entrée et la sortie ne doivent pas être sur le même lecteur File inFile = new File("盘符:\\加密的文件"); //Le fichier à chiffrer sera exporté vers le lecteur spécifié File outFile = new File("盘符:\\解密的文件"); //Établir un canal de données, permettre aux données binaires de l'image d'entrer FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //Produire un autre nombre aléatoire pour le XOR de cryptage Random random = new Random(); int num = random.nextInt(11); //représente la production de 0-10Entre ces nombres aléatoires, ce nombre généré devrait être sauvegardé, pour que les crypteurs et les décodeurs puissent l'utiliser System.out.println("Le nombre aléatoire est : "+num); //En cours de lecture, lire les données XOR avec un nombre, ce nombre devrait être généré par un algorithme de chiffrement, ici je ne fais qu'éditer un nombre simple928(mon anniversaire), puis effectuer une opération XOR, puis sortir les données obtenues int content = 0 ; //Cette variable est utilisée pour stocker les données lues, bien sûr, ici on peut utiliser des types de données plus longs comme long, bien sûr, nous pouvons également utiliser d'autres types de données, tant que les types de données aux deux extrémités peuvent être convertis mutuellement, au moins ils peuvent être convertis par force while((content=input.read())!=})-1) // Si vous n'êtes pas encore à la fin du fichier, continuez à lire les données, les données lues sont déjà stockées dans la variable content-1Pour le symbole de fin de fichier { output.write(content^num); //Écrire dans le flux de sortie } //Fermer les ressources input.close(); output.close(); } }
Le côté cryptage doit informer le côté déchiffrement du num généré dans le code ci-dessus, sinon il ne peut pas réaliser le déchiffrement du fichier.
Code côté déchiffrement :
import java.io.*; class FileSecret { public static void main(String[] args) throws Exception { //Trouver le fichier à chiffrer, le lecteur doit être spécifié, l'entrée et la sortie ne doivent pas être sur le même lecteur File inFile = new File("盘符:\\加密的文件"); //Le fichier à chiffrer sera exporté vers le lecteur spécifié File outFile = new File("盘符:\\解密的文件"); //Établir un canal de données, permettre aux données binaires de l'image d'entrer FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //En cours de lecture, lire les données XOR avec un nombre, ce nombre devrait être généré par un algorithme de chiffrement, ici je ne fais qu'éditer un nombre simple928(mon anniversaire), puis effectuer une opération XOR, puis sortir les données obtenues int content = 0 ; //Cette variable est utilisée pour stocker les données lues, bien sûr, ici on peut utiliser des types de données plus longs comme long, bien sûr, nous pouvons également utiliser d'autres types de données, tant que les types de données aux deux extrémités peuvent être convertis mutuellement, au moins ils peuvent être convertis par force while((content=input.read())!=})-1) // Si vous n'êtes pas encore à la fin du fichier, continuez à lire les données, les données lues sont déjà stockées dans la variable content-1Pour le symbole de fin de fichier { output.write(content ^ le nombre de chiffrement reçu de l'extrémité de chiffrement); //Écrire dans le flux de sortie } //Fermer les ressources input.close(); output.close(); } }
Encore une amélioration
En réalité, dans notre code, le mot de passe standard devrait être généré de manière aléatoire et contenir des lettres, des chiffres et divers symboles. Alors, comment générons-nous une telle chaîne de mot de passe ? Après avoir généré une telle chaîne de mot de passe, comment la transformons-nous en code binaire ? Voici une idée : en utilisant les expressions régulières Java, vous pouvez générer une chaîne que vous voulez, puis utiliser la méthode de conversion de chaîne pour générer le code binaire correspondant. J'ai réalisé une méthode de génération de mot de passe extrêmement complexe, mais je ne peux pas la rendre publique, car cela concerne les documents du projet de laboratoire, et il y a également beaucoup d'algorithmes de cryptographie classiques qui peuvent être utilisés dans le domaine de la cryptographie.
Résumé
C'est tout le contenu de cet article sur les opérations XOR en Java, les principes de chiffrement de fichiers arbitraires et l'explication d'utilisation. J'espère que cela peut vous aider. Les amis intéressés peuvent continuer à consulter ce site :
Exemple de code d'algorithmes de chiffrement et de déchiffrement simples utilisant l'opérateur XOR en Java
Exemple de code de calcul XOR de chaîne hexadécimale en Java
Analyse du code de problème XOR en Java
Bienvenue pour laisser des commentaires sur des points insuffisants. Merci de votre soutien à ce site !
Déclaration : Le contenu de cet article est issu du réseau, propriété de ses auteurs respectifs, contribué et téléversé par les utilisateurs d'Internet. Ce site ne détient pas de droits de propriété, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique connexe. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)