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 world"));
//字符串解碼
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 world"));
}

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

{
"-do-not-delete-":"second"
}
編碼結果:果沒眼,有看見如以眼我定眼如見一定沒我看可我有果看見看沒也以見有
源碼下載

作者:lance_小超
鏈接:https://www.jianshu.com/p/47d8c41132f8
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

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



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