XOR présente brièvement: XOR est une opération de bit binaire, représentée par le symbole xor ou ^. Son algorithme consiste à utiliser la même valeur à 0 et 1 pour chaque bit binaire du nombre des deux côtés de l'opérateur.
Une compréhension simple consiste à ajouter sans transporter, comme 1 + 1 = 0, 0 + 0 = 0, 1 + 0 = 1.
Description des exigences
Le chiffrement des données à l'ère de l'information est un sujet très important. Au cours du processus de réalisation du projet, j'ai également mis en œuvre un algorithme de chiffrement relativement complexe. Cependant, comme la technologie impliquée est confidentielle, j'ai implémenté une version relativement simple ici, en utilisant les flux d'entrée et de sortie de fichiers et les opérations XOR pour chiffrer les fichiers arbitraires. En ce qui concerne l'algorithme de décryptage, il est très simple et peut être résolu en y pensant vous-même.
Principes de mathématiques
Cet algorithme de chiffrement utilise la fonction de deux nombres xor. Parlons brièvement du principe de Xor. XOR est en fait une opération de codage binaire d'un fichier. Autrement dit, lorsque les deux bits binaires sont les mêmes, il est 0 et non 1 en même temps. Voir l'exemple suivant:
// Représentation binaire de 7: 00000111 // Représentation binaire de 2: 00000010 // le résultat obtenu par le XOR des deux: 00000101 // le résultat obtenu par le numéro 5 // -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Implémentation de code
Importer java.io. *; Class FileSecret {public static void main (String [] args) lève une exception {// trouver le fichier à crypter, spécifiez la lettre de lecteur vous-même, et les entrées et les sorties n'ont pas besoin d'être dans le même fichier de lettres de lecteur infilé = nouveau fichier ("Drive Letter: // Encrypteted File"); // Sortie le fichier à encriner à la lettre de lecteur spécifiée à l'extérieur = " Letter: // Fichier décrypté "); // Créez un canal de données pour permettre aux données binaires de l'image de circuler dans FileInputStream Input = new FileInputStream (Infile); FileOutputStream output = new FileOutputStream (outfile); // Dans le processus de lecture, la lecture des données xor est un nombre. Ce numéro doit être généré par une sorte d'algorithme de chiffrement. Ici, je compile simplement un nombre 928 (mon anniversaire), puis je pratique un exclusif ou et je publie les données obtenues int contenu = 0; // Cette variable est utilisée pour stocker les données de lecture. Bien sûr, des types de données plus longs tels que longtemps peuvent être utilisés ici. Bien sûr, nous pouvons également utiliser d'autres types de données. Satisfaire simplement les types de données aux deux extrémités de ^ qui peuvent être convertis les uns aux autres, au moins il peut être coulé pendant ((contenu = input.read ())! = - 1) // Si la fin du fichier n'est pas atteinte, puis continuez à lire les données et que les données de lecture ont été stockées dans la variable de contenu. -1 est le caractère final du fichier {output.write (Content ^ 928); // Écrivez dans le flux de fichiers de sortie} // Fermez la ressource input.close (); output.close ();}}Évaluation de la fonction de code
Pour ce code, la fonction peut essentiellement répondre aux besoins, mais il y a des lacunes. Tout d'abord, l'algorithme de chiffrement n'est pas utilisé pour générer l'autre extrémité du numéro XOR, et deuxièmement, je n'ai pas implémenté le décryptage du fichier. En fait, le déchiffrement est très simple. Veuillez lire attentivement la partie du principe mathématique et vous pouvez savoir comment rédiger l'algorithme de décryptage. En fait, le chiffrement et le déchiffrement ne sont pas mis en œuvre en même temps au même endroit, mais le cryptage est calculé en utilisant le même algorithme de cryptage.
Algorithme amélioré à l'aide de nombres aléatoires
Dans le processus ci-dessus, nous utilisons en fait une valeur donnée pour effectuer XOR avec le fichier binaire que nous lisons. Pouvons-nous donc utiliser un nombre aléatoire pour remplacer cette convention? La réponse est oui. Tout d'abord, nous utilisons des variables de type int pour les stocker. La plage qui peut être représentée est: Plus ou moins 2,1 milliards de nombres représentables. Le code spécifique est le suivant:
// Méthodes pour générer des nombres aléatoires imports java.util. *; Public class randomTest {public static void main (string [] args) {random random = new random (); int num = random.nextint (11); // indique qu'un nombre aléatoire entre 0-10 est généré. Nous devrions être en mesure d'enregistrer le nombre aléatoire généré pour le chiffrement et les décrypteurs pour utiliser System.out.println ("Le nombre aléatoire est:" + num); }}Algorithme de chiffrement amélioré
Code de chiffrement:
Importer java.io. *; Importer java.util. *; class FichierCret {public static void main (String [] args) lève une exception {// trouver le fichier à crypter, spécifiez la lettre de lecteur vous-même, et la entrée et la sortie ne doivent pas être dans le même fichier de lettres de lecteur infilé = nouveau fichier (Driver: //crypted wetter "); // = nouveau fichier ("Driver: // Fichier décrypté"); // Créer un canal de données pour permettre aux données binaires de l'image de circuler dans FileInputStream Input = new FileInputStream (Infile); FileOutputStream outputTeam = new FileOutputStream (OutFile); // un autre nombre qui génère Encrypted xor Random = New Random (); int num = Random.Next (11); est généré. Nous devrions être en mesure d'enregistrer le nombre aléatoire généré pour le chiffrement et les décrypteurs pour utiliser System.out.println ("Le nombre aléatoire est:" + num); // Dans le processus de lecture, les données de lecture seront XOR un nombre, qui devraient être générées par une sorte d'algorithme de chiffrement. Ici, je compile simplement un nombre 928 (mon anniversaire), puis je réalise XOR, et je publie les données obtenues int contenu = 0; // Cette variable est utilisée pour stocker les données de lecture. Bien sûr, des types de données plus longs tels que longtemps peuvent être utilisés ici. Bien sûr, nous pouvons également utiliser d'autres types de données. Nous avons seulement besoin de satisfaire les types de données aux deux extrémités de ^ pour nous convertir, et au moins la conversion de type de distribution peut être effectuée pendant ((contenu = input.read ())! = - 1) // Si elle n'est pas atteinte à la fin du fichier, puis continuez à lire les données, et les données de lecture ont été stockées dans la variable de contenu. -1 est le caractère final du fichier {Output.Write (Content ^ num); // Écrivez au flux de fichiers de sortie} // Fermez la ressource input.close (); output.close ();}}Le côté cryptage doit éclairer le côté de décryptage du num généré dans le code ci-dessus, sinon le décryptage du fichier ne peut pas être implémenté.
Code de décryptage:
Importer java.io. *; Class FileSecret {public static void main (String [] args) lève une exception {// trouver le fichier à crypter, spécifiez la lettre de lecteur vous-même, et les entrées et les sorties n'ont pas besoin d'être dans le même fichier de lettres de lecteur infilé = nouveau fichier ("Drive Letter: // Encrypteted File"); // Sortie le fichier à encriner à la lettre de lecteur spécifiée à l'extérieur = " Letter: // Fichier décrypté "); // Créez un canal de données pour permettre aux données binaires de l'image de circuler dans FileInputStream Input = new FileInputStream (Infile); FileOutputStream output = new FileOutputStream (outfile); // Dans le processus de lecture, la lecture des données xor est un nombre. Ce numéro doit être généré par une sorte d'algorithme de chiffrement. Ici, je compile simplement un nombre 928 (mon anniversaire), puis je pratique un exclusif ou et je publie les données obtenues int contenu = 0; // Cette variable est utilisée pour stocker les données de lecture. Bien sûr, des types de données plus longs tels que longtemps peuvent être utilisés ici. Bien sûr, nous pouvons également utiliser d'autres types de données. Satisfaire simplement les types de données aux deux extrémités de ^ qui peuvent être convertis les uns aux autres, au moins il peut être coulé pendant ((contenu = input.read ())! = - 1) // Si la fin du fichier n'est pas atteinte, puis continuez à lire les données et que les données de lecture ont été stockées dans la variable de contenu. -1 est le caractère final du fichier {output.write (contenu ^ numéro crypté transmis à partir de la fin de cryptage); // Écrivez au flux de fichiers de sortie} // ferme la ressource input.close (); output.close ();}}Amélioré à nouveau
En fait, dans notre code, le code de cryptage standard doit être généré au hasard et contient divers symboles tels que des lettres et des nombres. Alors, comment générer une telle chaîne de chiffrement? Comment convertir une telle chaîne de chiffrement en code binaire après l'avoir généré? Fournir une idée: l'utilisation d'expressions régulières Java peut générer n'importe quelle chaîne souhaitée, puis utiliser la méthode de conversion de chaîne pour générer le code binaire correspondant. J'ai moi-même implémenté une méthode de génération de chiffrement extrêmement complexe, mais elle ne peut pas être divulguée. Cela implique les informations des projets de laboratoire, et il existe de nombreux domaines de la cryptographie et de nombreux algorithmes de cryptage classiques qui peuvent également être utilisés.
Résumer
Ce qui précède est tout le contenu de cet article sur l'explication détaillée du principe de cryptage et l'utilisation de tout fichier dans l'opération Java XOR. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à ce site:
Java utilise l'opération XOR pour implémenter le code d'instance d'algorithme de chiffrement et de décryptage
Code d'implémentation de programmation Java Exemple d'exor ou d'opération sur les chaînes hexadécimales
Analyse du code de problème XOR en Java
S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!