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. UOS系统mysql服务安装

    UOS系统mysql服务安装 背景 1.安装环境:kvm虚拟机 2.运行环境:uos server-1060e 3.架构:x86 4.安装mysql版本:mysql-5.7 1.安装准备 # Mysq ...

  2. Solution Set -「NOIP Simu.」20221011

    「Unknown」找   给出平面上 \(n\) 个点, 对于每个点, 求出它到其他点的欧式距离平方和.   \(n\le2\times10^5\).   Tag:「水题无 tag」   画风正常的签 ...

  3. 《C++并发编程实战》读书笔记(3):并发操作的同步

    1.条件变量 当线程需要等待特定事件发生.或是某个条件成立时,可以使用条件变量std::condition_variable,它在标准库头文件<condition_variable>内声明 ...

  4. Windows 快速启动器

    在日常工作和学习中,我们经常需要快速访问某些功能或资源,例如打开常用网站.启动应用程序或执行特定命令.Linux 用户可以通过 alias 快速实现这些操作,但在 Windows 上缺乏类似的原生支持 ...

  5. 一镜到底,通过Llama大模型架构图看透transformers原理

    一镜到底,通过Llama大模型架构图看透transformers原理 Llama Nuts and Bolts是Github上使用Go语言从零重写Llama3.1 8B-Instruct模型推理过程( ...

  6. Java8之list.stream的常见使用

    本文转自 https://blog.csdn.net/jhgnqq/article/details/123679622 感谢楼主分享 import org.junit.Before; import o ...

  7. C语言这种单细胞编程语言和指针的一些理解

    转行做嵌入式也有一段时间了,原来做c#以及一些其它的上层语言, 本想的是也就是仅仅是语法上有点不一样.但是实际使用的切身体会真的是只有自己才知道.很多方面刷新了我对c语言以及计算机结构体系的认知 ,绝 ...

  8. 02如何直接使用uni-app中提供的模板之公告滚动

    用hBuibler将提供的模板下载下载,通过url上的路径找到你需要的模板对应的位置. 然后将这个文件夹中的diamante全部赋值过来就ok了. <view class="uni-p ...

  9. 五分钟搭建属于你的AI助手:Ollama+DeepSeek+AnythingLLM深度整合教程

    作者简介 微信公众号:密码应用技术实战 博客园首页:https://www.cnblogs.com/informatics/ GitHub地址:https://github.com/warm3snow ...

  10. 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践

    title: 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践 date: 2025/2/19 updated: 2025/2/19 author: cmdragon excerpt: 通过 ...