最近开发的系统需要对字符串进行解密,方法是delphi写的,所以通过JNative调用dll进行解密。
开发环境是64位操作系统、eclipse。
首先将dll文件拷贝到system32目录下,然后从本地读取需要解密的文件内容。
java代码:FileUtil
/**
* 读取文件
*
*/
public static StringBuffer ReadTxtFile(String FileName) throws Exception {
FileReader fr = new FileReader(FileName);
BufferedReader br = new BufferedReader(fr);
char[] buffer = new char[1024];
StringBuffer sb = new StringBuffer();
int len = 0;
while ((len = br.read(buffer)) != -1) {
sb.append(buffer, 0, len);
}
if (br != null) {
br.close();
}
if (fr != null) {
fr.close();
}
return sb;
}
去掉特殊字符(换行),就是因为这个问题调了好几天,报各种错,最后发现竟然是换行不能处理!
//StringUtil
public static String replaceBlank(String str) {
String dest = "";
if (str!=null) {
Pattern p = Pattern.compile("\\s*|\t|\r|\n");
Matcher m = p.matcher(str);
dest = m.replaceAll("");
}
return dest;
}
最后使用JNative调用dll方法
CommonFunction
public static String decrypt(String source, String dllName, String dllMethod, String key) {
System.setProperty("jnative.debug", "true");
String s = "";
if (StringUtil.isNotBlankAll(dllName, key)) {
JNative jn;
try {
jn = new JNative(dllName, dllMethod);//dll文件名、方法名
jn.setRetVal(Type.STRING);
jn.setParameter(0, Type.STRING, source);//参数1
jn.setParameter(1, Type.STRING, key);//参数2
jn.invoke();
s = jn.getRetVal();
jn.dispose();
} catch (NativeException e) {
} catch (IllegalAccessException e) {
}
}
return s;
}
public static void main(String[] args) throws Exception {
StringBuffer source = FileUtil.ReadTxtFile("D://a.abs");
String sources = source.toString();
String s = CommonFunction.decrypt(StringUtil.replaceBlank(sources), "abc.<span style="font-family: Arial, Helvetica, sans-serif;">dll</span><span style="font-family: Arial, Helvetica, sans-serif;">", "methodname", “param1”);</span>
System.out.println(s);
}