XOR 加密简介

XOR 加密简介作者: 阮一峰日期: 2017年5月31日本文介绍一种简单高效、非常安全的加密方法:XOR加密。一、XOR运算逻辑运算之中,除了 AND 和 OR,还有一种 XOR 运算,中文称为”异或运算”。它的定义是:两个值相同时,返回false,否则返回true。也就是说,XOR可以用来判断两个值是否不同。trueXORtrue/

大家好,又见面了,我是你们的朋友全栈君。

作者: 阮一峰

日期: 2017年5月31日

本文介绍一种简单高效、非常安全的加密方法: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 

XOR 加密简介

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 加密简介

四、完美保密性

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

XOR 加密简介

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

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

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

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

五、实例:哈希加密

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

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://javaforall.net/160216.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux基础——gcc编译、静态库与动态库(共享库)

    Linux基础——gcc编译、静态库与动态库(共享库)gcc编译器1、gcc工作流程2、gcc常用参数参数用途-v查看版本-o产生目标文件-I+目录指定头文件目录-D编译时定义宏-00/-01/-03没有优化/缺省值/优化级别最高-Wall提示更多警告信息-c只编译子程序-E生成预处理文件…

    2022年9月27日
    4
  • d触发器q端的输出波形_D触发器、波形、代码(转)

    d触发器q端的输出波形_D触发器、波形、代码(转)在学习 verilog 之前 我们先学习一下 D 触发器以及它的代码 FPGA 的设计基础是数字电路 因此很多同学会认为我们要先学好数字电路之后 才学习 FPGA 但是 数字电路教材的内容很多 例如 JK 触发器 RS 触发器 真值表 卡诺图等 但是 这里的很多内容其实已经过时了 此外 对于 FPGA 的学习来讲 我们只用到了其中很少很少的一部分内容 如果没有数字电路的基础 我们建议就看一部分 知道 D 触发器就够了 那

    2025年6月15日
    4
  • pwm波控制舵机原理(转)[通俗易懂]

    pwm波控制舵机原理(转)[通俗易懂]文章转自:http://www.geek-workshop.com/thread-70-1-1.html一、关于舵机:舵机(英文叫Servo):它由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统。通过发送信号,指定输出轴旋转角度。舵机一般而言都有最大旋转角度(比如180度。)与普通直流电机的区别主要在,直流电机是一圈圈转动的,舵机只能在一定角度内转动,不能一圈圈转(数字舵机可…

    2022年6月17日
    35
  • PHP之Memcache和Memcached

    PHP之Memcache和Memcached

    2022年2月8日
    36
  • Linux 命令tail手动实现

    Linux 命令tail手动实现手动实现一个Linuxtail命令

    2022年5月18日
    51
  • 解决Ubuntu18.04版本高分辨率下导致字体过小问题

    解决Ubuntu18.04版本高分辨率下导致字体过小问题我所使用的是小米笔记本,显示屏是3.2K的分辨率。由于分辨率太高了,然后在ubuntu18.04的版本下显示的字体很小,小到都看不清了那种。于是查找了调整18.04版本字体大小的方法如下:安装gnome-tweaks工具sudoapt-getinstallgnome-tweaks安装完之后,直接在终端输入gnome-tweaks即可运行该工具。然后调整缩放比例,因为我的电脑分辨率是3.2K,所以我调整的缩放比例是2倍刚刚好,如下图:调整完之后,直接关闭该工具。再次回到ubunt

    2022年7月21日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号