import java.io.*;
/**
* 原理:利用异或的特性,a == a ^b ^b
* 即同一数据对同一个数经过两次异或后仍是原数据
* 使用异或实现文件的简易加密或解密,同一数据异或一个数字两次,还是原数据
*/
public class textFile {
public static void main(String[] args) {
String fileName ="F:\\jiami112";
int key = getKey("加个密");
/**
* 加密传true
* 解密 false
*/
RecursiveEncodeOrDecode(fileName,key,false);
}
/**
* 递归加密or解密
* @param Path 文件夹路径
* @param key 密钥
*/
static public void RecursiveEncodeOrDecode(String Path,int key,boolean isJ){
File folder = new File(Path);
if(!folder.exists()){
return ;
}
//是否为目录
if(!folder.isDirectory()){
ReWriteInfoForFile(folder,key,isJ);
return ;
}
File[] listFiles = folder.listFiles();
if(null==listFiles||listFiles.length==0){
System.out.println("文件夹"+Path+"为空");
return ;
}
for(File file:listFiles) {
//是否为目录
if (file.isDirectory()) {
try {
//文件夹名称更改
File newFile = null;
if(isJ){
newFile =new File(file.getParent()+"\\"+encryptKaisa(file.getName(),key));
}else{
newFile =new File(file.getParent()+"\\"+decryptKaiser(file.getName(),key));
}
org.apache.commons.io.FileUtils.moveDirectory(file, newFile);
//是目录 继续递归
RecursiveEncodeOrDecode(newFile.getAbsolutePath(),key,isJ);
}catch (Exception e){
e.getMessage();
}
} else {
//是文件进行操作
ReWriteInfoForFile(file,key,isJ);
}
}
}
/**
* 加密解密后 覆盖原来文件
* @param file 文件
* @param key 密码
* @param isJ 是否加密 true false
*/
public static void ReWriteInfoForFile(File file,int key,boolean isJ) {
try{
String fileName = file.getName();
if(isJ){
fileName =encryptKaisa(fileName,key);
}else{
fileName = decryptKaiser(fileName,key);
}
String newFilePath = file.getParent()+"\\"+fileName;
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(new File(newFilePath));
BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(os);
byte[] data = new byte[1024];
int len = 0 ;
while((len = bis.read(data))!= -1){
for(int i=0;i<len;i++){
if(isJ){
bos.write(data[i]+key);
}else{
bos.write(data[i]-key);
}
}
}
bos.flush();
is.close();
os.close();
bis.close();
bos.close();
} catch ( Exception e){
e.printStackTrace();
} finally{
try {
//删除原文件
file.delete();
}catch (Exception e){
e.printStackTrace();
}
}
}
/***
* 使用凯撒加密方式加密数据
* @param orignal 原文
* @param key 密钥
* @return 加密后的字符
*/
private static String encryptKaisa(String orignal, int key) {
//将字符串转换为数组
char[] chars = orignal.toCharArray();
StringBuffer buffer = new StringBuffer();
//遍历数组
for(char aChar : chars) {
//获取字符的ASCII编码
int asciiCode = aChar;
//偏移数据
asciiCode += key;
//将偏移后的数据转为字符
char result = (char)asciiCode;
//拼接数据
buffer.append(result);
}
return buffer.toString();
}
/**
* 使用凯撒加密方式解密数据
*
* @param encryptedData :密文
* @param key :密钥
* @return : 源数据
*/
private static String decryptKaiser(String encryptedData, int key) {
// 将字符串转为字符数组
char[] chars = encryptedData.toCharArray();
StringBuilder sb = new StringBuilder();
// 遍历数组
for (char aChar : chars) {
// 获取字符的ASCII编码
int asciiCode = aChar;
// 偏移数据
asciiCode -= key;
// 将偏移后的数据转为字符
char result = (char) asciiCode;
// 拼接数据
sb.append(result);
}
return sb.toString();
}
/**
* 获取加密值
* @param a 加密密钥
* @return 加密值
*/
public static int getKey(String a) {
char[] b = a.toCharArray();
int numb =0;
for (char c : b) {
numb+=Integer.valueOf(c);
}
return numb;
}
}
java 文件夹 加密解密
于 2023-05-05 10:33:14 首次发布