JAVA加密系列(四)- 位運算加密

JAVA加密系列(四)- 位運算加密

位運算介紹

程序中的所有數在計算機內存中都是以二進制的形式儲存的。位運算就是直接對整數在內存中的二進制位進行操作。位運算雖說是語言的基礎,但是應用層基本很少有涉及到此,很多開發同學可能瞭解的不是蠻清楚,本文只對算法用的位運算做一個簡單介紹,其他運算符將一筆帶過,感興趣的可以在好好的深入學習一下

"^" 異或運算

相同爲0 不同爲1

例子 2^3=1

0010^0011=0001

"&" 與運算

只要有一個爲0,就爲0

例子 2&3=2

0010&0011=0010

">>>" 無符號右移

10進制轉二進制的時候,因爲二進制數一般分8位、 16位、32位以及64位 表示一個十進制數,所以在轉換過程中,最高位會補零。
在計算機中負數採用二進制的補碼錶示,10進制轉爲二進制得到的是源碼,將源碼按位取反得到的是反碼,反碼加1得到補碼
二進制的最高位是符號位,0表示正,1表示負。

其他算法符 "|"、"~"、">>"、"<<"...感興趣自己研究

使用異或寫對稱性加密

雖然安全性相對來說沒有AES等高,但是優點也是異常突出,加密速度比單向加密都快,消耗的性能非常的小。

public class SecurityUtil {

    public static void main(String[] args) {
        //字符串編碼
        System.out.println("編碼結果:"+encrypt("hello word"));
        //字符串解碼
        System.out.println("編碼結果:"+dencrypt("KSFaWC4VMl9GXA=="));
    }


    private final static byte[] ENCRYPT_VAL = {
            65, 68, 54, 52, 65, 53, 69, 48,
            52, 56, 57, 57, 69, 56, 56, 69,
            68, 48, 70, 55, 70, 50, 49, 51,
            65, 52, 68, 69, 54, 65, 53, 48
    };

    /**
     * 加密
     *
     * @param str
     * @return
     */
    public static String encrypt(String str) {
        byte[] bytes = str.getBytes();
        for (int i = 0; i < bytes.length; i++) {
            bytes[i] = (byte) (bytes[i] ^ ENCRYPT_VAL[i % ENCRYPT_VAL.length]);
        }
        return new String(Base64.getEncoder().encode(bytes));
    }

    /**
     * 解密
     *
     * @param str
     * @return
     */
    public static String dencrypt(String str) {
        byte[] bytes = Base64.getDecoder().decode(str);
        for (int i = 0; i < bytes.length; i++) {
            bytes[i] = (byte) (bytes[i] ^ ENCRYPT_VAL[i % ENCRYPT_VAL.length]);
        }
        return new String(bytes);
    }
}
log
編碼結果:KSFaWC4VMl9GXA==
編碼結果:hello word

使用位運算對MD5加密進行魔改

以下只是一個例子,拋轉引玉以下,大家可以隨意魔改,加密和驗證的邏輯一致即可

public class MD5Util {
    public static void main(String[] args) {
        //字符串編碼
        System.out.println("編碼結果:"+encryptMD5("hello word"));
    }

    /**
     * 16進制字符
     */
    static String[] chars ="如果我沒有眼睛,我也一定可以看見你迷人的美麗".split("");

    public static String encryptMD5(String str){
        try {
            byte[] bytes=str.getBytes();
            MessageDigest messageDigest=MessageDigest.getInstance("MD5");
            messageDigest.update(bytes);
            bytes = messageDigest.digest();
            // digest()最後確定返回md5 hash值,返回值爲8位字符串。因爲md5 hash值是16位的hex值,實際上就是8位的字符
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < bytes.length; i++) {

                // 一個字節對應兩個字符
                byte x = bytes[i];
                // 取得高位
                int h = 0x0f & (x >>> 4);
                // 取得低位
                int l = 0x0f & x;
                sb.append(chars[h]).append(chars[l]);
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }

}
log
編碼結果:果沒眼,有看見如以眼我定眼如見一定沒我看可我有果看見看沒也以見有

源碼下載

GitHub,感興趣的點個星星

詳情文章

結語

本次僅僅整理了各種算法的基本使用,後面有時間在來發布後續的各種算法的原理

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