Java对文件进行加密与解密

本文详细介绍了使用Java编写的文件加密和解密代码,涉及将文件内容转换为二进制,进行数据交换操作,最后再转换回原始格式。解密时,提供了随机位置插入后缀的选项。
摘要由CSDN通过智能技术生成

效果演示:

代码实现:

加密代码
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;
        }
    }
}

如果解密需要后缀可以把后缀穿插在一个随机位置,位置信息记录在文件末尾或开头。

Java中对文本文件进行加密解密的操作可以使用加密算法解密算法来实现。常用的加密算法有DES、AES、RSA等,解密算法则是对应的解密算法。下面是一个简单的示例,使用DES算法对文本文件进行加密解密加密操作: ```java import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.security.SecureRandom; public class FileEncryptor { public static void encrypt(String key, File inputFile, File outputFile) throws Exception { FileInputStream inputStream = new FileInputStream(inputFile); FileOutputStream outputStream = new FileOutputStream(outputFile); byte[] buffer = new byte[1024]; SecureRandom secureRandom = new SecureRandom(key.getBytes()); DESKeySpec desKeySpec = new DESKeySpec(key.getBytes()); SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, secureRandom); int length; while ((length = inputStream.read(buffer)) != -1) { byte[] output = cipher.update(buffer, 0, length); if (output != null) { outputStream.write(output); } } byte[] output = cipher.doFinal(); if (output != null) { outputStream.write(output); } inputStream.close(); outputStream.flush(); outputStream.close(); } } ``` 解密操作: ```java import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.security.SecureRandom; public class FileDecryptor { public static void decrypt(String key, File inputFile, File outputFile) throws Exception { FileInputStream inputStream = new FileInputStream(inputFile); FileOutputStream outputStream = new FileOutputStream(outputFile); byte[] buffer = new byte[1024]; SecureRandom secureRandom = new SecureRandom(key.getBytes()); DESKeySpec desKeySpec = new DESKeySpec(key.getBytes()); SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.DECRYPT_MODE, secretKey, secureRandom); int length; while ((length = inputStream.read(buffer)) != -1) { byte[] output = cipher.update(buffer, 0, length); if (output != null) { outputStream.write(output); } } byte[] output = cipher.doFinal(); if (output != null) { outputStream.write(output); } inputStream.close(); outputStream.flush(); outputStream.close(); } } ``` 示例中使用的是DES算法,可以根据需要替换为其他算法。对于密钥,建议使用安全的方式存储,例如通过密码学哈希函数对其进行散列,以保证安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值