前言:
這幾天被公司臨時拉到去做Android IM即時通訊協議實現,大致看了下他們定的協議,由於之前沒有參與,據說因伺服器效能限制,只達成非明文傳遞,具體原因我不太清楚,不過這裡用的加密方式是採用異或加密。這種加密方式在之前做Android加密記事本的時候採用過這種加密方式。今天已經把客戶端心跳維持、資料包解析對接完了,總結一下這種加密方式。
其他幾種加密方式:
什麼是異或加密?
異或運算中,如果某個字元(或數值)x 與 一個數值m 進行異或運算得到y,則再用y 與 m 進行異或運算就可以還原為 x ,因此應用這個原理可以實現資料的加密解密功能。
異或運算使用場景?
-
兩個變數的互換(不借助第三個變數)
-
資料的簡單加密解密
異或加密解密實現?
1.固定key的方式
這種方式加密解密 演算法一樣
public byte[] encrypt(byte[] bytes) { if (bytes == null) { return null; } int len = bytes.length; int key = 0x12; for (int i = 0; i < len; i++) { bytes[i] ^= key; } return bytes; }
測試加密解密
byte[] bytes = encrypt("whoislcj".getBytes());//加密 String str1 = new String(encrypt(bytes));//解密
2.不固定key的方式
加密實現
public byte[] encrypt(byte[] bytes) { if (bytes == null) { return null; } int len = bytes.length; int key = 0x12; for (int i = 0; i < len; i++) { bytes[i] = (byte) (bytes[i] ^ key); key = bytes[i]; } return bytes; }
解密實現
public byte[] decrypt(byte[] bytes) { if (bytes == null) { return null; } int len = bytes.length; int key = 0x12; for (int i = len - 1; i > 0; i--) { bytes[i] = (byte) (bytes[i] ^ bytes[i - 1]); } bytes[0] = (byte) (bytes[0] ^ key); return bytes; }
測試
byte[] bytes = encrypt("whoislcj".getBytes());//加密 String str1 = new String(decrypt(bytes));//解密
總結:
位運算可以實現很多高階,高效的運算。比如說加密,乘法中的n次方就是右移n位,速度還快。IM二進位制資料包採用異或演算法第一能夠實現加密,第二採用異或加密演算法不會改變二進位制資料的長度這對二進位制資料包封包起到不小的好處。故作此總結。