使用的是异或运算符,通过读取到每个字节,然后每个字节通过异或运算符进行加密,解密则再执行一次
/**
* 文件加密key值,
* 其实是对文件的字节 进行 异或 操作,
* 两次异或 得到 原始文件 --》 上传异或一次,下载异或一次。
*/
private static final char ENCRYPTED_KEY = '9';
上传文件时:
// 文件 加密存储 操作
fileEnc(file, newFile);
下载文件时:
// 文件 解密获取 操作 (异或) -- 已输出到 响应流
fileDec(file, response);
/**
* 文件 加密存储 操作 (异或)
*
* @param file 上传文件
* @param newFile 新文件
*/
private void fileEnc(MultipartFile file, File newFile) {
try (OutputStream os = new FileOutputStream(newFile);
InputStream ins = file.getInputStream()) {
fileXor(ins, os);
} catch (Exception e) {
logger.error("文件【{}】加密存储 操作,出现异常,", file.getOriginalFilename(), e);
}
}
/**
* 文件 解密获取 操作 (异或)
*
* @param file 原始文件(已加密)
* @param response 待输出文件
*/
private void fileDec(File file, HttpServletResponse response) {
try (InputStream ins = new FileInputStream(file);
OutputStream os = response.getOutputStream()) {
fileXor(ins, os);
} catch (Exception e) {
logger.error("文件下载操作【文件输出】,出现异常,", e);
}
}
/**
* 文件 异或 操作
*/
private void fileXor(InputStream ins, OutputStream os) throws IOException {
int length;
byte[] buffer = new byte[2048];
// 每次读2048个字节然后遍历每个字节进行位异或运算
while ((length = ins.read(buffer, 0, 2048)) != -1) {
for (int i = 0; i < buffer.length; i++) {
// 通过异或运算某个数字或字符串
buffer[i] = (byte) (buffer[i] ^ ENCRYPTED_KEY);
}
os.write(buffer, 0, length);
}
}