逻辑运算之中,除了 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. 腾讯WeTest亮相—腾讯全球数字生态大会现场

    2019年5月21-23日腾讯全球数字生态大会在云南昆明滇池国际会展中心顺利召开. 此次大会上万人到场参与,大会由主峰会.分论坛.数字生态专题展会以及腾讯数字生态人物颁奖盛典四大板块构成.作为腾讯战略 ...

  2. CSS常用布局方式-两列布局、三列布局

    CSS基础 2.几种布局方式1)table布局 当年主流的布局方式,第一种是通过table tr td布局 示例: <style type="text/css"> ta ...

  3. SQL Server学习内容(一)

    SQL Server SQL Server对大小写不敏感,每条语句末端使用分号. 1.SQL命令 SELECT 从数据中提取数据 UPDATE 更新数据中的数据 DELETE 从数据库中删除数据 IN ...

  4. Redis缓存实战教程

    目录 Redis缓存 使用缓存Redis解决首页并发问题 1.缓存使用的简单设计 2.Redis的整合步骤 A 将Redis整合到项目中(Redis+Spring) B 设计一个数据存储策越 3.Re ...

  5. Java后端面经总结:拿下蚂蚁金服美团头条 offer 秘诀

    笔者在面过 猿辅导,去哪儿,旷视, 陌陌,头条, 阿里, 快手, 美团, 腾讯之后,除了收获一大堆面试问题,还思考到如何成为面试官眼中的”爱技术,爱思考,靠谱,有潜力候选人的”一些”套路”. 面试问题 ...

  6. bert,albert的快速训练和预测

    随着预训练模型越来越成熟,预训练模型也会更多的在业务中使用,本文提供了bert和albert的快速训练和部署,实际上目前的预训练模型在用起来时都大致相同. 基于不久前发布的中文数据集chineseGL ...

  7. 201871010133 赵永军《面向对象程序设计(java)》第六、七周学习总结

    201871010133 赵永军<面向对象程序设计(java)>第六.七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  8. 201871020225-牟星源《面向对象程序设计(java)》第八周学习总结

    201871020225-牟星源<面向对象程序设计(java)>第八周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...

  9. shell-处理用户输入

    命令行参数 #./admin 10 30 读取参数 [root@localhost scrips]# vi test28.sh #!/bin/bashfactorial=1for ((number=1 ...

  10. IDEA写vue项目出现红色波浪线警告如何解决??

    1.看图 2.希望对大家有帮助,只要修改了这个就可以,如有任何问题都可以留言,谢谢大家 2019-09-1923:54:11 作者:何秀好