Java实现简单异或加密

零、需求

在做一个简单的Web项目,需要把账号密码以Cookie的形式存储到浏览器中记住,不能直接明文,故需要一种简单的加密方式,想到了异或加密。

壹、实现


/**
* 异或操作
* @param rawData 要异或的字节数组
* @param number 运算数
* @return 异或运算后的字节数组
*/
public static byte[] Xor(byte[] rawData, int number) {
byte[] encodeData = new byte[rawData.length];
for (int i = 0; i < rawData.length; i++) //遍历字符数组
{
encodeData[i] = (byte) (rawData[i] ^ number); //对每个数组元素进行异或运算
}
return encodeData;
} /**
* 异或加密
* @param rawStr 原文
* @param key 密钥
* @return 密文
*/
public static String EncodeByXor(String rawStr, String key) {
// 通过字符串拿到密钥
int number = 1;
for (int i = 0; i < key.length(); i++) {
number *= key.charAt(i);
} // 转成字节数组
byte[] rawData = rawStr.getBytes(StandardCharsets.UTF_8);
byte[] encodeData = Xor(rawData, number); // 把字节数组转成某种格式的字符串,方便传输(格式可以自定义,好解析就行)
StringBuilder encodeStr = new StringBuilder();
for (byte b : encodeData) {
encodeStr.append(b).append("x");
} return encodeStr.toString();
} /**
* 异或解密
* @param encodeStr 密文
* @param key 密钥
* @return 原文
*/
public static String DecodeByXor(String encodeStr, String key) {
// 通过字符串拿到密钥
int number = 1;
for (int i = 0; i < key.length(); i++) {
number *= key.charAt(i);
} // 解析EncodeByXor方法中的字节数组格式,找到加密后的字节数组
String[] strings = encodeStr.substring(0,encodeStr.length()-1).split("x");
byte[] rawData = new byte[strings.length];
for (int i = 0; i < strings.length; i++) {
rawData[i] = Byte.parseByte(strings[i]);
} // 异或一下
byte[] encodeData = Xor(rawData, number); // 重新编码成原始字符串
return new String(encodeData,StandardCharsets.UTF_8);
} /**
* 测试
* @param args
*/
public static void main(String[] args) {
String enStr = EncodeByXor("异或加密如果同时知道原文和密文,则对比原文和密文可以推算出密钥,因此异或加密安全性较低,一般只用于简单的加密。","这个是一个秘钥");
System.out.println("加密后:");
System.out.println(enStr); String deStr = DecodeByXor(enStr,"这个是一个秘钥");
System.out.println("解密后:");
System.out.println(deStr);
}

测试结果:

加密后:
-27x-68x-126x-26x-120x-106x-27x-118x-96x-27x-81x-122x-27x-90x-126x-26x-98x-100x-27x-112x-116x-26x-105x-74x-25x-97x-91x-23x-127x-109x-27x-114x-97x-26x-106x-121x-27x-110x-116x-27x-81x-122x-26x-106x-121x-17x-68x-116x-27x-120x-103x-27x-81x-71x-26x-81x-108x-27x-114x-97x-26x-106x-121x-27x-110x-116x-27x-81x-122x-26x-106x-121x-27x-113x-81x-28x-69x-91x-26x-114x-88x-25x-82x-105x-27x-121x-70x-27x-81x-122x-23x-110x-91x-17x-68x-116x-27x-101x-96x-26x-83x-92x-27x-68x-126x-26x-120x-106x-27x-118x-96x-27x-81x-122x-27x-82x-119x-27x-123x-88x-26x-128x-89x-24x-66x-125x-28x-67x-114x-17x-68x-116x-28x-72x-128x-24x-120x-84x-27x-113x-86x-25x-108x-88x-28x-70x-114x-25x-82x-128x-27x-115x-107x-25x-102x-124x-27x-118x-96x-27x-81x-122x-29x-128x-126x
解密后:
异或加密如果同时知道原文和密文,则对比原文和密文可以推算出密钥,因此异或加密安全性较低,一般只用于简单的加密。

贰、总结

异或加密如果同时知道原文和密文,则对比原文和密文可以推算出密钥,因此异或加密安全性较低,一般只用于简单的加密。

叁、参考文档

https://www.jb51.net/article/67809.htm

