有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

仅在第一行使用XOR JAVA进行加密解密

我正在处理一个文件/目录处理分配,我对文件进行了加密(先是十六进制,然后是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

加密: 3F1212521A1C024901152C115C56533E1B01521B15114901C3F115D5F40 输出:

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

使用密钥测试:Qwertyuiop[123$4$567] 我做错了什么


共 (1) 个答案

  1. # 1 楼答案

    在加密函数的while循环中有int keyItr = 0,因此它在源文本的每一行末尾都会被重置。然而,在解密函数中,由于加密文本只是一行,没有中断,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++){
    ...
    

    Here is a demo

    附言:请close()你的Scanner