【Java】Java实现简单异或加密
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实现简单异或加密的更多相关文章
- Java之英格玛简单实现以及加密验证码的应用
最近看了一部电影<模仿游戏>,<模仿游戏>中艾伦·图灵破译英格玛让我对英格玛产生了好奇,于是就开始翻阅资料对其进行研究,但是毕竟智慧有限,所以我这里用Java实现一个简单的英格 ...
- JAVA中简单的MD5加密类(MD5Utils)
MD5加密分析: JDK API: 获取对象的API: 加密的API: package cn.utils; import java.security.MessageDigest; im ...
- java 对视频和图片进行加密解密[转]
是时候回到文件加密与解密的具体实现这个主题上来了.后续的举例均采用图片(包括GIF动画)类型,而其他类型资源的实现原理相同,就不一一给出了.首先来看对一幅JPG类型图片进行异或加密的Java实现,由于 ...
- Java之OutOfMemoryError简单分析
Java之OutOfMemoryError简单分析 最近编码遇到了Java内存溢出的问题,所以就想顺便总结一下几种导致Java内存溢出的栗子,以及碰到Java内存溢出要如何去解决. Java堆溢出 J ...
- Java 异步处理简单实践
Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- Java中的简单工厂模式
举两个例子以快速明白Java中的简单 工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就 ...
- 【JAVA零基础入门系列】Day12 Java类的简单应用
俗话说的好,实践出真知,所以除了理论知识掌握扎实以外,更重要的是要多加操练,这样才能掌握核心科技. 今天我们就用刚学会的类来实践一下,目标便是完成上一篇中的剁手任务. 我们的商品类已经准备好了,代码重 ...
- java Socket实现简单在线聊天(二)
接<java Socket实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...
- Java消息系统简单设计与实现
前言:由于导师在我的毕设项目里加了消息系统(本来想水水就过的..),没办法...来稍微研究研究吧..简单简单... 需求分析 我的毕设是一个博客系统,类似于简书这样的,所以消息系统也类似,在用户的消息 ...
随机推荐
- H5播放音频和视频
H5播放音频和视频: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- 彻底讲透Spring三级缓存,原理源码深度剖析!
一.前言循环依赖:就是N个类循环(嵌套)引用.通俗的讲就是N个Bean互相引用对方,最终形成闭环.在日常的开发中,我们都会碰到类似如下的代码 @Servicepublic class AService ...
- 原生js元素拖动效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Hat靶机
Hat靶机的ip是192.168.200.8 先用nmap扫描一下靶机所有的端口 nmap -p- 192.168.200.8 发现22端口不知道是否开放 还有一个65535 的unkown端口 详细 ...
- SourceTree SSH第一次登录需要交互确认的问题
问题 在SourceTree SSH配置完ssh之后向上提交代码的时候发现: The server's host key is not cached in the registry. You have ...
- .Net Core报“‘GB2312‘ is not a supported encoding name. For information on defining a custom encod”的错误
1.问题描述 在.Net Core中使用Encoding.GetEncoding("GB2312")报如下错误: System.ArgumentException:"'G ...
- ClickHouse 常用语句
一.常用操作 1.建数据库 连接数据库:clickhouse-client -h 10.0.0.0 --port 9000 -u test_user --password test_password ...
- Luogu P5089 元素周期表 / Codeforces 1012B Chemical table 题解 [ 并查集 ] [ 二分图 ] [ 图论建模 ] [ 棋盘覆盖问题 ]
双倍经验:Luogu P5089 元素周期表 ,CF1012B Chemical table:模拟赛搬的好题,有点厉害.赛时10min码的假贪心拿了五十多分,赢. 并查集思路 1 对于此类棋盘整行整列 ...
- Linux驱动---按键
目录 一.Input子系统 1.1.简介 1.2.Input子系统构成 1.3.input_dev结构体 二.输入设备驱动开发流程 2.1.分配和初始化输入设备 2.2.注册设备 2.3.事件上报 2 ...
- [BZOJ4771] 七彩树 题解
好题,又学两个思路. 先把问题变简单一点,去掉深度限制,那么有两种做法: 经典的前驱后继转化到二维数点. 颜色相同的点按 \(dfs\) 序排序,每个点 \(+1\),相邻两点 \(lca-1\).转 ...