原理:利用异或的特性,a == a ^b ^b ,即同一数据对同一个数经过两次异或后仍是原数据
适用性:不单单适用于txt文件,还可适用于其他uncoide编码类型的文件,支持中文加密
核心代码前瞻:
while (true){
int data = fileInputStream.read();
if(data == -1){
//数据读完
break;
}
//加解密。同一数据经过对同一数字异或后还是原数据
fileOutputStream.write(data^99);
}
效果图前瞻:
完整源代码:
import java.io.*;
import java.util.Scanner;
//使用异或实现文件的简易加密或解密,同一数据异或一个数字两次,还是原数据
public class Test {
static String s ;
public static void main(String[] args) throws IOException {
//输入
Scanner scanner = new Scanner(System.in);
System.out.println("请输入执行操作的文件绝对路径:");
String fileName = scanner.nextLine();
System.out.println("请输入执行的操作,1-加密,2-解密");
int menu = scanner.nextInt();
//源文件
File oldFile = new File(fileName);
//文件输入流,读取该文件内部数据
FileInputStream fileInputStream = new FileInputStream(oldFile);
//功能输出信息
switch (menu){
case 1 :
//加密
s = "-加密";
System.out.println("加密完成");
break;
case 2 :
//解密
s = "-解密";
System.out.println("解密完成");
break;
}
//新文件
File newFile = new File(oldFile.getParent(),oldFile.getName()+s);
//文件输出流,输出加密后的数据到一个新建文件中
FileOutputStream fileOutputStream = new FileOutputStream(newFile);
//***核心***,加解密操作
while (true){
int data = fileInputStream.read();
if(data == -1){
//数据读完
break;
}
//加解密。同一数据经过对同一数字异或后还是原数据
fileOutputStream.write(data^99);
}
//关闭输入输出流
fileInputStream.close();
fileOutputStream.close();
}
}
代码操作及结果演示:
首先,我们现在桌面上任意创建一个txt文件作为试验
文档内容如下:ABCDEFGHIJKLMN这是一个测试文档
然后运行源代码进行加密,输入加密的文档的绝对路径,选择加密

接下来,便可以在输入的路径下看到新建的文件,打开后内容如下
"! '&%$+*)(/.-嬡鷧囒銍凵呏鑻迢咍鋮吕
然后运行源代码进行解密,输入待解密的文档的绝对路径,选择解密

接下来,便可以在输入的路径下看到新建的文件,打开后内容如下
ABCDEFGHIJKLMN这是一个测试文档
/**
2021.9.26日补充
**/
对字符串进行加解密,scala语言版
/**
* 异或加解密,原理:a == a ^b ^,即同一数据对同一个数经过两次异或后仍是原数据
* 加解密都调用此方法
* @param string
* @return
*/
def xorEncodeAndDecode(input: String):String = {
//异或加解密key值
val key:Int = 10
val output:StringBuilder = new StringBuilder()
input.foreach(x => {
output.append(x ^ key.toChar)
})
output.toString()
}
版权声明:本文为qq_41677788原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。