異或的符號是^。按位異或運算, 對等長二進制模式按位或二進制數的每一位執行邏輯按位異或操作. 操作的結果是如果某位不同則該位為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; }