一、 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 )没有泄露,对方也无法破解。

XOR 加密简介作者: 阮一峰日期: 2017年5月31日本文介绍一种简单高效、非常安全的加密方法:XOR 加密。一、 XOR 运算逻辑运算之中,除了 AND 和 OR,还有一种 XOR 运算,中文称为"异或运算"。它的定义是:两个值相同时,返回false,否则返回true。也就是说,XOR可以用来判断两个值是否不同。true XO • 看雪(https://bbs.pediy.com/) • 安全客(https://www.anquanke.com) • freebuf(https://www.freebuf.com/) • 安全牛(https://www.aqniu.com/) • 安全内参(https://www.secrss.com/) • 绿盟(http://www.nsfocus.com.cn/) • 先知社区(https://xz.aliyun.com/)
base64加解密 如果Web应用足够简单,数据的安全性没有那么严格的要求,那么可以采用一种比较简单的加解密方法是base64,这种方式实现起来比较简单,Go语言的base64包已经很好的支持了这个,请看下面的例子: package main import ( "encoding/base64" "fmt" func base64Encode(src []byte) []byte { return []byte(base64.StdEncoding.EncodeToSt
在前端的日常开发当中,我们很少用到 异或 运算,但在一些框架源码当中,会有用到 异或 运算。我们在阅读源码的时候,会造成代码的不理解,今天我们介绍一下 异或 运算。 异或 ,英文为exclusive OR,缩写成eor. 异或 (eor)是一个数学运算符。它应用于逻辑运算。 异或 的数学符号为“⊕”,计算机符号为“eor”。其运算法则为: 相同为0,不同为1 举例说明:有两个二进制数,分别为a和b,他们两个 异或 计算。 一个值于0 异或 ,都是这个数 a ^ 0 = a 任何数跟自己 异或 ,都为0 a ^ a 第一周内容是 加密 算法的代码复现。 内容丰富也很有趣,但由于刚放假的心态问题等学得并不多。 加密 算法其实存在于电脑编程的方方面面,无论是为了参加CTF比赛还是单纯为了学习网络安全, 加密 算法的学习都必不可少。 异或 ,顾名思义,是一种基于 异或 运算的 加密 算法。 在离散数学的学习中我们接触了各类位运算:(假定下表中a和b均为整型) 在这里我们不做赘述,只单纯讲讲 异或 运算。
异或 ,英文为exclusive OR,或缩写成 xor 异或 xor )是一个数学运算符。它应用于逻辑运算。 异或 的数学符号为“⊕”,计算机符号为“ xor ”。其运算法则为: a⊕b = (¬a ∧ b) ∨ (a ∧¬b) 如果a、b两个值不相同,则 异或 结果为1。如果a、b两个值相同, 异或 结果为0。 异或 也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则