作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试加密一个字符串,其中一部分是将文本与 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 ....
所以这两个问题是:
这是作业,感谢任何帮助。
谢谢!
最佳答案
字符串变长是因为除了与 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/
我是一名优秀的程序员,十分优秀!