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
前期代码是这样子的:
/**
* 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实现字符串匹配问题之求两个字符串的最大公共子串
- java实现字符串匹配问题之求两个字符串的最大公共子串
- java中含中文字符串的编码和解码问题。
- java异或交换两个整数或字符串原理
- java中判断两个字符串是否相等的问题
- java中判断两个字符串是否相等的问题
- java两个站点之间url传中文乱码的问题
- java中判断两个字符串是否相等的问题
- Java中比较两个字符串是否相等的问题
- Java与C之间通过JNI传递中文字符串及乱码问题
- Java中比较两个字符串是否相等的问题
- JAVA与C++::关于JNI中文字符串操作问题总结
- java中含中文字符串的编码和解码问题
- java中判断两个字符串是否相等的问题
- java中判断两个字符串是否相等的问题
- JAVA与C++::关于JNI中文字符串操作问题总结
- java中判断两个字符串是否相等的问题
- java中判断两个字符串是否相等的问题
- java中判断两个字符串是否相等的问题
- java中含中文字符串的编码和解码问题。