异或加密与解密:异或如何能实现编码和解码?

异或的基本情况

首先说一下异或的概念、表示和计算等基本信息。

概念:通俗一点来讲,二进制非 0 即 1,如果是一位二进制之间做异或操作,相同的异或得到 0,不同的异或得到 1。再说的朴素一点,有点像曾经很火的游戏“大家来找茬”,异或只关注“不同”。

表示:作为数学符号,异或用 ⊕ \oplus 表示;程序语言中,c/c++ 和 python 都是 ^。

计算:上面说到概念的时候,用一位二进制来说的,如果是多位二进制的话,就按位操作,遇到位数不同的,位数少的那个二进制数前面(高位)补 0 使得位数一致。

异或的重要性质

十进制 — 3 位二进制数举例的话:

0 — 000
1 — 001
2 — 010
3 — 011
4 — 100
5 — 101
6 — 110
7 — 111

(下面式子没有明显标注十进制与二进制)

2 ⊕ 2 = 010 ⊕ 010 = 000 = 0 2 \oplus 2 = 010 \oplus 010 = 000 = 0 22=010010=000=0
解释:自身与自身异或 = 0,对嘛,自己跟自己哪儿哪儿都一样,没有不同所以得到 0。

2 ⊕ 0 = 010 ⊕ 000 = 010 = 1 2 \oplus 0 = 010 \oplus 000 = 010 = 1 20=010000=010=1
解释:任何值与 0 异或都会得到其本身
来的是 0,那跟我一样所以异或为 0 不变;来的要是 1,那跟我不一样所以异或为 1 还是不变。
0 这个数一点主意也没有,从来不抬杠,不管怎样就一句话:“随你~都好~”。

2 ⊕ 3 = 010 ⊕ 011 = 011 ⊕ 010 = 3 ⊕ 2 = 001 = 1 2 \oplus 3 = 010 \oplus 011 = 011 \oplus 010 = 3 \oplus 2 = 001 = 1 23=010011=011010=32=001=1
解释:符合交换律,很友好。

4 ⊕ 6 ⊕ 7 = ( 100 ⊕ 110 ) ⊕ 111 = 100 ⊕ ( 110 ⊕ 111 ) = 101 = 5 4 \oplus 6 \oplus 7 = (100 \oplus 110) \oplus 111 =100 \oplus (110 \oplus 111) = 101 = 5 467=(100110)111=100(110111)=101=5
解释:符合结合律,超友好~

4 ⊕ 6 ⊕ 4 = 6 ⊕ 4 ⊕ 4 = ( 100 ⊕ 110 ) ⊕ 100 = 110 = 6 4 \oplus 6 \oplus 4 = 6 \oplus 4 \oplus 4 = (100 \oplus 110) \oplus 100 = 110 = 6 464=644=(100110)100=110=6
解释:这条是我最感兴趣的,有的称这个性质叫“自反性”。

最想谈的解码与编码

仔细看其实这条性质可以通过前面几条性质推算得到,也就是先交换 6 和后面 4 的位置,然后再先算 4 和 4 异或得到 0,再计算 6 和 0 异或不变又得到 6。

这一点性质用来编码和解码(或者也可以说加密和解密)很有意思。编码可以理解为把原本的信息处理了一下变成了一个新的码;而解码是把刚刚说的新码逆过程回去得到原本的信息。

就像悬崖之上组织间交流的方式,为了不被敌方破获信息,把原本想说的话通过那本书对号写成一堆看起来乱七八糟的数字,然后传出去;自己人就知道再通过那本书翻译解码出来原本的信息。

还可以说是,发信人先把信息“锁”起来,哪怕被人看见了,只要他不会破解,诶信息还是安全的;只有到了同伴那里他才有正确的“钥匙”把信息解锁打开获得最原始的信息。

而上面例子里面异或的这个自反性,6 就是咱们真正要传递的信息,4 就是咱们的“锁”,我把 6 用 4 上锁得到 6 ⊕ 4 = 110 ⊕ 100 = 010 = 2 6\oplus4 = 110 \oplus 100 = 010 = 2 64=110100=010=2 ,然后我就把 2 跟贴小广告一样贴出去。自己人看见这玩意儿它就知道把 2 拿回去用“钥匙”开锁,这“钥匙”是谁呢?就是刚刚的“锁” 4,开锁过程就是 2 ⊕ 4 = 010 ⊕ 100 = 110 = 6 2\oplus 4 = 010 \oplus 100 = 110 = 6 24=010100=110=6,自己人就知道了,哦~原本信息是 6。

还想补充说的一点就是,虽然我上面用的锁和钥匙的例子来讲述异或运算编码解码的,但是日常生活中咱们都知道,一般来说一套锁和钥匙虽然肯定关联密切,可是怎么说也完全是两个东西,怎么你这里 4 又当锁又当钥匙呢?

我感觉还是可以自圆其说的,日常生活中一套锁和钥匙虽然不一样,可是他们也是“互补”的,只有合适的那个钥匙怼进锁里达成“互补”才能扭动开锁。那么为什么异或这里的锁和钥匙可以是一样的呢?我觉得正是因为二进制最简单也最不简单,非 0 即 1,非阴即阳,本身就有点“雌雄同体”的意思,所以二进制上做异或编码解码,锁就是钥匙,钥匙就是锁。这也正是异或编码解码很方便的原因,只要双方保存同一份锁/钥匙,就可以顺利编码和解码。简单~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值