仅在第一行使用XOR JAVA解密

时间:2018-11-29 19:02:12

标签: java encryption 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 $ 567]  我在做什么错了??

1 个答案:

答案 0 :(得分:2)

您的加密功能的int keyItr = 0循环内有while,因此它将在源文本的每一行的末尾重置。但是,在解密功能中,由于加密的文本只是一行而没有间断,因此while循环永远不会重复,keyItr只会在达到限制后重置。

因此,将keyItr初始化移到加密函数的while循环之前,它将不再给您带来垃圾。但是解密后的文本仍然不能完全复制源文本,因为源文本中的换行符被加密的Scanner吞没了。为避免这种情况,请执行以下操作之一:

a)如果源文件很小,请使用EOF字符作为加密扫描程序的定界符。

[OR]

b)像这样进行加密之前,请在加密函数中手动添加换行符:

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

Here is a demo

P.S:请close() Scanner个!