Java实现异或(xor)算法的加密和解密
1. 异或(xor)加密原理
⼀个整数 a 和任意⼀个整数 b 异或两次,得到的结果是整数 a 本⾝,即: a == a ^ b ^ b。
这⾥的 a 就是需要加密的原数据,b 则是密钥。a ^ b 就是加密过程,异或的结果就是加密后的密⽂。密⽂ (a ^ b) 再与密钥 b 异或,就是解密过程,得到的结果就是原数据 a 本⾝。
a =原数据
b =密钥
// ⼀次异或, 加密得到密⽂
c = a ^ b
// ⼆次异或, 解密得到原数据(d == a)
d = c ^ b
异或加密如果同时知道原⽂和密⽂,则对⽐原⽂和密⽂可以推算出密钥,因此异或加密安全性较低,⼀般只⽤于简单的加密。
2. 异或加密代码实例
2.1 异或加密⼯具类封装:XORUtils
XORUtils.java完整源码:
package ;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 异或(xor)算法加密/解密⼯具
*
* @author xietansheng
*/
public class XORUtils {
/**
* 异或算法加密/解密
*
* @param data 数据(密⽂/明⽂)
* @param key 密钥
* @return 返回解密/加密后的数据
*/
public static byte[]encrypt(byte[] data,byte[] key){
if(data == null || data.length ==0|| key == null || key.length ==0){
return data;
}
byte[] result =new byte[data.length];
// 使⽤密钥字节数组循环加密或解密
for(int i =0; i < data.length; i++){
/
/ 数据与密钥异或, 再与循环变量的低8位异或(增加复杂度)
result[i]=(byte)(data[i]^ key[i % key.length]^(i &0xFF));
}
return result;
}
/**
* 对⽂件异或算法加密/解密
*
* @param inFile 输⼊⽂件(密⽂/明⽂)
* @param outFile 结果输出⽂件
* @param key 密钥
*/
public static void encryptFile(File inFile, File outFile,byte[] key)throws Exception {
InputStream in = null;
OutputStream out = null;
try{
// ⽂件输⼊流
in =new FileInputStream(inFile);
// 结果输出流, 异或运算时, 字节是⼀个⼀个读取和写⼊, 这⾥必须使⽤缓冲流包装,
// 等缓冲到⼀定数量的字节(10240字节)后再写⼊磁盘(否则写磁盘次数太多, 速度会⾮常慢)            out =new BufferedOutputStream(new FileOutputStream(outFile),10240);
int b =-1;
long i =0;
// 每次循环读取⽂件的⼀个字节, 使⽤密钥字节数组循环加密或解密
while((b = in.read())!=-1){
// 数据与密钥异或, 再与循环变量的低8位异或(增加复杂度)
b =(b ^ key[(int)(i % key.length)]^(int)(i &0xFF));
// 写⼊⼀个加密/解密后的字节
out.write(b);
// 循环变量递增
i++;
}
out.flush();
}finally{
close(in);
close(out);
}
}
private static void close(Closeable c){
if(c != null){
try{
c.close();
}catch(IOException e){
// nothing
}
}
}
}
异或加密和解密⽤的⽅法都是同⼀个,XORUtils类中有两个公开静态⽅法:
// 加密/解密 byte 数组数据
static byte[]encrypt(byte[] data,byte[] key)
// 加密/解密⽂件
static void encryptFile(File inFile, File outFile,byte[] key)
2.2 XORUtils ⼯具类的使⽤
package ;
import java.io.File;
/
**
* @author xietansheng
*/
public class Main {
public static void main(String[] args)throws Exception {
String content ="Hello world!";// 原⽂内容
String key ="123456";// XOR 加密/解密⽤的原始密码
// 加密数据, 返回密⽂
byte[] cipherBytes = Bytes(), Bytes());
// 解密数据, 返回明⽂
byte[] plainBytes = pt(cipherBytes, Bytes());
/java加密方式有哪些
/ 输出解密后的明⽂: "Hello world!"
System.out.println(new String(plainBytes));
/*
* XOR 对⽂件的加密/解密
*/
// 将⽂件demo.java 加密后输出到⽂件demo.jpg_cipher
// 将⽂件demo.jpg_cipher 解密输出到⽂件demo.jpg_plain
// 对⽐原⽂件demo.jpg 和解密得到的⽂件demo.jpg_plain 两者的 MD5 将会完全相同
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。