gpt4 book ai didi

java - 使用 XOR JAVA 解密仅在第一行工作

转载 作者:行者123 更新时间:2023-11-30 01:58:46 30 4
gpt4 key购买 nike

我正在处理文件/目录处理任务,并且我对文件进行了加密(先是十六进制,然后是异或)。我需要解密的文件是十六进制的,所以我需要解密然后是十六进制。但是,只有我的文件的第一行被正确解密。( key 比文件短,因此它会重复,因此 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

使用 key 进行测试:Qwertyuiop[123$4$567] 我做错了什么???

最佳答案

您的加密函数中的 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()您的扫描仪!

关于java - 使用 XOR JAVA 解密仅在第一行工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53545882/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com