【问题标题】:decrypt with XOR JAVA working on first line only仅在第一行使用 XOR JAVA 解密
【发布时间】:2018-11-29 19:02:12
【问题描述】:

我正在处理文件/目录处理分配,我加密了文件(先是十六进制,然后是 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] 我做错了什么???

【问题讨论】:

    标签: java encryption xor


    【解决方案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

    P.S:请close()你的Scanners!

    【讨论】:

    • 哇!感谢您不仅回答了问题,还解决了我的下一个问题!很好的解释和代码!
    • 我现在有另一个问题,它只是通过一些输入文件并突然停在同一个位置,没有错误或任何东西,完美的输出只是不是整个输出。有什么想法吗?
    • @Fatima 抱歉,信息不够。或许您可以发布一个新问题,并明确说明该问题和相关代码?
    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2022-12-06
    • 2017-12-18
    • 2011-04-23
    相关资源
    最近更新 更多