расшифровать с помощью XOR JAVA, работающего только на первой строке - PullRequest
0 голосов
/ 29 ноября 2018

Я работаю над назначением обработки файла / каталога и зашифровал файл (в шестнадцатеричный формат, затем XOR).Файл, который мне нужно расшифровать, находится в шестнадцатеричном формате, поэтому мне нужно расшифровать, затем в шестнадцатеричном виде.Однако только первая строка моего файла расшифровывается правильно (ключ короче файла, поэтому он повторяется, следовательно, keyItr) Это код шифрования:

String encrypHexa="";
Scanner x = new Scanner(f);
while(x.hasNext()){
String a= x.nextLine();
int keyItr=0;
for (int i=0; i<a.length();i++){
//XOR
int temp = a.charAt(i) ^ key.charAt(keyItr);             
encrypHexa += String.format("%02x",(byte)temp);                     
keyItr++;      
if(keyItr==key.length()){ 
                keyItr=0;                                       }                                            }
        } System.out.println("Encrypted is: " +encrypHexa);

Это код расшифровки:

String hexiToDeci="";

Scanner x = new Scanner(f);

while(x.hasNext()){

String a= x.nextLine();

for (int i=0;i<a.length()-1;i+=2){

String output=a.substring(i,i+2);

int decimal = Integer.parseInt(output,16);

hexiToDeci += (char)decimal;

}
                                                    //Decrypt with XOR
int keyItr=0;
for (int i=0; i<hexiToDeci.length();i++){
//XOR
int temp = hexiToDeci.charAt(i) ^ key.charAt(keyItr);
decrypText +=(char)temp;                                                         keyItr++;
                                                        if(keyItr==key.length()){                                                             keyItr=0;                                                    }                                                    }
}
System.out.println("Encrypted is: " +decrypText);

ввод:

new new new new
old old old old

в зашифрованном виде: 3f1212521a1c024901152c115c56533e1b01521b151149001c3f115d5f40:

new new new new?4d,H1wyMe$*)e

проверено с ключом: Qwertyuiop [123 $ 4 56 $1013 *

1 Ответ

0 голосов
/ 29 ноября 2018

У вас есть int keyItr = 0 внутри цикла while в вашей функции шифрования, поэтому он сбрасывается в конце каждой строки исходного текста.Однако в функции дешифрования, поскольку зашифрованный текст представляет собой одну строку без разрыва, цикл while никогда не повторяется и keyItr сбрасывается только после достижения предела.

Так что переместите инициализацию keyItr доцикл while в вашей функции шифрования, и он больше не даст вам мусора.Но расшифрованный текст все равно не будет точным воспроизведением исходного текста, потому что новые строки в исходном тексте поглощаются шифрованием Scanner.Чтобы избежать этого, либо:

a) Если исходные файлы имеют небольшой размер, используйте символ EOF в качестве разделителя сканера для шифрования.

[ИЛИ]

b) Добавление вручнуюновая строка в вашей функции шифрования, перед тем как вы зашифруете так:

...
String a = x.nextLine();
// Add this if
if (x.hasNext()) {
    a += System.lineSeparator();
}
for (int i=0; i<a.length();i++){
...

Вот демо

PS: Пожалуйста, close() ваши Scanner с!

...