首页 > 其他分享 >XOR 加密简介

XOR 加密简介

时间:2024-09-25 12:37:53浏览次数:7  
标签:加密 简介 key XOR message true false

XOR 加密简介

作者: 阮一峰

日期: 2017年5月31日

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

标签:加密,简介,key,XOR,message,true,false
From: https://www.cnblogs.com/sexintercourse/p/18431074

相关文章

  • 好用!推荐一个开源加密库 Bouncy Castle
    BouncyCastle是一个广泛使用的开源加密库,它为Java平台提供了丰富的密码学算法实现,包括对称加密、非对称加密、哈希算法、数字签名等。这个库由于其广泛的算法支持和可靠性而备受信任,被许多安全应用和加密通信协议所采用。主要特点和功能包括:算法支持:BouncyCastle支持多种密码学......
  • 破解 oklink 网站加密数据(升级版)
    大家好!我是炒青椒不放辣,关注我,收看每期的编程干货。逆向是爬虫工程师进阶必备技能,当我们遇到一个问题时可能会有多种解决途径,而如何做出最高效的抉择又需要经验的积累。本期文章将以实战的方式,带你详细地分析并破解oklink网站加密数据特别声明:本篇文章仅供学习与研究使......
  • Spring Cloud全解析:服务调用之OpenFeign简介
    OpenFeign简介OpenFeign是SpringCloud对于Feign进行的再次封装,使其支持了SpringMVC的标准注解以及HttpMessageConverters依赖<!--openFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign<......
  • 强大的云监控工具-VictoriaMetrics简介
    前言:在我们这里,所采用的云监控平台乃是二次开发后的VictoriaMetrics。而与之搭配的web页面则是经过精心二次开发的夜莺,其页面设计更美观、可视度极高,监控项更加丰富多样且趋于完善,极具细节,以下是对VictoriaMetrics的简介。VictoriaMetrics是一个高性能、成本效益高且可扩展......
  • CF1446C Xor Tree
    很有意思的题目,我们考虑能连边的两个数一定是在01-Trie上距离最近的两个点。于是我们先把所有数插入到01-Trie上去,然后\(dp_u\)考虑以\(u\)为根的子树中最多能留几个数,他的两个儿子内部的点只能在内部转移,你只能取一个儿子和另一个儿子的一个,也就是说我们的转移为\(dp_u......
  • 【C语言】使用 OpenSSL 进行 AES CBC 加密与解密
    使用OpenSSL进行AESCBC加密与解密在这篇文章中,我们将使用OpenSSL库实现AESCBC模式的加密和解密功能。AES(高级加密标准)是一种对称加密算法,广泛应用于数据保护。本示例展示了如何使用PKCS#7填充标准来处理明文的长度,以及如何确保在加密和解密过程中正确管理密钥......
  • Qcom底层WIFI驱动简介(一)
    前言前面以一些基本的WIFI操作为例子,讲解了上层的一些流程调用,这篇开始讲讲底层驱动的一些基本流程。包括驱动是如何初始化的,以及STR相关的驱动处理等。一、CNSS2驱动简介先从串口看一下编译出来的模块,在/vendor_dlkm/lib/modules路径下,可以看到以下相关ko模块:-rw-r--......
  • 离线一机一码验证和网络验证的区别以及使用场景 (附一机一码加密打包大师下载链接)
    本文主要介绍离线一机一码验证和网络验证的区别及其各自的特点和优势。通过对比这两种验证方式的工作原理、优缺点,使开发人员更好地理解并选择适合自己需求的验证方案。接下来,我们将详细探讨每种验证方式的具体实现和应用场景。离线一机一码验证和网络验证结合实例介绍  ......
  • Git 简介和基本使用方法
    什么是Git?Git是一个分布式版本控制系统,由LinusTorvalds于2005年创建。它设计用于管理和跟踪文件的变更,适用于各种规模的项目,从个人项目到大型开源项目。Git可以记录每个文件的修改历史,并且能够轻松地在不同版本之间进行切换。它还支持多人协作开发,可以方便地合并不同开发者的......
  • 2024-09-14:用go语言,给定一个正整数数组 nums,定义一个加密函数 encrypt(x),其将一个整数
    2024-09-14:用go语言,给定一个正整数数组nums,定义一个加密函数encrypt(x),其将一个整数x的每一位数字都替换为x中的最大数字,然后返回加密后的数字。例如,encrypt(523)会返回555,encrypt(213)会返回333。现在需要计算数组中所有元素加密后的和,然后返回这个和。输入:nums=[10,2......