Java XOR шифрует двоичные файлы
У меня есть приложение для шифрования текстовых файлов с помощью XOR. Теперь мне нужно изменить его для кодирования двоичных файлов (таких как jpegs), используя другие двоичные файлы (в качестве ключа). Как я могу это сделать? Это имеет что-то общее с двоичным смещением? Мне это нужно в учебных целях. Фрагмент моего кода, отвечающий за шифрование текста:
ДЕЙСТВИЯ КЛАССА:
import javax.swing.JFileChooser;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Actions extends GuiElements {
final JFileChooser fc = new JFileChooser("D:");
final JFileChooser fc1 = new JFileChooser("D:");
public Actions() {
btnLoad.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Handle open button action.
if (e.getSource() == btnLoad) {
int returnVal = fc.showOpenDialog(Actions.this);
if (returnVal == JFileChooser.APPROVE_OPTION){
File file = fc.getSelectedFile();
String content = file.toString();
FileReader reader = null;
try{
reader = new FileReader(content);
}
catch (FileNotFoundException e1){
e1.printStackTrace();
}
BufferedReader br = new BufferedReader(reader);
try{
textArea.read(br, null);
}
catch (IOException e1) {
e1.printStackTrace();
}
try{
br.close();
}
catch (IOException e1) {
e1.printStackTrace();
}
textArea.requestFocus();
}
else{
}
}
}
});
btnCipher.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent click) {
String textToCipher = textArea.getText();
String cipherKey = textField.getText();
String cipheredText = "";
int xor;
char temp;
for (int i=0; i<textToCipher.length(); i++){
xor = textToCipher.charAt(i) ^ cipherKey.charAt(i % cipherKey.length());
temp = (char)xor;
cipheredText += temp;
}
textArea.setText(cipheredText);
}
});
btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String textTosave = textArea.getText();
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("D:"));
int retrival = chooser.showSaveDialog(null);
if (retrival == JFileChooser.APPROVE_OPTION) {
try {
FileWriter fw = new FileWriter(chooser.getSelectedFile());
String cont = textArea.getText();
String content = cont.toString();
fw.write(content);
fw.flush();
fw.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
};
});
}
}
1 ответ
У вас есть два входных двоичных файла: файл ключа и файл открытого текста. У вас есть один выходной файл, файл зашифрованного текста, который вы пишете и который также является двоичным. Файл ключа должен быть не меньше, чем текстовый файл.
repeat
p <- read byte from plaintext binary file
k <- read byte from key binary file
c <- p XOR k
write byte c to cyphertext binary file
until all bytes read from plaintext file
Вы говорите, что ваши предыдущие усилия использовали текстовые файлы. Имейте в виду, что Java использует разные методы для чтения / записи двоичных файлов и текстовых файлов. Использование текстового метода в двоичном файле или наоборот даст неверные результаты.