Java 兩個中文字符串異或問題

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

前期代碼是這樣子的:

/**
     * 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章