爲了項目需要,之前沒做過異或加密的我在網上看了很多這類的文章,一開始異或成功了,可是突然有一天字符串裏面要加中文,然後莫名的就編碼錯誤,無效的編碼,蒼了天了,又看了一些資料,基本上沒怎麼提過中文的問題,於是乎又開始新一輪試驗。
前期代碼是這樣子的:
/**
* 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