您的位置:首页 > 编程语言 > Java开发

Java 两个中文字符串异或问题

2018-02-08 10:38 751 查看
为了项目需要,之前没做过异或加密的我在网上看了很多这类的文章,一开始异或成功了,可是突然有一天字符串里面要加中文,然后莫名的就编码错误,无效的编码,苍了天了,又看了一些资料,基本上没怎么提过中文的问题,于是乎又开始新一轮试验。
前期代码是这样子的:
/**
* xor操作
* @param h 加密串
* @param key 密钥
* @return
*/
public static String eh(String h,String key) {
int l1 = h.length();
int l2 = key.length();
String r = "";
for (int i = 0; i < l1; i = i + l2) {
int j = i + l2;
if (j >= h.length())
j = h.length();
r += xor(h.substring(i, j), key);
}
String s = Base64.encodeToString(r.getBytes(), Base64.DEFAULT);
return s;
}

public static String xor(String s1, String s2) {
byte b1[] = s1.getBytes();
byte b2[] = s2.getBytes();
byte lb[], sb[];
lb = b1.length >= b2.length ? b1 : b2;
sb = b1.length >= b2.length ? b2 : b1;
byte rb[] = new byte[sb.length];
int i = 0;
for (; i < sb.length; i++) {
rb[i] = (byte) (sb[i] ^ lb[i]);
}
return new String(rb);
}
这段是key的字符串如果短一点话需要对加密的字符串进行截取与key做xor运算,并且拼装每一段结果。
这段代码在没有中文的时候是没问题的,有了中文编码问题以后,代码改成了这样。
/**
* xor加密
* @param str
* @return
*/
public static String XorEncryptAndBaseNew(String str) {
LogUtil.i("post headData = "+str);
byte[] b1 = str.getBytes();
byte[] b2 = Constants.DEBUG_HEAD_KEY.getBytes();
byte[] out = new byte[b1.length];
for (int i = 0; i < b1.length; i++) {
out[i] = (byte) (b1[i] ^ b2[i % b2.length]);
}
return android.util.Base64.encodeToString(out, android.util.Base64.NO_WRAP);
}
返回的时候还加了个base64编码,简单明了还不会有编码问题。
如果要做两个字符串加密的话 直接用后者就行。
参考文章:http://blog.csdn.net/yin_jw/article/details/47422439
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 异或 中文编码