English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Kurze Einführung in XOR: XOR ist eine auf dem Binärcode basierende Bit-Operation, die mit dem Symbol XOR oder ^ dargestellt wird. Die Operationssätze sind, dass für jede binäre Stelle der beiden Operanden, gleiche Werte 0 und verschiedene Werte1.
einfach gesagt ist das keine Vorzeichenverteilung, wie1+1=0,0+0=0,1+0=0=1.
Beschreibung der Anforderungen
In der Ära der Informationstechnologie ist die Verschlüsselung von Daten ein sehr wichtiger Themenbereich. Während der Projektarbeit habe ich einen relativ komplexen Verschlüsselungsalgorithmus implementiert, aber da die beteiligten Technologien geheim sind, werde ich hier eine einfachere Version implementieren, die die Eingabe- und Ausgabestrom der Datei und den XOR-Operation verwendet, um jede Datei zu verschlüsseln. In Bezug auf den Entschlüsselungsalgorithmus ist es sehr einfach, selbst nachzudenken, um eine Lösung zu finden.
Mathematische Prinzipien
Dieser Verschlüsselungsalgorithmus nutzt die Funktion des XORs von zwei Zahlen. Um es einfacher zu erklären, lass mich die Prinzipien des XOR kurz erläutern. XOR ist im Grunde eine Operation an den binären Codierungen der Datei. Einfach gesagt, wenn zwei binäre Stellen gleich sind, wird 0 genommen, und wenn sie unterschiedlich sind, wird1Sehen Sie sich das folgende Beispiel an:
//7binäres Darstellung: 00000111 //2binäres Darstellung: 00000010 //Das Ergebnis des XORs der beiden: 00000101 //das ist5 //--------------------------- //Das Ergebnis des XORs wird erneut mit2XOR //5binäres Darstellung: 00000101 //2binäres Darstellung: 00000010 //Das Ergebnis des XORs der beiden: 00000111 //das ist7ist es nicht wieder erstaunlich, dass es zurückgekehrt ist7also?
Umsetzung des Codes
import java.io.*; class FileSecret { public static void main(String[] args) throws Exception { //Finden Sie die Datei, die verschlüsselt werden soll, und legen Sie den Laufwerksbuchstaben selbst fest, die Eingabe- und Ausgabedateien müssen nicht auf demselben Laufwerk sein File inFile = new File("Laufwerk:\\verschlüsselte Datei"); //Der zu verschlüsselnde Datei wird auf das angegebene Laufwerk ausgegeben File outFile = new File("Laufwerk:\\entverschlüsselter Datei"); //Ein Datenkanal wird eingerichtet, um die binären Daten des Bildes einzuführen FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //Während des Lesens wird das gelesene Daten XOR mit einer Nummer, die durch eine bestimmte Verschlüsselungsalgorithmus generiert werden sollte, hier wird nur eine einfache Nummer erstellt928(mein Geburtstag), dann XOR ausführen und die erhaltenen Daten ausgeben int content = 0 ; //Diese Variable wird verwendet, um die gelesenen Daten zu speichern. Natürlich können hier längere Datentypen wie long verwendet werden. Natürlich können auch andere Datentypen verwendet werden, solange die Datentypen an den ^-Enden miteinander umgewandelt werden können, mindestens müssen sie in einen强制类型转换 umwandlungsfähig sein while((content=input.read())!=})-1) // Wenn das Ende der Datei noch nicht erreicht ist, werden Daten fortlaufend gelesen, und die gelesenen Daten werden in der Variable content gespeichert.-1Für den Dateiende { output.write(content^928); //In die Ausgabestreamdatei schreiben } //Ressourcen schließen input.close(); output.close(); } }
Bewertung der Funktionalität des Codes
Für diesen Code ist die Funktion im Allgemeinen bereits ausreichend, um die Anforderungen zu erfüllen, aber es gibt einige Mängel. Erstens wird keine Verschlüsselungsalgorithmus verwendet, um die andere Seite des XOR zu generieren. Zweitens habe ich die Entschlüsselung des Dateis nicht implementiert. Tatsächlich ist die Entschlüsselung sehr einfach, lesen Sie bitte das mathematische Prinzip sorgfältig durch, um zu verstehen, wie man den Entschlüsselungsalgorithmus schreibt. Tatsächlich werden Verschlüsselung und Entschlüsselung nicht gleichzeitig an derselben Stelle implementiert, sondern werden beide mit dem gleichen Verschlüsselungsalgorithmus berechnet.
Verwendung von Zufallszahlen zur Verbesserung des Algorithmus
Im Verlauf des obigen Prozesses verwenden wir tatsächlich einen gegebenen Wert, um ihn mit der gelesenen Binärdatei zu XOR zu verknüpfen. Können wir diese Vereinbarung durch eine Zufallszahl ersetzen? Die Antwort ist ja, zunächst verwenden wir int-Typ-Variablen, um den Bereich zu speichern: Positiv und Negativ21Billionen von darstellbaren Zahlen, das spezifische Code wie folgt:
//Methode zum Erzeugen von Zufallszahlen import java.util.*; public class RandomTest{ public static void main(String[] args){ Random random = new Random(); int num = random.nextInt(11);//stellt 0 dar-10Zwischen den Zufallszahlen, die generierte Zufallszahl sollten wir speichern können, für den Verschlüsselung und Entschlüsselung zu verwenden System.out.println("Zufallszahl: "+num); } }
Verbesserte Verschlüsselungsalgorithmus
Code für die Verschlüsselungsebene:
import java.io.*; import java.util.*; class FileSecret { public static void main(String[] args) throws Exception { //Finden Sie die Datei, die verschlüsselt werden soll, und legen Sie den Laufwerksbuchstaben selbst fest, die Eingabe- und Ausgabedateien müssen nicht auf demselben Laufwerk sein File inFile = new File("Laufwerk:\\verschlüsselte Datei"); //Der zu verschlüsselnde Datei wird auf das angegebene Laufwerk ausgegeben File outFile = new File("Laufwerk:\\entverschlüsselter Datei"); //Ein Datenkanal wird eingerichtet, um die binären Daten des Bildes einzuführen FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //Erzeugen eines anderen Zufallszahlen für die Verschlüsselung XOR Random random = new Random(); int num = random.nextInt(11); //stellt 0 dar-10Zwischen den Zufallszahlen, die generierte Zufallszahl sollten wir speichern können, für den Verschlüsselung und Entschlüsselung zu verwenden System.out.println("Zufallszahl: "+num); //Während des Lesens wird das gelesene Daten XOR mit einer Nummer, die durch eine bestimmte Verschlüsselungsalgorithmus generiert werden sollte, hier wird nur eine einfache Nummer erstellt928(mein Geburtstag), dann XOR ausführen und die erhaltenen Daten ausgeben int content = 0 ; //Diese Variable wird verwendet, um die gelesenen Daten zu speichern. Natürlich können hier längere Datentypen wie long verwendet werden. Natürlich können auch andere Datentypen verwendet werden, solange die Datentypen an den ^-Enden miteinander umgewandelt werden können, mindestens müssen sie in einen强制类型转换 umwandlungsfähig sein while((content=input.read())!=})-1) // Wenn das Ende der Datei noch nicht erreicht ist, werden Daten fortlaufend gelesen, und die gelesenen Daten werden in der Variable content gespeichert.-1Für den Dateiende { output.write(content^num); //In die Ausgabestreamdatei schreiben } //Ressourcen schließen input.close(); output.close(); } }
Der Verschlüsselungsebene muss die Nummer, die im obigen Code generiert wurde, der Entschlüsselungsebene mitgeteilt werden, andernfalls kann die Datei nicht entsperrt werden.
Code für die Entschlüsselungsebene:
import java.io.*; class FileSecret { public static void main(String[] args) throws Exception { //Finden Sie die Datei, die verschlüsselt werden soll, und legen Sie den Laufwerksbuchstaben selbst fest, die Eingabe- und Ausgabedateien müssen nicht auf demselben Laufwerk sein File inFile = new File("Laufwerk:\\verschlüsselte Datei"); //Der zu verschlüsselnde Datei wird auf das angegebene Laufwerk ausgegeben File outFile = new File("Laufwerk:\\entverschlüsselter Datei"); //Ein Datenkanal wird eingerichtet, um die binären Daten des Bildes einzuführen FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //Während des Lesens wird das gelesene Daten XOR mit einer Nummer, die durch eine bestimmte Verschlüsselungsalgorithmus generiert werden sollte, hier wird nur eine einfache Nummer erstellt928(mein Geburtstag), dann XOR ausführen und die erhaltenen Daten ausgeben int content = 0 ; //Diese Variable wird verwendet, um die gelesenen Daten zu speichern. Natürlich können hier längere Datentypen wie long verwendet werden. Natürlich können auch andere Datentypen verwendet werden, solange die Datentypen an den ^-Enden miteinander umgewandelt werden können, mindestens müssen sie in einen强制类型转换 umwandlungsfähig sein while((content=input.read())!=})-1) // Wenn das Ende der Datei noch nicht erreicht ist, werden Daten fortlaufend gelesen, und die gelesenen Daten werden in der Variable content gespeichert.-1Für den Dateiende { output.write(content ^ vom Verschlüsselungsendpunkt übermittelte verschlüsselte Nummer); //In die Ausgabestreamdatei schreiben } //Ressourcen schließen input.close(); output.close(); } }
Noch einmal verbessert
Tatsächlich sollte in unserem Code der Standardverschlüsselungsschlüssel zufällig generiert werden und Symbole wie Buchstaben und Ziffern enthalten. Wie können wir so einen Verschlüsselungsschlüssel generieren? Was passiert nach der Generierung des Verschlüsselungsschlüssels, wenn er in Binärcode umgewandelt wird? Bietet eine Überlegung: Mit Java kann ein reguläres Muster verwendet werden, um jede gewünschte Zeichenkette zu generieren, und dann kann der entsprechende Binärcode durch eine String-Konvertierungsmethode generiert werden. Ich habe eine äußerst komplexe Methode zur Generierung von Verschlüsselungsschlüsseln implementiert, aber sie kann nicht öffentlich gemacht werden, da sie sich auf Materialien des Laborprojekts bezieht, und es gibt viele klassische Verschlüsselungsalgorithmen im Bereich der Kryptographie, die ebenfalls genutzt werden können.
Zusammenfassung
Das ist das Ende des Inhalts dieses Artikels über die XOR-Technik in Java, einschließlich der Prinzipien und Verwendung zur Verschlüsselung von Dateien. Hoffentlich ist es für alle nützlich. Interessierte Freunde können weiterhin die Website konsultieren:
Beispielcode für einfache Verschlüsselungs- und Entschlüsselungsalgorithmen mit XOR-Operation in Java
Code-Beispiel für XOR-Operation auf Hexadezimalstrings in Java
Code-Analyse des XOR-Problems in Java
Bitte hinterlassen Sie Ihre Kommentare, wenn Sie etwas verbessern können. Vielen Dank, dass Sie die Unterstützung dieser Website zeigen!
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtlichem Eigentümer. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie verdächtige Urheberrechtsinhalte entdecken, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @, wenn Sie eine E-Mail senden, um zu melden, und fügen Sie relevante Beweise bei. Sobald überprüft, wird die Website den涉嫌侵权的内 容立即删除。)