xor 加密简介

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

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

时间: 2024-10-31 16:39:32

xor 加密简介的相关文章

WPA无线加密简介

WPA 全名为 Wi-Fi Protected Access,有WPA 和 WPA2两个标准,是一种保护无线电脑网络(Wi-Fi)安全的系统,它是应研究者在前一代的系统有线等效加密(WEP)中找到的几个严重的弱点而产生的. WPA 实作了 IEEE 802.11i 标准的大部分,是在 802.11i 完备之前替代 WEP 的过渡方案.WPA 的设计可以用在所有的无线网卡上,但未必能用在第一代的无线取用点上.WPA2 实作了完整的标准,但不能用在某些古老的网卡上.这两个都提供优良的保全能力,但也都

Linux Sys Monitor通讯安全动态加密简介

在有些安全性要求比较高的场景里,我们需要对发送的信息进行加密传送. 加密算法有很多种.可以任意选择. 然而,算法是死的,人是活的.能加密就能解密. 我们需要的也一种可以解密出来的可逆算法. 否则,客户端与服务端之间的对话,就真成了鸡对鸭讲. 那么,这种算法就需要一个解密的钥匙. 而这个钥匙,也不能是固定不变的, 因为通过抓包工具, 可以轻松地获取客户端与服务端之间的发包内容,然后发析算法了. 所以应对方法就是:钥匙也不固定. 就像超市的储物柜,每次打印的二维码都是不同的. 让每一个发出去的包,都

Python 3: 加密简介

Python 3 的标准库中没多少用来解决加密的,不过却有用于处理哈希的库.在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto 和 cryptography 上.我们将学习如何使用这两个库,来加密和解密字符串. 哈希 如果需要用到安全哈希算法或是消息摘要算法,那么你可以使用标准库中的 hashlib 模块.这个模块包含了符合 FIPS(美国联邦信息处理标准)的安全哈希算法,包括 SHA1,SHA224,SHA256,SHA384,SHA512 以及 RSA 的

码农从菜鸟到大牛的必须文章

几年前我也是一个码农菜鸟,我也常常幻想着成为技术大牛. 如何减小与"大牛"的差距是我常常不得不面对的话题.今天从我走过来的路来总结一下成为大牛的技术之路. 先来看一张程序员的时间管理图. 除了时间管理,技术学习也是少不了的.下面推荐一下比较好的技术文章. 使用瀑布流插件 Masonry 进行瀑布流布局 业余草微信公众号上线了! 使用HTML5 Canvas实现火焰风暴动画 HTML5 实现3D翻转立方体 使用 HTML5 制作像素太空战机游戏 常用的Linux关机命令大全 5个常用的L

在PHP+MySQL应用中使用XOR运算加密算法

mysql|加密|算法|运算 [摘 要] 上一部分介绍了如何使用XOR运算进行加密/解密的原理,本节将使用其加密用户的登录信息.根据上一小节介绍的XOR加密算法的原理,不难写出以下的加密解密函数.首先列出加密算法. 本文将介绍一个简单易用的加密/解密算法:使用异或(XOR)运算.本算法原理简单,旨在使读者对信息的加密/解密有一个更加直观的印象. XOR算法原理 从加密的主要方法看,换位法过于简单,特别是对于数据量少的情况很容易由密文猜出明文,而替换法不失为一种行之有效的简易算法. 从各种替换法运

PHP+MySQL应用中使用XOR运算加密算法

本文将介绍一个简单易用的加密/解密算法:使用异或(XOR)运算.本算法原理简单,旨在使读者对信息的加密/解密有一个更加直观的印象. XOR算法原理 从加密的主要方法看,换位法过于简单,特别是对于数据量少的情况很容易由密文猜出明文,而替换法不失为一种行之有效的简易算法. 从各种替换法运算的特点看,异或运算最适合用于简易加解密运算,这种方法的原理是:当一个数A和另一个数B进行异或运算会生成另一个数C,如果再将C和B进行异或运算则C又会还原为A. 相对于其他的简易加密算法,XOR算法的优点如下. (1

Excel密码破解超简单?这样加密别想破解

大家是不是还以为Excel密码破解是几乎做不到的事情?但事实刚好相反,借助Excel密码破解工具,Excel密码破解只需几秒钟的事情,"excel密码忘记了怎么办"这样的问题根本就不算问题!你还相信Excel密码破解是不可能完成的任务吗? 本文只为告诉大家一个简单的事实,Excel密码破解真的很简单.本文所提到的Excel破解工具并不提供下载,仅供笔者测试使用.请大家不要拿着这些破解工具做什么坏事,如果出问题了笔者可不负责.至于如何使用Office软件(WPS Office 2012等

Bitlocker驱动器加密怎么用

  Bitlocker加密简介: Bitlocker简单来说这个组件是通过一种软硬结合的方式 (BitLocker与硬件TPM芯片配合)共同保护硬盘数据,最大亮点就在于即便将硬盘串接到其他电脑上,也休想读取任何信息.BitLocker不但能够为任意分区加密,而且还加入了对U盘.移动硬盘的加密支持,而这也被称之为Bitlocker To Go. Bitlocker加密步骤: 1.进入控制面板找到"BitLocker驱动器加密"点击进入. 2.此界面可以看到包括硬盘在内的所有硬盘分区,以及

c语言-C文件(汉字)加密和解密

问题描述 C文件(汉字)加密和解密 C文件(汉字)加密和解密里直接用加解密字符串的可以吗?新手不太懂,但愿高手指点迷津,可以的话,例子就更加直观了 解决方案 不管是什么文件,汉字还是图片,都当作二进制数据来处理. http://blog.csdn.net/xuyong7/article/details/6070886 这里有个完整的例子,用的是异或加密. 两次加密就相当于解密. 解决方案二: C++ 简单的文件加密和解密 实例给hibernate配置文件加密 解密的方案C 使用异或(xor)加密