gpt4 book ai didi

java - 我的 XOR 加密的 java 类实现出了问题

转载 作者:行者123 更新时间:2023-12-02 08:01:00 25 4
gpt4 key购买 nike

我是java新手,但我对C++和C#非常流利,尤其是C#。我知道如何在 C# 和 C++ 中进行异或加密。问题是我用 Java 编写的用于实现异或加密的算法似乎产生了错误的结果。结果通常是一堆空格,我确信这是错误的。这是下面的类:

public final class Encrypter {

public static String EncryptString(String input, String key)
{


int length;
int index = 0, index2 = 0;
byte[] ibytes = input.getBytes();
byte[] kbytes = key.getBytes();
length = kbytes.length;
char[] output = new char[ibytes.length];
for(byte b : ibytes)
{
if (index == length)
{
index = 0;

}
int val = (b ^ kbytes[index]);
output[index2] = (char)val;
index++;
index2++;
}


return new String(output);
}
public static String DecryptString(String input, String key)
{
int length;
int index = 0, index2 = 0;
byte[] ibytes = input.getBytes();
byte[] kbytes = key.getBytes();
length = kbytes.length;
char[] output = new char[ibytes.length];
for(byte b : ibytes)
{
if (index == length)
{
index = 0;

}
int val = (b ^ kbytes[index]);
output[index2] = (char)val;
index++;
index2++;
}


return new String(output);
}
}

最佳答案

Java 中的字符串是 Unicode - 并且 Unicode 字符串不像 ASCII 字符串那样是字节的通用持有者。

您正在获取一个字符串并将其转换为字节,而无需指定所需的字符编码,因此您将获得平台默认编码 - 可能是 US-ASCII、UTF-8 或 Windows 代码页之一。

然后您将对这些字节执行算术/逻辑运算。 (我没有看过你在这里做什么 - 你说你知道算法。)

最后,您将获取这些转换后的字节并尝试将它们转回字符串 - 即转回字符。同样,您还没有指定字符编码(但是您将得到与将字符转换为字节相同的结果,所以没关系),但是,最重要的是......

除非您的平台默认编码每个字符使用一个字节(例如 US-ASCII),否则并非您将生成的所有字节序列都代表有效字符。

因此,有两条建议:

  1. 不要使用字符串作为字节的一般持有者
  2. 在字节和字符之间转换时,始终指定字符编码。

在这种情况下,如果您专门指定 US-ASCII 作为编码,您可能会取得更大的成功。编辑:最后一句话不正确(请参阅下面的评论)。回到上面的第1点!当您需要字节时,请使用字节,而不是字符。

关于java - 我的 XOR 加密的 java 类实现出了问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8902738/

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