[PHP][位轉換積累]之異或運算的簡單加密應用


異或的符號是^。按位異或運算, 對等長二進制模式按位或二進制數的每一位執行邏輯按位異或操作. 操作的結果是如果某位不同則該位為1, 否則該位為0.
xor運算的逆運算是它本身,也就是說兩次異或同一個數最后結果不變,即(a xor b) xor b = a。xor運算可以用於簡單的加密,比如我想對我MM說1314520,但怕別人知道,於是雙方約定拿我的生日19880516作為密鑰。1314520 xor 19880516 = 20665500,我就把20665500告訴MM。MM再次計算20665500 xor 19880516的值,得到1314520,於是她就明白了我的企圖。
相同位不同則為1,相同則為0。
00101
11100
(^或者xor)
----------------
11001
運算結果
x <- x # y
y <- x @ y
x <- x @ y
執行了第一句后x變成了x # y。那么第二句實質就是y <- x # y @ y,由於#和@互為逆運算,那么此時的y變成了原來的x。第三句中x實際上被賦值為(x # y) @ x,如果#運算具有交換律,那么賦值后x就變成最初的y了。這三句話的結果是,x和y的位置互換了。
通過這個原理運用PHP可實現簡單高效的加密
function xorencrypt( $str, $key ){
	$slen = strlen( $str );
	$klen = strlen( $key );
	$cipher = '';
	for ($i=0;$i<$slen;$i=$i+$klen) {
		$cipher .= substr( $str, $i, $klen )^$key;
	}
	return $cipher;
}

接收端實現簡單的解密

function xordecrypt( $str, $key ){
	$slen = strlen( $str );
	$klen = strlen( $key );
	$plain = '';
	for ($i=0;$i<$slen;$i=$i+$klen) {
		$plain .= $key^substr( $str, $i, $klen );
	}
	return $plain;
}

 


免責聲明!

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



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