package com.sunyard.encrypt; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ConnectException; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.util.Properties; //#define ERR_CONNECT 9001 /*联机错误*/ //#define ERR_SEND 9002 /*发送错误*/ //#define ERR_RECV 9003 /*接收错误*/ //#define ERR_CAL 9004 /*加押错误*/ //#define ERR_CHECK 9005 /*核押错误*/ //#define ERR_SIGN 9006 /*核对签名错误*/ //#define ERR_SENDER 9007 /*发报行标识错误*/ //#define ERR_RECEIVER 9008 /*收报行标识错误*/ //#define ERR_EXCEPTION 9009 /*加密卡处理异常*/ //#define ERR_DATA 9010 /*数据报文错误*/ //#define ERR_TIMEOUT 9011 /*网络通信超时*/ //#define ERR_PURVIEW 9012 /*发报行无编押权限*/ public class DraftEncrypt { String ServerName1; /*密押服务器地址1*/ String ServerName2; /*密押服务器地址2*/ Socket sock_check; int m_TimeOut; int m_MyLoopNum; int m_MyLoopFlag; int m_port = 8889; String m_CipherValue; public DraftEncrypt() throws IOException { sock_check = null; m_TimeOut=10; m_MyLoopNum=0; m_MyLoopFlag=0; m_CipherValue = null; m_port = 8889; } public String getCipherValue() { return m_CipherValue; } public void setCipherValue(String cipherValue) { m_CipherValue = cipherValue; } public String config(String appName) { InputStream is = this.getClass().getClassLoader().getResourceAsStream( "config.ini"); Properties p = new Properties(); try { p.load(is); } catch (IOException e) { e.printStackTrace(); } return p.getProperty(appName); } public void CloseConnect_MY() throws IOException { if(sock_check!=null) { //System.out.println("sock:"+sock_check); sock_check.shutdownOutput(); sock_check.close(); sock_check = null; } if(m_MyLoopFlag==0) m_MyLoopFlag=1; else m_MyLoopFlag=0; } public int DraftEncrypt(int TransactType,char YwType, String Date,String SerialNo,String Amount, String SendNode, String RecvNode, String OtherInfo, String CipherValue,String My_IPAdress1, String My_IPAdress2,int TimeOut) throws IOException { int len = OtherInfo.length(); if(len<8){ OtherInfo = addZero(OtherInfo, 8); }else{ if(len%2 == 1){ len+=1; } OtherInfo = addZero(OtherInfo, len); } /*char[] byteOther = getSerialNo(OtherInfo); for(int i =0 ;i=8){ char[] hex1=getSerialNo(OtherInfo); System.out.println(hex1); String ssss = ""; for(int i=0;i<4;i++){ ssss=ssss+hex1[i]; } OtherInfo=ssss; } System.out.println(BytesToString(OtherInfo.getBytes())+OtherInfo.length()); int y =OtherInfo.charAt(0); char a = 0x88; byte a1 = (byte) a; int a2 = a; System.out.println(y); SetParamAll(My_IPAdress1,My_IPAdress2,TimeOut); // System.out.println("in DraftEncrypt, hello!!!"); // m_CipherValue = "1234567890"; // return 0; return DraftEncrypt1(TransactType,YwType,Date,SerialNo,Amount,SendNode,RecvNode,OtherInfo,CipherValue); } public int DraftEncrypt1(int TransactType,char YwType,String Date,String SerialNo,String Amount,String SendNode,String RecvNode,String OtherInfo,String CipherValue) throws IOException { int ret_code ; ret_code = CipherTransact(TransactType, YwType, Date, SerialNo, Amount, SendNode, RecvNode, OtherInfo, CipherValue); if((ret_code == 9001) || (ret_code == 9002) || (ret_code == 9003) || (ret_code == 9011) || (ret_code == 9009)) { CloseConnect_MY(); // 如 果第一个密押服务器通讯错误,则自动用第二个密押服务器的IP地址 ret_code = CipherTransact(TransactType, YwType, Date, SerialNo, Amount, SendNode, RecvNode, OtherInfo, CipherValue); return ret_code; } else { return ret_code; } } public int SetParamAll(String My_IPAdress1,String My_IPAdress2,int TimeOut) { int ret; ret=My_IPAdress1.length(); if(ret>99) return -1; ServerName1=My_IPAdress1; ret=My_IPAdress2.length(); if(ret>99) return -2; ServerName2=My_IPAdress2; if(TimeOut<2) m_TimeOut=2; else if(TimeOut>120) m_TimeOut=120; else m_TimeOut=TimeOut; return 0; } private static char[] enlargechar(char[] summand, String addend, int from) { int len = addend.length(); for (int i = 0; i < len; i++) { summand[from + i] = addend.charAt(i); } return summand; } public Socket testIP(String ip, int port) throws NumberFormatException, UnknownHostException, IOException { SocketAddress ipt; Socket socket1; try { System.out.print("IP:"+ip+" port:"+port); ipt = new InetSocketAddress(ip, port); socket1 = new Socket(); socket1.connect(ipt, 1000); if (socket1.isClosed() == false && socket1.isConnected() == true) return socket1; } catch (ConnectException e) { System.out.println("注意:"+ip+ "连接异常!"); } catch (SocketTimeoutException e) { System.out.println("注意:"+ip+ "Socket连接超时异常!"); } return null; } public BufferedOutputStream getBufferedWriter(Socket socket) throws IOException { OutputStream out = socket.getOutputStream(); BufferedOutputStream writer = new BufferedOutputStream(out); return writer; } public BufferedInputStream getBufferedRead(Socket socket) throws IOException { InputStream in = socket.getInputStream(); BufferedInputStream reader = new BufferedInputStream(in); return reader; } private byte[] getBytes (char[] chars) { Charset cs = Charset.forName ("UTF-8"); CharBuffer cb = CharBuffer.allocate (chars.length); cb.put (chars); cb.flip (); ByteBuffer bb = cs.encode (cb); return bb.array(); } private char[] getChars (byte[] bytes) { Charset cs = Charset.forName ("UTF-8"); ByteBuffer bb = ByteBuffer.allocate (bytes.length); bb.put (bytes); bb.flip (); CharBuffer cb = cs.decode (bb); return cb.array(); } private char[] getSerialNo(String s){ char hex[] =new char[8]; char ch ; for(int i=0;i='0'&&ch<='9'){ ch-='0'; } if(ch>='A'&&ch<='F'){ ch=(char) (ch-'A'); ch=(char) (ch+10); } if(i%2==0) { hex[i/2]=(char) (ch<<4); } else { hex[i/2]=(char) (hex[i/2]|ch); } } return hex; } public int CipherTransact(int TransactType,char YwType,String Date,String SerialNo,String Amount,String SendNode,String RecvNode,String OtherInfo,String CipherValue) throws NumberFormatException, UnknownHostException, IOException { // unsigned char Send_Data[2000],Recv_Data[2000]; char Send_Data[] = new char[180]; char Recv_Data[] = new char[2000]; String temp; int Len_No,Len_Send; // int i; // unsigned int my_value; //Package // memset(Send_Data,0x00,180); int s =0; for (int j = 0; j < Send_Data.length; j++) { Send_Data[j] = 0x00; } // memcpy(Send_Data,"SYD",3); Send_Data[0]='S'; Send_Data[1]='Y'; Send_Data[2]='D'; Send_Data[3]=1; Send_Data[4]=(char)(m_MyLoopNum/256); Send_Data[5]=(char)(m_MyLoopNum%256); m_MyLoopNum=(m_MyLoopNum+1)%65536; Send_Data[6]=0; Send_Data[7]=124+32+5; if(SerialNo.length()==16){ s =18000+TransactType; char[] hex=getSerialNo(SerialNo); String ss = ""; for(int i=0;i12) // Len_No=12; // memcpy(Send_Data+8+32+37+(12-Len_No),SendNode,Len_No); Len_No = SendNode.length(); if(Len_No>12){ Len_No=12; SendNode = SendNode.substring(0,12); } Send_Data = enlargechar(Send_Data, SendNode, 77+(12-Len_No)); // Len_No=strlen(RecvNode); // if(Len_No>12) // Len_No=12; // memcpy(Send_Data+8+32+49+(12-Len_No),RecvNode,Len_No); Len_No = RecvNode.length(); if(Len_No>12){ Len_No=12; RecvNode = RecvNode.substring(0,12); } Send_Data = enlargechar(Send_Data, RecvNode, 89+(12-Len_No)); // memcpy(Send_Data+8+32+61,OtherInfo,60); //ding // if(SerialNo.length()==16){ // s =18000+TransactType; // char[] hex=getSerialNo(SerialNo); // String ss = ""; // for(int i=0;i= '0' && hex_char1 <= '9') int_ch1 = (hex_char1 - 48) * 16; // // 0 锟斤拷Ascll - 48 else if (hex_char1 >= 'A' && hex_char1 <= 'F') int_ch1 = (hex_char1 - 55) * 16; // // A 锟斤拷Ascll - 65 else return null; i++; char hex_char2 = hexString.charAt(i); // /锟斤拷位16锟斤拷锟斤拷锟斤拷锟叫的第讹拷位(锟斤拷位) int int_ch2; if (hex_char2 >= '0' && hex_char2 <= '9') int_ch2 = (hex_char2 - 48); // // 0 锟斤拷Ascll - 48 else if (hex_char2 >= 'A' && hex_char2 <= 'F') int_ch2 = hex_char2 - 55; // // A 锟斤拷Ascll - 65 else return null; int_ch = int_ch1 + int_ch2; retData[i / 2] = (byte) int_ch;// 锟斤拷转锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷Byte锟斤拷 } return retData; } }