5.2.1 原理——异或不变

“xor是指异或,异或的运算规则是相同为0,不同为1。因为在二进制条件下,每位的取值只有0或1两种,运算的结果如表1。”

“这里只是0或1,如果是比较大的数呢?”古风不解的问道。

“你的意思是像 10 xor 7 这样,不仅是二进制条件下的运算吧?”老师说道,“xor就会先把10和7转化成二进制形式,然后按照上面的规则对每一位进行运算。”

“比如10 xor 7,就会先转化成二进制数,10=(1010)B;7=(0111)B;然后每一位对应异或。”

“从低位到高位,运算依次就是0 xor 1=1;1 xor 1=0;0 xor 1=1;1 xor 0=1。如图5-1。”

“所以,10 xor 7=(1010)B xor (0111)B=(1101)B=13。”老师写出了答案。

“哦,原来是这样运算啊!怎么用于编码呢?”

“根据运算规则,对于某个值X,我们选择任意密钥Key,都有如下等式成立。”

X xor Key=Z Z xor Key=X ====> X xor Key xor Key=X

“即,一个值对同一个数异或两次后,得到的结果为原值。”老师解释道。

“抽象啊……”

“举个例子吧!比如 10 xor 7 xor 7 。刚才我们已经推出10 xor 7=13;如果再次异或,就是13 xor 7,又恢复了原来的值10。计算过程如图5-2。”

“哦,是这样啊!是不是我们选一个key,对ShellCode进行两次xor运算,然后对它进行编解码呢?”同学们问道。

“嗯,就是这样的。”老师回答道,“确切的说,我们选一个key,编码是将ShellCode和这个key作一次xor运算,得到enShellCode;解码……大家想想?”

“那解码就是enShellCode和key再作一次xor运算,又重新得到ShellCode。”小倩高兴的说。

“非常正确,我们来看看如何实现吧!”