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 использует разные методы для чтения / записи двоичных файлов и текстовых файлов. Использование текстового метода в двоичном файле или наоборот даст неверные результаты.

Другие вопросы по тегам