首页 > 其他 > 详细

文件加密

时间:2021-04-20 14:00:50      阅读:21      评论:0      收藏:0      [点我收藏+]

文件加密,主要是文件上传至服务器后不能被直接打开,所以只要修改其中的二进制编码保证不能被软件正常打开即可。

常见的加密算法有:

  • MD5:以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

  • SHA:接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。

  • DES:把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,主要分为两步:

    1. 初始置换,把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位…依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位。

    2. 逆置换,经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。

  • 3-DES:使用3条56位的密钥对数据进行三次加密,是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准)。

  • AES:使用128、192、和256位密钥,并且用128位分组加密和解密数据。

  • 异或:与其说这是一种加密算法,倒不如称其为文件信息的简单变换,将每一个数据与某给定数据进行异或操作即可完成加密或解密,如dataEncrypt = dataSource^dataSecret。

以最简单的异或算法为例


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.nio.file.Files;

/**
 * @author ccr
 * @date 2021/4/19
 * @description 文件加解密
 */
public class FileEncDecUtil {

    private static final Logger log = LoggerFactory.getLogger(FileEncDecUtil.class);

    /**
     * 加密解密秘钥
     */
    private static final int NUM_OF_ENC_AND_DEC = 0x99;


    /**
     * 文件加密、解密操作相同
     *
     * @param srcFile 源文件路径
     * @param encFile 保存文件路径
     */
    public static void handle(File srcFile, File encFile) {
        if (!srcFile.exists()) {
            log.error("源文件不存在");
            return;
        }

        try {
            handle(new FileInputStream(srcFile), encFile);

        } catch (IOException io) {
            log.error("文件加/解密失败", io);
        }
    }

    /**
     * 文件加密、解密操作相同
     *
     * @param fis 输入文件流
     * @param destFile 目标文件路径
     */
    public static void handle(InputStream fis, File destFile) {
        OutputStream fos = null;
        try {
            //如果文件路径不存在,先创建路径
            if (!destFile.getParentFile().exists()) {
                Files.createDirectories(destFile.getParentFile().toPath());
            }
            //如果文件不存在,先创建文件
            if (!destFile.exists()) {
                destFile.createNewFile();
            }

            fos = new FileOutputStream(destFile);

            int dataOfFile = 0;
            while ((dataOfFile = fis.read()) > -1) {
                fos.write(dataOfFile ^ NUM_OF_ENC_AND_DEC);
            }

            fos.flush();
        } catch (IOException io) {
            log.error("文件加/解密失败", io);
        } finally {
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException fisIO) {
                log.error("输入流关闭失败", fisIO);
            } finally {
                try {
                    if (fos != null) {
                        fos.close();
                    }
                } catch (IOException fosIO) {
                    log.error("输出流关闭失败", fosIO);
                }
            }
        }
    }

}

文件加密

原文:https://www.cnblogs.com/abcoder/p/file-encrypt.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!