效果演示:
代码实现:
加密代码
import java.io.*;
import java.util.Arrays;
//文件加密
public class Encrypt {
public static void main(String[] args) throws IOException {
encryptFile("W:\\保密.txt", "C:\\"); //加密文件和解密路径
encryptDigit(20);
}
private static void encryptFile(String sourcePath, String targetPath) throws IOException {
File file = new File(sourcePath);
String fileName = file.getName().split("\\.")[0];
File targetFileCreate = new File(targetPath, fileName);
boolean newFile = targetFileCreate.createNewFile();
if (!newFile) {
throw new FileNotFoundException("文件已存在或路径不正确");
}
FileInputStream sourceFile = new FileInputStream(sourcePath);
FileOutputStream targetFile = new FileOutputStream(targetFileCreate.getAbsoluteFile());
int data;
while ((data = sourceFile.read()) != -1) {
int encryptData = encryptDigit(data);
targetFile.write(encryptData);
}
targetFile.close();
sourceFile.close();
}
private static int encryptDigit(int data) {
System.out.println(data);
int[] binaryNumbers = new int[]{0, 0, 0, 0, 0, 0, 0, 0};
for (int k = binaryNumbers.length - 1; k >= 0; k--) {
binaryNumbers[k] = data % 2;
data /= 2;
}
System.out.println(Arrays.toString(binaryNumbers));
dataExchange(binaryNumbers);
System.out.println(Arrays.toString(binaryNumbers));
int encryptNumber = 0;
for (int k = 0; k < binaryNumbers.length; k++) {
encryptNumber += binaryNumbers[k] * Math.pow(2, 7 - k);
}
System.out.println(encryptNumber);
return encryptNumber;
}
private static void dataExchange(int[] binaryNumbers) {
//0 -- 5
{
int tmp = binaryNumbers[0];
binaryNumbers[0] = binaryNumbers[5];
binaryNumbers[5] = tmp;
}
//1 -- 6
{
int tmp = binaryNumbers[1];
binaryNumbers[1] = binaryNumbers[6];
binaryNumbers[6] = tmp;
}
//2 -- 7
{
int tmp = binaryNumbers[2];
binaryNumbers[2] = binaryNumbers[7];
binaryNumbers[7] = tmp;
}
//3 -- 4
{
int tmp = binaryNumbers[3];
binaryNumbers[3] = binaryNumbers[4];
binaryNumbers[4] = tmp;
}
}
}
解密代码
import java.io.*;
import java.util.Arrays;
//文件的解密
public class Decrypt {
public static void main(String[] args) throws IOException {
decrypt("C:\\保密"); //需要解密的文件
}
private static void decrypt(String decryptPath) throws IOException {
File targetFileCreate = new File(decryptPath+"_decrypt");
boolean newFile = targetFileCreate.createNewFile();
if (!newFile) {
throw new FileNotFoundException("文件已存在或路径不正确");
}
FileInputStream sourceFile = new FileInputStream(decryptPath);
FileOutputStream targetFile = new FileOutputStream(targetFileCreate.getAbsoluteFile());
int data;
while ((data = sourceFile.read()) != -1) {
int decryptData = decryptDigit(data);
targetFile.write(decryptData);
}
targetFile.close();
sourceFile.close();
}
private static int decryptDigit(int data) {
System.out.println(data);
int[] binaryNumbers = new int[]{0, 0, 0, 0, 0, 0, 0, 0};
for (int k = binaryNumbers.length - 1; k >= 0; k--) {
binaryNumbers[k] = data % 2;
data /= 2;
}
System.out.println(Arrays.toString(binaryNumbers));
dataExchange(binaryNumbers);
System.out.println(Arrays.toString(binaryNumbers));
int encryptNumber = 0;
for (int k = 0; k < binaryNumbers.length; k++) {
encryptNumber += binaryNumbers[k] * Math.pow(2, 7 - k);
}
System.out.println(encryptNumber);
return encryptNumber;
}
private static void dataExchange(int[] binaryNumbers){
//0 -- 5
{
int tmp = binaryNumbers[0];
binaryNumbers[0] = binaryNumbers[5];
binaryNumbers[5] = tmp;
}
//1 -- 6
{
int tmp = binaryNumbers[1];
binaryNumbers[1] = binaryNumbers[6];
binaryNumbers[6] = tmp;
}
//2 -- 7
{
int tmp = binaryNumbers[2];
binaryNumbers[2] = binaryNumbers[7];
binaryNumbers[7] = tmp;
}
//3 -- 4
{
int tmp = binaryNumbers[3];
binaryNumbers[3] = binaryNumbers[4];
binaryNumbers[4] = tmp;
}
}
}
如果解密需要后缀可以把后缀穿插在一个随机位置,位置信息记录在文件末尾或开头。