You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
4.6 KiB

2 years ago
/*
* Copyright (C), 2018-2022
* Project: starter
* FileName: InteKeyHandler
* Author: xx
* Date: 2022/3/7 11:19
*/
package com.fr.plugin.gb.utils;
import com.fanruan.api.i18n.I18nKit;
import com.fanruan.api.log.LogKit;
import com.fanruan.api.util.IOKit;
import com.fanruan.api.util.StringKit;
import com.fr.general.ComparatorUtils;
import com.fr.plugin.context.PluginContexts;
import java.io.*;
/**
* <Function Description><br>
* <InteKeyHandler>
*
* @author xx
* @since 1.0.0
*/
public class InteKeyHandler {
private static volatile InteKeyHandler handler = null;
public InteKeyHandler() {
}
public static InteKeyHandler getInstance() {
if (handler == null) {
handler = new InteKeyHandler();
}
return handler;
}
/**
* 加密文件操作
*
* @param out
* @param file
*/
public void encryptFile(OutputStream out, File file) {
if (PluginContexts.currentContext() == null || !PluginContexts.currentContext().isAvailable()) {
LogKit.error(I18nKit.getLocText("Plugin-gb_Licence_Expired"));
return;
}
LogKit.info("gb-InteKeyHandler-encryptFile-filePath:{}", file.getAbsolutePath());
if (!encrypt(file.getAbsolutePath())) {
return;
}
try {
FileInputStream in = new FileInputStream(file);
byte[] b = new byte[1024];
int len;
while ((len = in.read(b)) != -1) {
out.write(b, 0, len);
}
out.close();
in.close();
} catch (IOException e) {
LogKit.error(e.getMessage(), e);
}
}
/**
* 输入流解密操作
*
* @param inputStream
* @return
*/
public File decrypt(InputStream inputStream) {
if (PluginContexts.currentContext() == null || !PluginContexts.currentContext().isAvailable()) {
LogKit.error(I18nKit.getLocText("Plugin-gb_Licence_Expired"));
return null;
}
byte[] bytes = IOKit.inputStream2Bytes(inputStream);
FileOutputStream fos = null;
File tempFile = null;
try {
tempFile = File.createTempFile("InteKey", StringKit.EMPTY);
fos = new FileOutputStream(tempFile);
fos.write(bytes);
//流关闭,指针null,目的是为了解密的时候这个程序这边不占用,要不然解密的时候会报错,文件被其他文件占用
fos.flush();
fos.close();
fos = null;
String filePath = tempFile.getAbsolutePath();
tempFile = null;
LogKit.info("gb-InteKeyHandler-decrypt-filePath:{}", filePath);
if (!isEncryptFile(filePath)) {
LogKit.info("gb-InteKeyHandler-decrypt-Not Encrypt File");
return new File(filePath);
}
if (!decrypt(filePath)) {
LogKit.info("gb-InteKeyHandler-decrypt-File decrypt failed");
return new File(filePath);
}
LogKit.info("gb-InteKeyHandler-decrypt-FileInputStream");
return new File(filePath);
} catch (Exception e) {
LogKit.error(e.getMessage(), e);
return null;
}
}
public boolean encrypt(String path) {
System.setProperty("jna.encoding", "GBK");
int resultCode;
resultCode = DLLUtil.dllUtil64.Ea(path);
LogKit.info("gb-InteKeyHandler-encrypt-resultCode:{}", resultCode);
return ComparatorUtils.equals(resultCode, 0);
// return true;
}
public boolean decrypt(String path) {
int resultCode = -1;
int index = 0;
while (true) {
if (!ComparatorUtils.equals(DLLUtil.dllUtil64.Ia(path), 0)) {
resultCode = DLLUtil.dllUtil64.Da(path, 1, "");
} else {
break;
}
index++;
if (index > 20) {
break;
}
}
LogKit.info("gb-InteKeyHandler-decrypt-resultCode:{}", resultCode);
return ComparatorUtils.equals(resultCode, 0);
// return true;
}
public boolean isEncryptFile(String path) {
System.setProperty("jna.encoding", "GBK");
int resultCode;
resultCode = DLLUtil.dllUtil64.Ia(path);
LogKit.info("gb-InteKeyHandler-isEncryptFile-resultCode:{}", resultCode);
return ComparatorUtils.equals(resultCode, 1) || ComparatorUtils.equals(resultCode, 2);
// return true;
}
}