【Java】Java实现简单异或加密的更多相关文章

  1. Java之英格玛简单实现以及加密验证码的应用

    最近看了一部电影<模仿游戏>,<模仿游戏>中艾伦·图灵破译英格玛让我对英格玛产生了好奇,于是就开始翻阅资料对其进行研究,但是毕竟智慧有限,所以我这里用Java实现一个简单的英格 ...

  2. JAVA中简单的MD5加密类(MD5Utils)

    MD5加密分析:   JDK API:   获取对象的API:   加密的API:   package cn.utils; import java.security.MessageDigest; im ...

  3. java 对视频和图片进行加密解密[转]

    是时候回到文件加密与解密的具体实现这个主题上来了.后续的举例均采用图片(包括GIF动画)类型,而其他类型资源的实现原理相同,就不一一给出了.首先来看对一幅JPG类型图片进行异或加密的Java实现,由于 ...

  4. Java之OutOfMemoryError简单分析

    Java之OutOfMemoryError简单分析 最近编码遇到了Java内存溢出的问题,所以就想顺便总结一下几种导致Java内存溢出的栗子,以及碰到Java内存溢出要如何去解决. Java堆溢出 J ...

  5. Java 异步处理简单实践

    Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...

  6. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  7. Java中的简单工厂模式

    举两个例子以快速明白Java中的简单 工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就 ...

  8. 【JAVA零基础入门系列】Day12 Java类的简单应用

    俗话说的好,实践出真知,所以除了理论知识掌握扎实以外,更重要的是要多加操练,这样才能掌握核心科技. 今天我们就用刚学会的类来实践一下,目标便是完成上一篇中的剁手任务. 我们的商品类已经准备好了,代码重 ...

  9. java Socket实现简单在线聊天(二)

    接<java Socket实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...

  10. Java消息系统简单设计与实现

    前言:由于导师在我的毕设项目里加了消息系统(本来想水水就过的..),没办法...来稍微研究研究吧..简单简单... 需求分析 我的毕设是一个博客系统,类似于简书这样的,所以消息系统也类似,在用户的消息 ...

随机推荐

  1. 关于前端上传excell时间的问题

    当前端导入excell里的数据时,只能获取到下面类似的这种数据 Excel存储的日期是从1900年1月1日开始按天数来计算的,也就是说1900年1月1日在Excel中是1. 转化的思路和对Excel中 ...

  2. 一种调试 线段树 / Treap / Splay / 左偏树 / LCT 等树形结构的技巧

    前言 如果我们需要观察程序运行过程中,某一个变量.某一个序列的变化情况,你可以在修改的地方打断点 debug,或者直接在需要的地方输出就行了. 但是对于一些树形结构,我们不好将其直观地呈现出来,常常只 ...

  3. Linux 常用脚本命令-lsof、find、rpm、SS、top、vim

    1,关机命令 1 shutdown -h now/0 2 halt 3 init 0 4 poweroff 5 举例: 6 shutdown -h 3 ------3分钟后关机(可用shutdown ...

  4. ForkJoin全解1:简单使用与大致实现原理

    1. 使用示例import java.lang.reflect.Method; import java.util.concurrent.ForkJoinPool;import java.util.co ...

  5. w3cschool-HBase官方文档-3MapReduce

    HBase和MapReduce 2018-03-30 13:59 更新 HBase和MapReduce Apache MapReduce 是一个用于分析大量数据的软件框架.它由 Apache Hado ...

  6. 详细剖析Java动态线程池的扩容以及缩容操作

    前言 在项目中,我们经常会使用到线程来处理加快我们的任务.但为了节约资源,大多数程序员都会把线程进行池化,使用线程池来更好的支持我们的业务. Java线程池ThreadPoolExecutor有几个比 ...

  7. [ARC 188A] ABC Symmetry

    solution by XiangXunYi 思路推导 step 1 首先题目中操作二同时删掉 A,B,C 的条件相当于同时将三者数量减一,操作一删掉两个相同字符等同于将某一字符的数量减二,那么我们可 ...

  8. Jenkins执行Shell脚本超时错误处理指南

    Jenkins执行Shell脚本超时错误处理指南 在使用Jenkins进行自动化测试时,经常会遇到需要执行Shell脚本的情况.然而,当Shell脚本执行时间过长,超过了Jenkins配置的超时限制时 ...

  9. .NET周刊【2月第2期 2025-02-09】

    国内文章 开箱即用的.NET MAUI组件库 V-Control 发布了! https://www.cnblogs.com/jevonsflash/p/18701494 文章介绍了V-Control, ...

  10. 使用Visual Studio 调式NDK so 库时,调试工具无法显示vector内容

    最近在研究C++开发安卓端so库,demo使用xamarin.android作为载体来验证算法库文件的准确性.调试过程中发现vector中的内容无法显示集合详细.如下图 研究了半天(参考链接2.3), ...