逻辑运算之中,除了 AND 和 OR,还有一种 XOR 运算,中文称为"异或运算"。它的定义是:两个值相同时,返回false,否则返回true。也就是说,XOR可以用来判断两个值是否不同。


JavaScript 语言的二进制运算,有一个专门的 XOR 运算符,写作^。

如果两个二进制位相同,就返回0,表示false;否则返回1,表示true。

XOR 的应用
XOR 运算有一个很奇妙的特点:如果对一个值连续做两次 XOR,会返回这个值本身。

上面代码中,原始值是1010,再任意选择一个值(上例是1111),做两次 XOR,最后总是会得到原始值1010。这在数学上是很容易证明的。

加密应用
XOR 的这个特点,使得它可以用于信息的加密。

上面代码中,原始信息是message,密钥是key,第一次 XOR 会得到加密文本cipherText。对方拿到以后,再用key做一次 XOR 运算,就会还原得到message。

完美保密性
二战期间,各国为了电报加密,对密码学进行了大量的研究和实践,其中就包括 XOR 加密。
战后,美国数学家香农将他的研究成果公开发表,证明了只要满足两个条件,XOR 加密是无法破解的。

key的长度大于等于message
key必须是一次性的,且每次都要随机产生

理由很简单,如果每次的key都是随机的,那么产生的CipherText具有所有可能的值,而且是均匀分布,无法从CipherText看出message的任何特征。也就是说,它具有最大的"信息熵",因此完全不可能破解。这被称为 XOR 的"完美保密性"(perfect secrecy)。

满足上面两个条件的key,叫做 one-time pad(缩写为OTP),意思是"一次性密码本",因为以前这样的key都是印刷成密码本,每次使用的时候,必须从其中挑选key。

其中信息熵可以按以下通俗的理解

要理解信息熵,其实并不难,因为生活中无处不是信息熵的体现。比如,假设你是一个伪球迷,对各国家足球队实力一点都不了解,问你冠军赛两支队伍谁可能夺冠。首先经过你脑海的是,这两家国家队可能实力相当,用概率学的说法,即两支球队夺冠的概率都是50%,那么结果就像是掷硬币,正反靠天时地利人和,并无从考证——我们设定这种情景为A。这个时候,有个人跑过来和你说,他是一个足球评论员,对各足球对非常了解,然后告诉你此次冠军赛实力相差悬殊,德国队近来年表现优秀,主帅勒夫策略非凡,而另外一支队伍已经有很多届未进入世界杯总决赛了;基于这些不完整信息,作为伪球迷的你,心理肯定给德国队夺冠加分,假设这个时候你心理的夺冠概率变成了德国队80%的夺冠率,而另一支队伍只剩20%的夺冠率——我们设定这种情景为A+。我们知道,比赛的结果只有一个,冠军也只有一支队伍。结果出来了,有人跑过来准备跟你说到底谁夺冠了,如果你只是在A情境下,这个夺冠信息对你肯定很有诱惑力,因为你本来就无法判断谁可能夺冠;如果你是在A+情境下,这个夺冠信息对你来说多少有点失去新鲜,因为世界级的赛事,出差错的可能性不高,所以你会觉得你其实已经大概知道了结果,听或不听没有太大意义。换种说法表述,晚上冠军赛开战,如果你身处情景A,你肯定比较好奇,势均力敌的双方到底谁能夺冠;而如果你身处情景A+,你会觉得这是一场结果已定的赛事,没有太大兴趣。

好的,举了这么一个例子,你应该已经开始恍然了,信息会改变你对事物的未知度和好奇心,信息量越大,你对事物越了解,进而你对事物的好奇心也会降低,因为你对事物的确定性越高。至此,为了抽象这个模型,聪明的香农总结出了信息熵这个概念。信息熵用以表示一个事物的非确定性,如果该事物的非确定性越高,你的好奇心越重,该事物的信息熵就越高。我们先抛出信息熵的公式
详细了解可以参照 https://blog.csdn.net/wendingzhulu/article/details/42045137

