文件加密,主要是文件上传至服务器后不能被直接打开,所以只要修改其中的二进制编码保证不能被软件正常打开即可。
常见的加密算法有:
MD5:以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
SHA:接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
DES:把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,主要分为两步:
初始置换,把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位…依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位。
逆置换,经过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