import heidu004.domain.EmployeeInfo;
import heidu004.persistence.EmployeeInfoDAOImpl;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
public class Dll {
/*
*WebInterface.dll中相关方法
* --------------------------------------------------------------------------------------------
*function EncryptPswStr(PswStr, ResultBuff: PChar; PswLen, BuffLen: Integer): Integer; stdcall;
*加密密码字符串
*参数:
*PswStr:需要加密的密码字符串
*ResultBuff:存放加密后的密码字符串的缓冲区。该值为变参
*在调用本函数前,需要为这个缓冲区分配足够的内存空间来接受加密后生成的字符串。
*PswLen:需要加密的密码字符串的长度
*BuffLen:接受加密后生成的字符串的缓冲区的长度。
*这个长度不能大于ResultBuff实际拥有的内存空间长度,否则会造成缓冲区溢出而出现调用异常。
*返回值:
*32位整数,此值表示的是加密后生成的字符串的实际长度,小于或等于BufferLen。若把返回值赋值给N,
*而N小于BufferLen则表示ResultBuff缓冲区中只有前面的N个字节是有效的。
*--------------------------------------------------------------------------------------------
*function DecryptPswStr(PswStr, ResultBuff: PChar; PswLen, BuffLen: Integer): Integer; stdcall;
*解密密码字符串
*参数:
*PswStr:需要解密的密码字符串
*ResultBuff:存放解密后的密码字符串的缓冲区。该值为变参
*在调用本函数前,需要为这个缓冲区分配足够的内存空间来接受解密后生成的字符串。
*PswLen:需要解密的密码字符串的长度
*BuffLen:接受解密后生成的字符串的缓冲区的长度。
*这个长度不能大于ResultBuff实际拥有的内存空间长度,否则会造成缓冲区溢出而出现调用异常。
*返回值:
*32位整数,此值表示的是解密后生成的字符串的实际长度,小于或等于BufferLen。若把返回值赋值给N,
*而N小于BufferLen则表示ResultBuff缓冲区中只有前面的N个字节是有效的。
*--------------------------------------------------------------------------------------------
*function NotifyReadMeter(): Integer; stdcall;
*抄表通知
*参数:无
*返回值:
*32位整数,此值若为零表示抄表通知不成功,可能是抄表软件没有启动、抄表软件版本不正确等等原因。
*若不为零表示抄表通知已经成功。
*/
/*
* 加密
*/
public static final Integer EncryptPswStr(String PswStr, Pointer po,Integer PswLen,Integer BuffLen) throws NativeException, IllegalAccessException{
/*
* 方法 一动态连接库的位置是系统目录C:/WINDOWS/system32(在web工程下时路径为 例tomcat/bin)
* System.loadLibrary("WebInterface");
* 注意事项如果该项目是web工程时需要将JNativeCpp.dll放到web 服务器的bin中
* 否则会报java.lang.IllegalStateException: JNative library not loaded, sorry !
* 不是web工程时需要将JNativeCpp.dll放入系统C:/WINDOWS/system32目录中
*/
System.loadLibrary("WebInterface");//我用的是方法一:WebInterface指的是动态链接库名
JNative n = null;
n = new JNative("WebInterface","EncryptPswStr");
n.setRetVal(Type.INT);//返回类型整型Type.INT
int i =0;
n.setParameter(i++,PswStr);//方法的了内部参数PswStr 为字符(Type.STRING)类型
n.setParameter(i++,po);//方法的了内部参数po 为字符(Type.STRING)类型
n.setParameter(i++,PswLen);//方法的了内部参数PswLen 为字符(Type.STRING)类型
n.setParameter(i++,BuffLen);//方法的了内部参数BuffLen 为字符(Type.STRING)类型
n.invoke();//加载
return Integer.parseInt(n.getRetVal());
}
/*
* 解密
*/
public static final Integer DecryptPswStr(String PswStr, Pointer po,Integer PswLen,Integer BuffLen) throws NativeException, IllegalAccessException{
/*
* 方法 一动态连接库的位置是系统目录C:/WINDOWS/system32(在web工程下时路径为 例tomcat/bin)
* System.loadLibrary("WebInterface");
* 注意事项如果该项目是web工程时需要将JNativeCpp.dll放到web 服务器的bin中
* 否则会报java.lang.IllegalStateException: JNative library not loaded, sorry !
* 不是web工程时需要将JNativeCpp.dll放入系统C:/WINDOWS/system32目录中
*/
System.loadLibrary("WebInterface");//WebInterface指的是动态链接库名
JNative n = null;
n = new JNative("WebInterface","DecryptPswStr");//动态连接库内部方法
n.setRetVal(Type.INT);//返回类型整型Type.INT
int i =0;
n.setParameter(i++,PswStr);//方法的了内部参数PswStr 为字符(Type.STRING)类型
n.setParameter(i++,po);//方法的了内部参数po 为字符(Type.STRING)类型
n.setParameter(i++,PswLen);//方法的了内部参数PswLen 为字符(Type.STRING)类型
n.setParameter(i++,BuffLen);//方法的了内部参数BuffLen 为字符(Type.STRING)类型
n.invoke();//加载
return Integer.parseInt(n.getRetVal());
}
/*
* 十六进制转换成字符
*/
private static String hex16Str(String theHex) {
String theRst = "";
byte[] theByte = new byte[theHex.length() / 2];
try {
for (int i = 0; i < theHex.length(); i += 2) {
theByte[i / 2 ] = Integer.decode("0X"+
theHex.substring(i, i + 2)).byteValue();
}
theRst = new String(theByte, 0, theByte.length, "Shift_JIS"); //Shift_JIS日文编码表
} catch (Exception Ue) {
Ue.printStackTrace();
}
return theRst;
}
/*
* 转字符换成十六进制
*/
private static String str16Hex(String theStr) {
byte[] bytes;
String result = "";
int tmp;
String tmpStr;
try {
bytes = theStr.getBytes("Shift_JIS"); //Shift_JIS日文编码表
for (int i = 0; i < bytes.length; i++) {
if (bytes[i] < 0) {
tmp = 256 + bytes[i];
tmpStr = Integer.toHexString(tmp).toUpperCase();
result += tmpStr;
} else {
tmpStr = Integer.toHexString(bytes[i]).toUpperCase();
result += tmpStr.length()==1?"0"+tmpStr:tmpStr;
}
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
public static void main(String[] args) throws NativeException, IllegalAccessException, SQLException {
EmployeeInfoDAOImpl eImpl=new EmployeeInfoDAOImpl();//自定义的一个类用于查询验证密码
String pws="";
EmployeeInfo emp=eImpl.selectEmployeeInfo("888");//用户名888返回十六进制编码
System.out.println("十六进制编码:0x"+emp.getPass());
pws=hex16Str(emp.getPass());
System.out.println("字符串组合编码"+pws);
Pointer po1=new Pointer(MemoryBlockFactory.createMemoryBlock(pws.length()));//定义java指针用于解决变参的传递
Integer PswLen=pws.length();
Integer BuffLen=pws.length();
/*
* 准备解密
* Dll.DecryptPswStr(字符串, 指针区域"缓冲区", 字符长度, 指针区域"缓冲区"打小)
*/
Dll.DecryptPswStr(pws, po1, PswLen, BuffLen);//解密密码字符串
System.out.println("解密密码字符串:"+po1.getAsString());
/*
* 准别加密
* Dll.EncryptPswStr(字符串, 指针区域"缓冲区", 字符长度, 指针区域"缓冲区"打小)
*/
Dll.EncryptPswStr(po1.getAsString(), po1, PswLen, BuffLen);//加密密码字符串
System.out.println("生成字符串组合编码:"+po1.getAsString());
System.out.println("字符串转换十六进制编码:0x"+str16Hex(po1.getAsString()));
}
}