這幾天被公司臨時拉到去作Android IM即時通訊協議實現,大體看了下他們定的協議,因爲以前沒有參與,聽說因服務器性能限制,只達成非明文傳遞,具體緣由我不太清楚,不過這裏用的加密方式是採用異或加密。這種加密方式在以前作Android加密記事本的時候採用過這種加密方式。今天已經把客戶端心跳維持、數據包解析對接完了,總結一下這種加密方式。html
其餘幾種加密方式:算法
異或運算中,若是某個字符(或數值)x 與 一個數值m 進行異或運算獲得y,則再用y 與 m 進行異或運算就能夠還原爲 x ,所以應用這個原理能夠實現數據的加密解密功能。spa
兩個變量的互換(不借助第三個變量)code
數據的簡單加密解密
這種方式加密解密 算法同樣
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));//解密
加密實現
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二進制數據包採用異或算法第一可以實現加密,第二採用異或加密算法不會改變二進制數據的長度這對二進制數據包封包起到不小的好處。故做此總結。