gpt4 book ai didi

java - 在 JAVA 中异或两个字符串

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:34:06 27 4
gpt4 key购买 nike

我正在尝试加密一个字符串,其中一部分是将文本与 IV 字符串进行异或。在遇到一些困难之后,我最终进入了 stackoverflow,其中一个人给出了以下代码:

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;

public class StringXORer {

public String encode(String s, String key) {
return base64Encode(xorWithKey(s.getBytes(), key.getBytes()));
}

public String decode(String s, String key) {
return new String(xorWithKey(base64Decode(s), key.getBytes()));
}

private byte[] xorWithKey(byte[] a, byte[] key) {
byte[] out = new byte[a.length];
for (int i = 0; i < a.length; i++) {
out[i] = (byte) (a[i] ^ key[i%key.length]);
}
return out;
}

private byte[] base64Decode(String s) {
try {
BASE64Decoder d = new BASE64Decoder();
return d.decodeBuffer(s);
} catch (IOException e) {throw new RuntimeException(e);}
}

private String base64Encode(byte[] bytes) {
BASE64Encoder enc = new BASE64Encoder();
return enc.encode(bytes).replaceAll("\\s", "");

}
}

除了 2 个问题外,它似乎有效:结果字符串变长。当试图在“abcdefgh”和“abcdefgh”之间进行异或时,我得到:“aaaaaaaaaaaa”。其次,两个相同字符串的结果变为“aaaa ....” - 字符串“a”s ....

所以这两个问题是:

  1. 为什么结果字符串变长了?
  2. 为什么相同字符串之间的异或结果由“a”列表组成...?

这是作业,感谢任何帮助。

谢谢!

最佳答案

字符串变长是因为除了与 key 异或外,它是Base64编码。

将对 base64Encode(...) 的调用替换为 new String(...) 并将对 base64Decode(s) 的调用替换为 s.getBytes() 以获得原始异或字符串。但请注意,编码后的字符串在打印时看起来不太好。与自身异或的字符串将包含 \0 个字符,打印为空白。

即使在该更改之后,getBytes() 也有可能返回一个比字符串长度更长的字节数组,具体取决于平台默认字符集。例如。 UTF-8 将字符 >= 128 编码为两个或三个字节。使用 ISO-8859-1 作为字符集,字符 <= 255 和字节一一对应。同样,new String(...)可能无法生成预期的字符,因为给定的字节对于平台默认编码无效。

关于java - 在 JAVA 中异或两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10216314/

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