Android數據加密之異或加密算法


前言:

      這幾天被公司臨時拉到去做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二進制數據包采用異或算法第一能夠實現加密,第二采用異或加密算法不會改變二進制數據的長度這對二進制數據包封包起到不小的好處。故作此總結。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM