XOR加密是一种简单高效、非常安全的加密方法

一、 XOR 运算

逻辑运算之中,除了 AND 和 OR,还有一种 XOR 运算,中文称为"异或运算"。

它的定义是:两个值相同时,返回false,否则返回true。也就是说,XOR可以用来判断两个值是否不同。

true XOR true // false
false XOR false // false
true XOR false // true
true XOR false // true

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

1 ^ 1 // 0
0 ^ 0 // 0
1 ^ 0 // 1
0 ^ 1 // 1

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

二、 XOR 的应用

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

// 第一次 XOR
1010 ^ 1111 // 0101// 第二次 XOR
0101 ^ 1111 // 1010

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

三、加密应用

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

message XOR key // cipherText
cipherText XOR key // message

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

四、完美保密性

二战期间,各国为了电报加密,对密码学进行了大量的研究和实践,其中就包括 XOR 加密。

战后,美国数学家香农(Claude Shannon)将他的研究成果公开发表,证明了只要满足两个条件,XOR 加密是无法破解的。

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

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

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

五、实例:哈希加密

下面的例子使用 XOR,对用户的登陆密码进行加密。实际运行效果看这里。

第一步,用户设置登陆密码的时候,算出这个密码的哈希,这里使用的是 MD5 算法,也可以采用其他哈希算法。

const message = md5(password);

第二步,生成一个随机的 key。

// 生成一个随机整数,范围是 [min, max]
function getRandomInt(min, max) {return Math.floor(Math.random() * (max - min + 1)) + min;
}// 生成一个随机的十六进制的值,在 0 ~ f 之间
function getHex() {let n = 0;for (let i = 4; i > 0; i--) {n = (getRandomInt(0, 1) << (i - 1)) + n;}return n.toString(16);
}// 生成一个32位的十六进制值,用作一次性 Key
function getOTP() {const arr = [];for (let i = 0; i < 32; i++) {arr.push(getHex());}return arr.join('');
}

上面代码中,生成的key是32位的十六进制值,对应 MD5 产生的128位的二进制哈希。

第三步,进行 XOR 运算,求出加密后的message。

function getXOR(message, key) {const arr = [];for (let i = 0; i < 32; i++) {const  m = parseInt(message.substr(i, 1), 16);const k = parseInt(key.substr(i, 1), 16);arr.push((m ^ k).toString(16));}return arr.join('');
}

使用这种方法保存用户的登陆密码,即使加密文本泄露,只要一次性的密钥(key)没有泄露,对方也无法破解。

转载于:https://www.cnblogs.com/cat520/p/9328005.html

如何理解“异或(XOR)”运算在计算机科学中的重要性?(转自-阿里聚安全)...相关推荐

  1. 如何理解「异或(XOR)」运算在计算机科学中的重要性

    前言 在学逻辑学的时候,基本的逻辑运算是非.与.或,且并没有得到特别的强调,而且事实上异或可以由这三个逻辑运算符表出.可是在计算机领域,异或似乎处于与非.与.或并列的关系,例如 C 语言的位运算符中就 ...

  2. 异或(XOR)运算加密/解密在线工具

    异或(XOR)运算加密/解密在线工具,工具链接:http://www.atoolbox.net/Tool.php?Id=857 异或(XOR)运算加密一种简单高效.非常安全的加密方法. 异或(XOR) ...

  3. 异或(XOR)运算加密/解密算法

    本文将介绍一个简单易用的加密/解密算法:使用异或(XOR)运算.本算法原理简单,旨在使读者对信息的加密/解密有一个更加直观的印象. XOR算法原理 从加密的主要方法看,换位法过于简单,特别是对于数据量 ...

  4. 【ShareCode】不错的技术文章 -- 如何使用异或(XOR)运算找到数组中缺失的数?...

    如何使用异或(XOR)运算找到数组中缺失的数? 今天给大家分享一篇关于使用XOR(异或)运算找到数组中缺失的数的问题. 在一次Javascript面试中,有这么一个问题: 假设有一个由0到99(包含9 ...

  5. python numpy 实现与(and),非与(not),或(or),异或(xor)逻辑运算!

    python numpy 实现与(and),非与(not),或(or),异或(xor)逻辑运算!- 目录 1,与,非,或,异或简单的介绍 2,python numpy实现 3,运行结果 1,与,非,或 ...

  6. 数学在计算机科学中的作用,计算机科学中数学的重要性及其运用

    摘    要:数学是计算机科学中不可忽视的重要内容,其为计算机科学的形成与发展奠定了基础.阐述了数学模型.离散数学.组合数学及数论在计算机科学中的应用,为计算机编程.模型建设.数据存储等方面提供了理论 ...

  7. python中异或运算_Tensorflow轻松实现XOR运算的方式

    对于"XOR"大家应该都不陌生,我们在各种课程中都会遇到,它是一个数学逻辑运算符号,在计算机中表示为"XOR",在数学中表示为" ",学名为 ...

  8. 比特序列的XOR运算

    现代的密码都是建立在计算机的基础之上,这是因为现代的密码所处理的数据量非常大,而且密码算法也非常复杂,不借助计算机的力量就无法完成加密和解密的操作. 计算机的操作对象并不是文字,而是由0和1排列而成的 ...

  9. 基于Tensorflow轻松实现XOR运算

    对于"XOR"大家应该都不陌生,我们在各种课程中都会遇到,它是一个数学逻辑运算符号,在计算机中表示为"XOR",在数学中表示为"",学名为& ...

最新文章

  1. 人工智能能否跨越意识鸿沟?
  2. poj2456 Aggressive cows(二分查找)
  3. abap 给用户分配事物代码权限_【第五篇】SAP ABAP7.50 之用户接口
  4. Angulary应用依赖里的platform-browser
  5. ts可展开注释_Nike控告WL的始末,和它被TS带货后的几近成名
  6. python enumeration_python模块之enum_上
  7. 打印python包含汉字报SyntaxError: Non-ASCII character '\xe4' in file
  8. Android逆向笔记-使用Android Studio调试Smali代码(方式二)
  9. android小程序_小程序踩坑记
  10. python中的*和**参数:nn.Sequential(*layers)
  11. 在MacOS和iOS系统中使用OpenCV
  12. vscode插件之Vetur
  13. Vegas安装出现问题怎么办?
  14. C语言多线程基础-01-线程的创建与销毁
  15. 慢查询日志分析工具mysqldumpslow
  16. Unity3D 一些工具总结
  17. t分布 u分布 卡方分布_t分布, 卡方x分布,F分布
  18. 全国计算机大学排名2019最新排名,2019全国大学最新排名 中国最好大学排行榜
  19. 微信公众平台开发(34)微相册
  20. 【神经网络】变分自编码大杂烩

热门文章

  1. Spark LogisticRegression 逻辑回归之建模
  2. 创建 Web 前端开发环境(node和npm)
  3. Ajax解决缓存的5种方法
  4. mysqldiff对比主从表结构是否一致
  5. 优秀程序员应该做的几件事【转】
  6. 如何修改Exchange邮件报警信息
  7. 实用jQuery代码段
  8. ASP.NET连接带密码Access的方法
  9. 咕泡-装饰器 decorator 设计模式笔记
  10. 应用程序异常管理组件 Example 程序