文档章节

XOR 加密简介

阿里聚安全
 阿里聚安全
发布于 2017/06/08 15:32
字数 958
阅读 26
收藏 1

本文介绍一种简单高效、非常安全的加密方法: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)没有泄露,对方也无法破解。


*作者:阮一峰@蚂蚁金服,原文地址:阮一峰博客 更多安全类技术文章,请持续关注阿里聚安全博客

本文转载自:

阿里聚安全
粉丝 29
博文 89
码字总数 191047
作品 0
杭州
私信 提问
XOR 加密简介

本文介绍一种简单高效、非常安全的加密方法:XOR 加密。 一、 XOR 运算 逻辑运算之中,除了 和 ,还有一种 运算,中文称为"异或运算"。 它的定义是:两个值相同时,返回,否则返回。也就是说...

阮一峰
2017/05/31
0
0
python实现简单的文件加密与解密

对于任意的一个文件,本质上来讲都是二进制的。 对于任意一个二进制数a,对其用另外任意一个与a的位数相同的二进制数m进行“异或”操作得到结果e,即e=a xor m; 如果再讲上面得到的e用m进行...

Aomo
2018/09/21
973
0
Excel密码破解究竟有多简单?

面对一个加了密的excel文件,要想打开怎么办?总不能一个密码一个密码的试吧。。。别担心,让小编来告诉你Excel密码破解究竟有多简单!   更多密码破解资讯:http://www.passwordrecovery...

neluzyy1
2015/09/15
1K
0
用AOPR应该知道的弱加密法应用

弱加密法又称异或,英文缩写XOR,是一种较为简单的加密算法,下面为各位介绍Office密码破解软件弱加密法的算法函数以及应用范围。 Office密码破解软件异或加密函数 当然简单的加密方法也是容...

学术研究软件
2016/04/25
12
0
弱加密法的应用范围分析

弱加密法又称异或,英文缩写XOR,是一种较为简单的加密算法,下面为各位介绍Office密码破解软件弱加密法的算法函数以及应用范围。 当然简单的加密方法也是容易破解的,Advanced Office Passw...

neluzyy1
2016/01/26
24
0

没有更多内容

加载失败,请刷新页面

加载更多

STM32进阶之串口环形缓冲区实现

队列的概念 在此之前,我们来回顾一下队列的基本概念: 队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),在另一端进行删除(出队)。 队列...

杰杰1号
24分钟前
10
0
设计模式-建造者模式

建造者模式 定义 将一个复杂对象的构建和它的表示分离,使得同样的构建过程创建出不同的表示。这句话理解起来优点抽象,我们打个简单的比方吧,中国人都喜欢做菜,做菜的时候后会放很多配料...

木本本
27分钟前
9
0
017、xml版本代码生成器配置

1、在pom.xml文件中增加mybatis-generator-maven-plugin插件 <build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>......

北岩
39分钟前
7
0
用jQuery-Easy-UI编写注册页面

本文转载于:专业的前端网站➮用jQuery-Easy-UI编写注册页面 1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content=......

前端老手
48分钟前
6
0
Git ssh配置

生成密钥对 ssh-keygen -t rsa -C "email@email.com"邮箱替换自己邮箱在地址C:\Users\账户\.ssh下,id_rsa、id_rsa.pub两个文件复制文件id_rsa.pub内容到github\gitlab的Settings-> SSH ......

JUKE
55分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部