详解XOR(异或)运算加密的更多相关文章

  1. 常用进制的转换、进制数的and与or或xor异或运算

    [十进制转换成其他进制]例:将25转换为二进制数 解: 25÷2=12 余数1  12÷2=6   余数0  6÷2=3     余数0  3÷2=1     余数1  1÷2=0     余数1 所 ...

  2. 详解 HTTPS 移动端对称加密套件优

    近几年,Google.Baidu.Facebook 等互联网巨头大力推行 HTTPS,国内外的大型互联网公司很多也都已启用全站 HTTPS. Google 也推出了针对移动端优化的新型加密套件 Cha ...

  3. 详解 Discuz 的 PHP经典加密解密函数 authcode

    函数注释: // $string: 明文 或 密文 // $operation:DECODE表示解密,其它表示加密 // $key: 密匙 // $expiry:密文有效期 function auth ...

  4. DELPHI加密字串(异或运算加密)

    首先有两个自定的转换函数: function myStrToHex(s:string):string; //字串转16进制 var TmpStr:string; i:integer; begin Tm ...

  5. ref:详解MYSQL数据库密码的加密方式及破解方法

    ref:https://blog.csdn.net/paul123456789io/article/details/53081921 MySQL数据库用户密码跟其它数据库用户密码一样,在应用系统代码中 ...

  6. 详解MYSQL数据库密码的加密方式及破解方法

    MYSQL加密方式:http://blog.csdn.net/listeningsea/article/details/8139641

  7. SKINNY加密算法详解(无代码,仅加密)

    原作者论文请参考<The SKINNY Family of Block Ciphers and Its Low-Latency Variant MANTIS> 地址为:https://li ...

  8. .NET DLL 保护措施详解(非混淆加密加壳)

    为什么要保护DLL,我就不多说了,各人有各人的理由.总的来说,就是不想核心逻辑泄露及授权验证被破解两大方面的因素.市面上的混淆加密工具对.NET源码保护的效果天差地别,很多网上下到的混淆工具破解版对. ...

  9. .NET DLL 保护措施详解(二)关于性能的测试

    先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...

随机推荐

  1. 百度地图分布图(百度地图api司机位置实时定位分布图)

    就类似于我们使用共享单车app的时候,可以看到我们周围的空闲单车分布.e代驾在后台管理系统需求里也有此功能,目的是为了实时看到目标城市下的所有司机状态. 一.controller //controll ...

  2. webpack篇,结合理论与实际,加以透彻分析!

    Webpack篇 开始着手项目打包的一些东西,还不是特别懂,一边学习,一边做笔记好啦. 1.webpack的概念.Webpack 是当下最热门的前端资源模块化管理和打包工具.任何形式的资源都可以视作模 ...

  3. JavaScript中this究竟指向什么?

    摘要: 神奇的this! 原文:JS 中 this 在各个场景下的指向 译者:前端小智 Fundebug经授权转载,版权归原作者所有. 1. this 的奥秘 很多时候, JS 中的 this 对于咱 ...

  4. cross validation交叉验证

    交叉验证是一种检测model是否overfit的方法.最常用的cross validation是k-fold cross validation. 具体的方法是: 1.将数据平均分成k份,0,1,2,, ...

  5. 03导航链接的制作(wx:for循环)和小程序警告request fail url not in domain list

    06==>导航链接的制作 <!-- 导航链接 --> <navigator url="../list/list" hover-class="nav ...

  6. LOJ 3184: 「CEOI2018」斐波那契表示法

    题目传送门:LOJ #3184. 题意简述: 题目说得很清楚了. 题解: 首先需要了解「斐波那契数系」为何物. 按照题目中定义的斐波那契数列 \(F_n\),可以证明,每个非负整数 \(n\) 都能够 ...

  7. 2018年蓝桥杯B组C/C++决赛题目

    自己的博客排版,自我感觉略好一点. 先放上题目. 点击查看2018年蓝桥杯B组C/C++决赛题目题解     1.换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游, ...

  8. flask如何返回真正意义上的json字符串?以及中文如何正常显示?

    flask中,不能直接return字典,需要把字典转换为json字符串方式有三种:1. return str(字典)2.return json.dumps(字典)3.return jsonify(字典 ...

  9. Docker容器数据卷(七)

    Docker致力于: 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker co ...

  10. C++对象布局

    <C++应用程序性能优化><深度探索C++对象模型>笔记 #include<iostream> using namespace std; class student ...