This commit is contained in:
cheney 2026-06-15 17:59:34 +08:00
parent bef30231f0
commit 3b255514dd
19 changed files with 2576 additions and 0 deletions

BIN
DraftEncrypt.class Normal file

Binary file not shown.

29
test/test/.gitignore vendored Normal file
View File

@ -0,0 +1,29 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

5
test/test/.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/DraftEncrypt.java" charset="UTF-8" />
</component>
</project>

6
test/test/.idea/misc.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/test.iml" filepath="$PROJECT_DIR$/test.iml" />
</modules>
</component>
</project>

8
test/test/1.txt Normal file
View File

@ -0,0 +1,8 @@
535944
01
0000
00A1
0000000000000000000000000000000000000000000000000000000000000000
3136303030
05
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

View File

@ -0,0 +1,665 @@
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<byteOther.length;i++){
System.out.println("jjjjj"+byteOther[i]+"ijjjj");
}
OtherInfo = new String(byteOther);*/
if(OtherInfo.length()>=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.println("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<s.length();i++){
ch=s.charAt(i);
if(ch>='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;i<hex.length;i++){
ss=ss+hex[i];
}
SerialNo=ss;
}else{
s =16000+TransactType;
}
Send_Data = enlargechar(Send_Data, s+"", 40);
// int s =16000+TransactType;
// Send_Data = enlargechar(Send_Data, s+"", 40);
// if(TransactType==0)
// Send_Data = enlargechar(Send_Data, "16000", 40);
//// memcpy(Send_Data+8+32,"16000",5);
// else if(TransactType==1)
// Send_Data = enlargechar(Send_Data, "16001", 40);
//// memcpy(Send_Data+8+32,"16001",5);
// else
// Send_Data = enlargechar(Send_Data, "16002", 40);
//// memcpy(Send_Data+8+32,"16002",5);
// memcpy(Send_Data+8+32+5,&YwType,1);
Send_Data[45] = YwType;
// memcpy(Send_Data+8+32+6,Date,8);
Send_Data = enlargechar(Send_Data, Date, 46);
// memcpy(Send_Data+8+32+14,SerialNo,8);
Send_Data = enlargechar(Send_Data, SerialNo, 54);
// memcpy(Send_Data+8+32+22,Amount,15);
Send_Data = enlargechar(Send_Data, Amount, 62);
// Len_No=strlen(SendNode);
// if(Len_No>12)
// 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<hex.length;i++){
// ss=ss+hex[i];
// }
// SerialNo=ss;
// }
/*else
{
StringBuffer ddbuf = new StringBuffer();
int ddlen = OtherInfo.length();
int ddtmp = 8 - ddlen ;
for(int i=0;i<ddtmp;i++){
ddbuf.append("0");
}
ddbuf.append(OtherInfo);
String sss = ddbuf.toString() ;
OtherInfo = sss;
char[] hex1=getSerialNo(OtherInfo);
String ss = "";
for(int i=0;i<OtherInfo.length()/2+1;i++){
ss=ss+hex1[i];
}
OtherInfo=ss;
}*/
//ding
Send_Data = enlargechar(Send_Data, OtherInfo, 101);
if(TransactType%2==1)
{
Long value;
value = Long.parseLong(CipherValue);
temp = Long.toHexString(value).toUpperCase();
// System.out.println("temp:1:" + temp);
if (temp.length()!= 8)
temp = stradd0(temp,8);
//System.out.println("temp:2:" + temp);
Send_Data = enlargechar(Send_Data, temp, 161);
}
Len_Send=8+32+5+124;
// System.out.println("Send_Data:"+Send_Data.toString());
// System.out.println("zubao hou..."+Len_Send);
//SOCKET_PACKET_180
Len_Send=180;
// System.out.println("Send_Data:"+Send_Data);
// System.out.println("Send_Data FF:"+Send_Data);
//for (int i=0; i<Send_Data.length; i++) {
//System.out.println("i:"+i+":"+Send_Data[i]);
//}
//byte a[]= getBytes(Send_Data);
StringBuffer str = new StringBuffer();
// System.out.println("size:"+Send_Data.length);
for (int i=0; i<Send_Data.length; i++) {
str.append(Send_Data[i]);
// System.out.println("i:"+i+":"+Send_Data[i]);
}
// for(int j=0;j<Send_Data.length;j++){
// if(j%10==0)
// System.out.println();
// System.out.print(Send_Data[j]);
// }
byte a[] =str.toString().getBytes("UTF-8");
/*System.out.println(a.length);
System.out.println(new String(a));*/
byte data[] = new byte[Len_Send];
for(int i=0,j=0; i <a.length;i++){
if( a[i]== -62 ){
System.out.println(i);
;
}
else{
data[j]=a[i];
j++;
}
}
if(sock_check==null){
if(m_MyLoopFlag==0) {
sock_check = testIP(ServerName1, m_port);
if(sock_check==null){
sock_check = testIP(ServerName2,m_port);
if(sock_check==null){
System.out.println("连接支付密码服务器失败!");
return 9001;
}
}
}
else{
sock_check = testIP(ServerName2,m_port);
if(sock_check==null){
sock_check = testIP(ServerName2,m_port);
if(sock_check==null){
System.out.println("连接支付密码服务器失败!");
return 9001;
}
}
}
}
sock_check.setSendBufferSize(32767);
sock_check.setReceiveBufferSize(32767);
sock_check.setSoTimeout(10000);
try {
BufferedOutputStream bos = getBufferedWriter(sock_check);
System.out.println("send=" + BytesToString(data));
bos.write(data);
bos.flush();
byte[] rebound = new byte[Len_Send];
BufferedInputStream bis = getBufferedRead(sock_check);
int result = bis.read(rebound);
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
if (result == Len_Send) {
Recv_Data = getChars(rebound);
// for(int i=0;i<180;i++){
// System.out.println(Recv_Data[i]);
// }
// System.out.println("------");
// System.out.println(Recv_Data[42]);
// System.out.println(Recv_Data[43]);
// System.out.println(Recv_Data[44]);
// System.out.println(Recv_Data[45]);
} else {
CloseConnect_MY();
return 9003;
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("ERROR:"+e.getMessage());
return 9001;
} finally {
//System.out.println("关闭SOCK");
//CloseConnect_MY();
}
if(!(Recv_Data[42]=='0'&&Recv_Data[43]=='0'&&Recv_Data[44]=='0'&&Recv_Data[45]=='0')){
if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='2')
return (9007);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='3') {
System.out.println("ERROR-NO");
return (9008);
}
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='9')
return (9009);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='4')
return (9010);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='1')
return(9005);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='5')
return(9012);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='6')
return(9004);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='1'&&Recv_Data[45]=='0')
return(9014);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='1'&&Recv_Data[45]=='1')
return(9013);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='1'&&Recv_Data[45]=='2')
return(9015);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='1'&&Recv_Data[45]=='3')
return(9016);
else
return (9010);
}
// System.out.println("Recv_Data:"+Recv_Data);
// System.out.println(TransactType);
if(TransactType%2 == 0)
{
StringBuffer temp1 = new StringBuffer();
for (int i=46; i<54; i++) {
temp1.append(Recv_Data[i]);
}
temp = temp1.toString();
Long iCipherValue;
//ding_System.out.println("temp:"+temp);
iCipherValue = Long.parseLong(temp, 16);
m_CipherValue = Long.toString(iCipherValue);
//如果小于10位前面补0
for(;m_CipherValue.length()<10;){
m_CipherValue = "0"+m_CipherValue;
}
// if (m_CipherValue.length()<10) {
// m_CipherValue = "0"+m_CipherValue;
// }
return 0;
}
return 0;
}
private static String stradd0(String str, int n) {
StringBuffer so = new StringBuffer();
for (int i = 0; i < (n - str.length()); i++) {
so.append("0");
}
so.append(str);
str = so.toString();
return str;
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
// System.out.println("hello");
// Long x;
// x = Long.parseLong("3663412897");
//
// String str = Long.toHexString(x);
// str = DraftEncrypt.stradd0(str, 8).toUpperCase();
// System.out.println(str.substring(0, 8));
//
// String q = "DA5B3EA1";
// Long qq = Long.parseLong(q, 16);
// System.out.println(qq);
// DraftEncrypt de = new DraftEncrypt();
// int ret = de.DraftEncrypt(0, (char) 0x03, "20120825", "10000176", "000000000004400",
// "001410122012", "001000000016", "", "", "192.168.1.212", "192.168.1.212", 100);
// System.out.println("ret="+ret+" IP:"+de.ServerName1+", "+de.getCipherValue());
}
private String addZero(String str,int lenTotal){
String strAns = str;
int len = str.length();
for(int i=0;i<lenTotal-len;i++){
strAns = strAns+"0";
}
return strAns;
}
private String BytesToString(byte[] bArray) {
if (bArray == null) {
return null;
}
if (bArray.length == 0) {
return "";
}
StringBuffer sb = new StringBuffer(bArray.length);
String sTemp;
for (int i = 0; i < bArray.length; i++) {
sTemp = Integer.toHexString(0xFF & bArray[i]);
if (sTemp.length() < 2)
sb.append(0);
sb.append(sTemp.toUpperCase());
}
return sb.toString();
}
/**
*
*
* @param data
* "00AF"
* @return 0x00, 0xAF
*/
private static byte[] StringToBytes(String data) {
String hexString = data.toUpperCase().trim();
if (hexString.length() % 2 != 0) {
return null;
}
byte[] retData = new byte[hexString.length() / 2];
for (int i = 0; i < hexString.length(); i++) {
int int_ch; // 锟斤拷位16锟斤拷锟斤拷锟斤拷转锟斤拷锟斤拷锟 0锟斤拷锟斤拷锟斤拷
char hex_char1 = hexString.charAt(i); // //锟斤拷位16锟斤拷锟斤拷锟斤拷锟叫的碉拷一位(锟斤拷位*16)
int int_ch1;
if (hex_char1 >= '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;
}
}
//535944
// 01
// 0000
// 00A1
//0000000000000000000000000000000000000000000000000000000000000000
// 31
// 36303030050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

9
test/test/src/T.java Normal file
View File

@ -0,0 +1,9 @@
public class T {
public static void main(String[] args) {
System.out.println(30L * 24L * 60L * 60L * 1000L);
}
}

215
test/test/src/Test.java Normal file
View File

@ -0,0 +1,215 @@
package com.sunyard.encrypt;
import java.io.IOException;
import com.sunyard.encrypt.DraftEncrypt;
public class Test {
/**
* @param args
* @throws IOException
*/
private static char[] getSerialNo(String s){
char hex[] =new char[8];
char ch ;
for(int i=0;i<s.length();i++){
ch=s.charAt(i);
if(ch>='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 static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
/*****************************************************************************
DraftEncrypt:编核押函数
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)
参数说明
TransactType处理类型2k编押 2k+1核押
(k = 0,只有一种密钥适用于密押机I型)
k为整数0k9,代表10种密钥类型适用于密押机II型)
YwType 业务种类(0x01,0x02,0x03,0x04,0x05)
(0x01=现金汇票,0x02=可转转帐汇票,
0x03=不可转转帐汇票,0x04=查复书业务,0x05=划款业务)
Date 签票日期(例如"19990101")
SerialNo 汇票号码(8位"12345678"或16位1234567812345678)
Amount 金额 (单位为分,不含小数点,不足15位前补'0')
SendNode 签发网点号(例如"000000123456") 不足12位前补'0'
RecvNode 兑付网点号若无则全填'0'
划款业务时必须为904290099992
OtherInfo 前四个字节为查复书编号其余全填0x00若无则全填0x00
例如12345678压缩成四个字节为0x12,0x34,0x56,0x78
不足8位前补零例如12345压缩成四个字节为0x00,0x01,0x23,0x45
CipherValue密押
编押时出口值为计算出的密押
核押时入口值为需核验的密押
My_IPAdress1: IP地址1
My_IPAdress2: IP地址2
TimeOut 超时时间
编押时通过类的函数接口getCipherValue() 返回一个String的字符串
核押时入口值为需核验的密押
函数返回值
0 表示处理正常编押时密押在CipherValue字段返回核押表示密押核验正确 .
>0密押系统正常但要素或密押中含有非法值或者密押错误通讯错误等 .
错误代码
9001 联机错误
9002 发送错误
9003 接收错误
9004 编押错误
9005 核押错误
9006 核对签名错误
9007 发报行标识错误
9008 收报行标识错误
9009 加密卡处理异常
9010 数据报文错误
9011 网络通信超时
9012 发报行无编押权限
9013 密钥不存在
9014 兑付行号错误,当业务为划款业务时如果兑付行号不为904290099992时返回该错误
9015 密钥过期
9016 金额格式错误
*/
//编押返回值为0说明编押正常且可以通过getCipherValue()获得密押
/* int TransactType =3;
char YwType =(char)0x02;
String Date = "20151020";
String SerialNo = "9040004122999001";
String Amount = "000000000550000";
String SendNode = "213162000019";
String RecvNode = "000000000000";
String OtherInfo = "0x00";
String CipherValue = "0740128292";
String My_IPAdress1 = "192.168.1.10";
String My_IPAdress2 = "172.16.8.113";*/
int TransactType =0;
char YwType =(char)0x2;
String Date = "20251110";
String SerialNo = "10300200202511100000731236";
String Amount = "600000";
String SendNode = "1022401021000880495";
String RecvNode = "";
String OtherInfo = "";
String CipherValue = "";
String My_IPAdress1 = "172.1.40.161";
String My_IPAdress2 = "172.1.40.161";
int TimeOut = 100;
/*if(TransactType%2 == 1)
{
CipherValue = "3979564876";//核押需要输入
}*/
/*if(OtherInfo.length()>=8){
char[] hex1=getSerialNo(OtherInfo);
System.out.println(hex1);
String ssss = "";
for(int i=0;i<4;i++){
ssss=ssss+hex1[i];
}
OtherInfo=ssss;
}*///查复书时压缩字符串
/* for(int i =0 ;i<OtherInfo.length();i++){
int a = OtherInfo.charAt(i);
System.out.println("jjjjj"+a+"ijjjj");
}*/
DraftEncrypt de = new DraftEncrypt();
int ret = de.DraftEncrypt(TransactType,YwType,Date,SerialNo,Amount,
SendNode, RecvNode,OtherInfo,CipherValue,My_IPAdress1,My_IPAdress2,TimeOut);
/*int ret = de.DraftEncrypt(0, (char) 0x04, "20020422", "9934567812345678", "00000000.0000100",
"001420100008", "001420101021", "99999999", "2448307857",//可以随意输入一个字符
"172.16.8.113", "172.16.8.113", 100);*/
if(TransactType%2 == 0)
{
CipherValue = de.getCipherValue();//只有编押时需要调用
}
//核押返回值为0,说明通过其他返回值见说明
/* DraftEncrypt de = new DraftEncrypt();
int ret = de.DraftEncrypt(0, (char) 0x01, "20020422", "10000000", "000000000000100",
"001420100008", "001420101021", "", "096711466",
"192.168.1.212", "192.168.1.212", 100);
*/
switch(ret){
case 0:
if(TransactType%2 == 0)
System.out.println("编押正常,密押是:"+CipherValue);
else
System.out.println("核押正常");
break;
case 9001:
System.out.println("联机错误");
break;
case 9002:
System.out.println("发送错误");
break;
case 9003:
System.out.println("接收错误 ");
break;
case 9004:
System.out.println("加押错误");
break;
case 9005:
System.out.println("核押错误");
break;
case 9006:
System.out.println("核对签名错误");
break;
case 9007:
System.out.println("发报行标识错误");
break;
case 9008:
System.out.println("收报行标识错误");
break;
case 9009:
System.out.println("加密卡处理异常");
break;
case 9010:
System.out.println("数据报文错误");
break;
case 9011:
System.out.println("网络通信超时");
break;
case 9012:
System.out.println("发报行无编押权限");
break;
case 9013:
System.out.println("密钥不存在");
break;
case 9014:
System.out.println("兑付行号错误");
break;
case 9015:
System.out.println("密钥过期");
break;
case 9016:
System.out.println("金额格式错误");
break;
}
}
}

11
test/test/test.iml Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,547 @@
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
{
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<s.length();i++){
ch=s.charAt(i);
if(ch>='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;i<hex.length;i++){
ss=ss+hex[i];
}
SerialNo=ss;
}else{
s =16000+TransactType;
}
Send_Data = enlargechar(Send_Data, s+"", 40);
// int s =16000+TransactType;
// Send_Data = enlargechar(Send_Data, s+"", 40);
// if(TransactType==0)
// Send_Data = enlargechar(Send_Data, "16000", 40);
//// memcpy(Send_Data+8+32,"16000",5);
// else if(TransactType==1)
// Send_Data = enlargechar(Send_Data, "16001", 40);
//// memcpy(Send_Data+8+32,"16001",5);
// else
// Send_Data = enlargechar(Send_Data, "16002", 40);
//// memcpy(Send_Data+8+32,"16002",5);
// memcpy(Send_Data+8+32+5,&YwType,1);
Send_Data[45] = YwType;
// memcpy(Send_Data+8+32+6,Date,8);
Send_Data = enlargechar(Send_Data, Date, 46);
// memcpy(Send_Data+8+32+14,SerialNo,8);
Send_Data = enlargechar(Send_Data, SerialNo, 54);
// memcpy(Send_Data+8+32+22,Amount,15);
Send_Data = enlargechar(Send_Data, Amount, 62);
// Len_No=strlen(SendNode);
// if(Len_No>12)
// 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<hex.length;i++){
// ss=ss+hex[i];
// }
// SerialNo=ss;
// }
/*else
{
StringBuffer ddbuf = new StringBuffer();
int ddlen = OtherInfo.length();
int ddtmp = 8 - ddlen ;
for(int i=0;i<ddtmp;i++){
ddbuf.append("0");
}
ddbuf.append(OtherInfo);
String sss = ddbuf.toString() ;
OtherInfo = sss;
char[] hex1=getSerialNo(OtherInfo);
String ss = "";
for(int i=0;i<OtherInfo.length()/2+1;i++){
ss=ss+hex1[i];
}
OtherInfo=ss;
}*/
//ding
Send_Data = enlargechar(Send_Data, OtherInfo, 101);
if(TransactType%2==1)
{
Long value;
value = Long.parseLong(CipherValue);
temp = Long.toHexString(value).toUpperCase();
// System.out.println("temp:1:" + temp);
if (temp.length()!= 8)
temp = stradd0(temp,8);
//System.out.println("temp:2:" + temp);
Send_Data = enlargechar(Send_Data, temp, 161);
}
Len_Send=8+32+5+124;
// System.out.println("Send_Data:"+Send_Data.toString());
// System.out.println("zubao hou..."+Len_Send);
//SOCKET_PACKET_180
Len_Send=180;
// System.out.println("Send_Data:"+Send_Data);
// System.out.println("Send_Data FF:"+Send_Data);
//for (int i=0; i<Send_Data.length; i++) {
//System.out.println("i:"+i+":"+Send_Data[i]);
//}
//byte a[]= getBytes(Send_Data);
StringBuffer str = new StringBuffer();
// System.out.println("size:"+Send_Data.length);
for (int i=0; i<Send_Data.length; i++) {
str.append(Send_Data[i]);
// System.out.println("i:"+i+":"+Send_Data[i]);
}
// for(int j=0;j<Send_Data.length;j++){
// if(j%10==0)
// System.out.println();
// System.out.print(Send_Data[j]);
// }
byte a[] =str.toString().getBytes("UTF-8");
byte data[] = new byte[Len_Send];
for(int i=0,j=0; i <a.length;i++){
if( a[i]== -62 ){
;
}
else{
data[j]=a[i];
j++;
}
}
if(sock_check==null){
if(m_MyLoopFlag==0) {
sock_check = testIP(ServerName1, m_port);
if(sock_check==null){
sock_check = testIP(ServerName2,m_port);
if(sock_check==null){
System.out.println("连接支付密码服务器失败!");
return 9001;
}
}
}
else{
sock_check = testIP(ServerName2,m_port);
if(sock_check==null){
sock_check = testIP(ServerName2,m_port);
if(sock_check==null){
System.out.println("连接支付密码服务器失败!");
return 9001;
}
}
}
}
sock_check.setSendBufferSize(32767);
sock_check.setReceiveBufferSize(32767);
sock_check.setSoTimeout(10000);
try {
BufferedOutputStream bos = getBufferedWriter(sock_check);
bos.write(data);
bos.flush();
byte[] rebound = new byte[Len_Send];
BufferedInputStream bis = getBufferedRead(sock_check);
int result = bis.read(rebound);
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
if (result == Len_Send) {
Recv_Data = getChars(rebound);
// for(int i=0;i<180;i++){
// System.out.println(Recv_Data[i]);
// }
// System.out.println("------");
// System.out.println(Recv_Data[42]);
// System.out.println(Recv_Data[43]);
// System.out.println(Recv_Data[44]);
// System.out.println(Recv_Data[45]);
} else {
CloseConnect_MY();
return 9003;
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("ERROR:"+e.getMessage());
return 9001;
} finally {
//System.out.println("关闭SOCK");
//CloseConnect_MY();
}
if(!(Recv_Data[42]=='0'&&Recv_Data[43]=='0'&&Recv_Data[44]=='0'&&Recv_Data[45]=='0')){
if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='2')
return (9007);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='3') {
System.out.println("ERROR-NO");
return (9008);
}
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='9')
return (9009);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='4')
return (9010);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='1')
return(9005);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='5')
return(9012);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='6')
return(9004);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='1'&&Recv_Data[45]=='0')
return(9014);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='1'&&Recv_Data[45]=='1')
return(9013);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='1'&&Recv_Data[45]=='2')
return(9015);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='1'&&Recv_Data[45]=='3')
return(9016);
else
return (9010);
}
// System.out.println("Recv_Data:"+Recv_Data);
// System.out.println(TransactType);
if(TransactType%2 == 0)
{
StringBuffer temp1 = new StringBuffer();
for (int i=46; i<54; i++) {
temp1.append(Recv_Data[i]);
}
temp = temp1.toString();
Long iCipherValue;
//ding_System.out.println("temp:"+temp);
iCipherValue = Long.parseLong(temp, 16);
m_CipherValue = Long.toString(iCipherValue);
//如果小于10位前面补0
for(;m_CipherValue.length()<10;){
m_CipherValue = "0"+m_CipherValue;
}
// if (m_CipherValue.length()<10) {
// m_CipherValue = "0"+m_CipherValue;
// }
return 0;
}
return 0;
}
private static String stradd0(String str, int n) {
StringBuffer so = new StringBuffer();
for (int i = 0; i < (n - str.length()); i++) {
so.append("0");
}
so.append(str);
str = so.toString();
return str;
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
// System.out.println("hello");
// Long x;
// x = Long.parseLong("3663412897");
//
// String str = Long.toHexString(x);
// str = DraftEncrypt.stradd0(str, 8).toUpperCase();
// System.out.println(str.substring(0, 8));
//
// String q = "DA5B3EA1";
// Long qq = Long.parseLong(q, 16);
// System.out.println(qq);
// DraftEncrypt de = new DraftEncrypt();
// int ret = de.DraftEncrypt(0, (char) 0x03, "20120825", "10000176", "000000000004400",
// "001410122012", "001000000016", "", "", "192.168.1.212", "192.168.1.212", 100);
// System.out.println("ret="+ret+" IP:"+de.ServerName1+", "+de.getCipherValue());
}
}

View File

@ -0,0 +1,197 @@
package com.sunyard.encrypt;
import java.io.IOException;
import com.sunyard.encrypt.DraftEncrypt;
public class Test {
/**
* @param args
* @throws IOException
*/
private static char[] getSerialNo(String s){
char hex[] =new char[8];
char ch ;
for(int i=0;i<s.length();i++){
ch=s.charAt(i);
if(ch>='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 static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
/*****************************************************************************
DraftEncrypt:编核押函数
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)
参数说明
TransactType处理类型2k编押 2k+1核押
(k = 0,只有一种密钥适用于密押机I型)
k为整数0k9,代表10种密钥类型适用于密押机II型)
YwType 业务种类(0x01,0x02,0x03,0x04,0x05)
(0x01=现金汇票,0x02=可转转帐汇票,
0x03=不可转转帐汇票,0x04=查复书业务,0x05=划款业务)
Date 签票日期(例如"19990101")
SerialNo 汇票号码(8位"12345678"或16位1234567812345678)
Amount 金额 (单位为分,不含小数点,不足15位前补'0')
SendNode 签发网点号(例如"000000123456") 不足12位前补'0'
RecvNode 兑付网点号若无则全填'0'
划款业务时必须为904290099992
OtherInfo 前四个字节为查复书编号其余全填0x00若无则全填0x00
例如12345678压缩成四个字节为0x12,0x34,0x56,0x78
不足8位前补零例如12345压缩成四个字节为0x00,0x01,0x23,0x45
CipherValue密押
编押时出口值为计算出的密押
核押时入口值为需核验的密押
My_IPAdress1: IP地址1
My_IPAdress2: IP地址2
TimeOut 超时时间
编押时通过类的函数接口getCipherValue() 返回一个String的字符串
核押时入口值为需核验的密押
函数返回值
0 表示处理正常编押时密押在CipherValue字段返回核押表示密押核验正确 .
>0密押系统正常但要素或密押中含有非法值或者密押错误通讯错误等 .
错误代码
9001 联机错误
9002 发送错误
9003 接收错误
9004 编押错误
9005 核押错误
9006 核对签名错误
9007 发报行标识错误
9008 收报行标识错误
9009 加密卡处理异常
9010 数据报文错误
9011 网络通信超时
9012 发报行无编押权限
9013 密钥不存在
9014 兑付行号错误,当业务为划款业务时如果兑付行号不为904290099992时返回该错误
9015 密钥过期
9016 金额格式错误
*/
//编押返回值为0说明编押正常且可以通过getCipherValue()获得密押
int TransactType =3;
char YwType =(char)0x04;
String Date = "20020422";
String SerialNo = "9934567812345678";
String Amount = "000000000000100";
String SendNode = "001420100008";
String RecvNode = "001420101021";
String OtherInfo = "99999999";
String CipherValue = "0000000000";
String My_IPAdress1 = "172.16.8.113";
String My_IPAdress2 = "172.16.8.113";
int TimeOut = 100;
if(TransactType%2 == 1)
{
CipherValue = "3979564876";//核押需要输入
}
if(OtherInfo.length()>=8){
char[] hex1=getSerialNo(OtherInfo);
String ssss = "";
for(int i=0;i<4;i++){
ssss=ssss+hex1[i];
}
OtherInfo=ssss;
}//查复书时压缩字符串
DraftEncrypt de = new DraftEncrypt();
int ret = de.DraftEncrypt(TransactType,YwType,Date,SerialNo,Amount,
SendNode, RecvNode,OtherInfo,CipherValue,My_IPAdress1,My_IPAdress2,TimeOut);
/*int ret = de.DraftEncrypt(0, (char) 0x04, "20020422", "9934567812345678", "00000000.0000100",
"001420100008", "001420101021", "99999999", "2448307857",//可以随意输入一个字符
"172.16.8.113", "172.16.8.113", 100);*/
if(TransactType%2 == 0)
{
CipherValue = de.getCipherValue();//只有编押时需要调用
}
//核押返回值为0,说明通过其他返回值见说明
/* DraftEncrypt de = new DraftEncrypt();
int ret = de.DraftEncrypt(0, (char) 0x01, "20020422", "10000000", "000000000000100",
"001420100008", "001420101021", "", "096711466",
"192.168.1.212", "192.168.1.212", 100);
*/
switch(ret){
case 0:
if(TransactType%2 == 0)
System.out.println("编押正常,密押是:"+CipherValue);
else
System.out.println("核押正常");
break;
case 9001:
System.out.println("联机错误");
break;
case 9002:
System.out.println("发送错误");
break;
case 9003:
System.out.println("接收错误 ");
break;
case 9004:
System.out.println("加押错误");
break;
case 9005:
System.out.println("核押错误");
break;
case 9006:
System.out.println("核对签名错误");
break;
case 9007:
System.out.println("发报行标识错误");
break;
case 9008:
System.out.println("收报行标识错误");
break;
case 9009:
System.out.println("加密卡处理异常");
break;
case 9010:
System.out.println("数据报文错误");
break;
case 9011:
System.out.println("网络通信超时");
break;
case 9012:
System.out.println("发报行无编押权限");
break;
case 9013:
System.out.println("密钥不存在");
break;
case 9014:
System.out.println("兑付行号错误");
break;
case 9015:
System.out.println("密钥过期");
break;
case 9016:
System.out.println("金额格式错误");
break;
}
}
}

View File

@ -0,0 +1,655 @@
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<byteOther.length;i++){
System.out.println("jjjjj"+byteOther[i]+"ijjjj");
}
OtherInfo = new String(byteOther);*/
if(OtherInfo.length()>=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<s.length();i++){
ch=s.charAt(i);
if(ch>='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;i<hex.length;i++){
ss=ss+hex[i];
}
SerialNo=ss;
}else{
s =16000+TransactType;
}
Send_Data = enlargechar(Send_Data, s+"", 40);
// int s =16000+TransactType;
// Send_Data = enlargechar(Send_Data, s+"", 40);
// if(TransactType==0)
// Send_Data = enlargechar(Send_Data, "16000", 40);
//// memcpy(Send_Data+8+32,"16000",5);
// else if(TransactType==1)
// Send_Data = enlargechar(Send_Data, "16001", 40);
//// memcpy(Send_Data+8+32,"16001",5);
// else
// Send_Data = enlargechar(Send_Data, "16002", 40);
//// memcpy(Send_Data+8+32,"16002",5);
// memcpy(Send_Data+8+32+5,&YwType,1);
Send_Data[45] = YwType;
// memcpy(Send_Data+8+32+6,Date,8);
Send_Data = enlargechar(Send_Data, Date, 46);
// memcpy(Send_Data+8+32+14,SerialNo,8);
Send_Data = enlargechar(Send_Data, SerialNo, 54);
// memcpy(Send_Data+8+32+22,Amount,15);
Send_Data = enlargechar(Send_Data, Amount, 62);
// Len_No=strlen(SendNode);
// if(Len_No>12)
// 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<hex.length;i++){
// ss=ss+hex[i];
// }
// SerialNo=ss;
// }
/*else
{
StringBuffer ddbuf = new StringBuffer();
int ddlen = OtherInfo.length();
int ddtmp = 8 - ddlen ;
for(int i=0;i<ddtmp;i++){
ddbuf.append("0");
}
ddbuf.append(OtherInfo);
String sss = ddbuf.toString() ;
OtherInfo = sss;
char[] hex1=getSerialNo(OtherInfo);
String ss = "";
for(int i=0;i<OtherInfo.length()/2+1;i++){
ss=ss+hex1[i];
}
OtherInfo=ss;
}*/
//ding
Send_Data = enlargechar(Send_Data, OtherInfo, 101);
if(TransactType%2==1)
{
Long value;
value = Long.parseLong(CipherValue);
temp = Long.toHexString(value).toUpperCase();
// System.out.println("temp:1:" + temp);
if (temp.length()!= 8)
temp = stradd0(temp,8);
//System.out.println("temp:2:" + temp);
Send_Data = enlargechar(Send_Data, temp, 161);
}
Len_Send=8+32+5+124;
// System.out.println("Send_Data:"+Send_Data.toString());
// System.out.println("zubao hou..."+Len_Send);
//SOCKET_PACKET_180
Len_Send=180;
// System.out.println("Send_Data:"+Send_Data);
// System.out.println("Send_Data FF:"+Send_Data);
//for (int i=0; i<Send_Data.length; i++) {
//System.out.println("i:"+i+":"+Send_Data[i]);
//}
//byte a[]= getBytes(Send_Data);
StringBuffer str = new StringBuffer();
// System.out.println("size:"+Send_Data.length);
for (int i=0; i<Send_Data.length; i++) {
str.append(Send_Data[i]);
// System.out.println("i:"+i+":"+Send_Data[i]);
}
// for(int j=0;j<Send_Data.length;j++){
// if(j%10==0)
// System.out.println();
// System.out.print(Send_Data[j]);
// }
byte a[] =str.toString().getBytes("UTF-8");
/*System.out.println(a.length);
System.out.println(new String(a));*/
byte data[] = new byte[Len_Send];
for(int i=0,j=0; i <a.length;i++){
if( a[i]== -62 ){
System.out.println(i);
;
}
else{
data[j]=a[i];
j++;
}
}
if(sock_check==null){
if(m_MyLoopFlag==0) {
sock_check = testIP(ServerName1, m_port);
if(sock_check==null){
sock_check = testIP(ServerName2,m_port);
if(sock_check==null){
System.out.println("连接支付密码服务器失败!");
return 9001;
}
}
}
else{
sock_check = testIP(ServerName2,m_port);
if(sock_check==null){
sock_check = testIP(ServerName2,m_port);
if(sock_check==null){
System.out.println("连接支付密码服务器失败!");
return 9001;
}
}
}
}
sock_check.setSendBufferSize(32767);
sock_check.setReceiveBufferSize(32767);
sock_check.setSoTimeout(10000);
try {
BufferedOutputStream bos = getBufferedWriter(sock_check);
System.out.println(BytesToString(data));
bos.write(data);
bos.flush();
byte[] rebound = new byte[Len_Send];
BufferedInputStream bis = getBufferedRead(sock_check);
int result = bis.read(rebound);
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
if (result == Len_Send) {
Recv_Data = getChars(rebound);
// for(int i=0;i<180;i++){
// System.out.println(Recv_Data[i]);
// }
// System.out.println("------");
// System.out.println(Recv_Data[42]);
// System.out.println(Recv_Data[43]);
// System.out.println(Recv_Data[44]);
// System.out.println(Recv_Data[45]);
} else {
CloseConnect_MY();
return 9003;
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("ERROR:"+e.getMessage());
return 9001;
} finally {
//System.out.println("关闭SOCK");
//CloseConnect_MY();
}
if(!(Recv_Data[42]=='0'&&Recv_Data[43]=='0'&&Recv_Data[44]=='0'&&Recv_Data[45]=='0')){
if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='2')
return (9007);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='3') {
System.out.println("ERROR-NO");
return (9008);
}
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='9')
return (9009);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='4')
return (9010);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='1')
return(9005);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='5')
return(9012);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='0'&&Recv_Data[45]=='6')
return(9004);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='1'&&Recv_Data[45]=='0')
return(9014);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='1'&&Recv_Data[45]=='1')
return(9013);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='1'&&Recv_Data[45]=='2')
return(9015);
else if(Recv_Data[42]=='0'&&Recv_Data[43]=='3'&&Recv_Data[44]=='1'&&Recv_Data[45]=='3')
return(9016);
else
return (9010);
}
// System.out.println("Recv_Data:"+Recv_Data);
// System.out.println(TransactType);
if(TransactType%2 == 0)
{
StringBuffer temp1 = new StringBuffer();
for (int i=46; i<54; i++) {
temp1.append(Recv_Data[i]);
}
temp = temp1.toString();
Long iCipherValue;
//ding_System.out.println("temp:"+temp);
iCipherValue = Long.parseLong(temp, 16);
m_CipherValue = Long.toString(iCipherValue);
//如果小于10位前面补0
for(;m_CipherValue.length()<10;){
m_CipherValue = "0"+m_CipherValue;
}
// if (m_CipherValue.length()<10) {
// m_CipherValue = "0"+m_CipherValue;
// }
return 0;
}
return 0;
}
private static String stradd0(String str, int n) {
StringBuffer so = new StringBuffer();
for (int i = 0; i < (n - str.length()); i++) {
so.append("0");
}
so.append(str);
str = so.toString();
return str;
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
// System.out.println("hello");
// Long x;
// x = Long.parseLong("3663412897");
//
// String str = Long.toHexString(x);
// str = DraftEncrypt.stradd0(str, 8).toUpperCase();
// System.out.println(str.substring(0, 8));
//
// String q = "DA5B3EA1";
// Long qq = Long.parseLong(q, 16);
// System.out.println(qq);
// DraftEncrypt de = new DraftEncrypt();
// int ret = de.DraftEncrypt(0, (char) 0x03, "20120825", "10000176", "000000000004400",
// "001410122012", "001000000016", "", "", "192.168.1.212", "192.168.1.212", 100);
// System.out.println("ret="+ret+" IP:"+de.ServerName1+", "+de.getCipherValue());
}
private String addZero(String str,int lenTotal){
String strAns = str;
int len = str.length();
for(int i=0;i<lenTotal-len;i++){
strAns = strAns+"0";
}
return strAns;
}
private String BytesToString(byte[] bArray) {
if (bArray == null) {
return null;
}
if (bArray.length == 0) {
return "";
}
StringBuffer sb = new StringBuffer(bArray.length);
String sTemp;
for (int i = 0; i < bArray.length; i++) {
sTemp = Integer.toHexString(0xFF & bArray[i]);
if (sTemp.length() < 2)
sb.append(0);
sb.append(sTemp.toUpperCase());
}
return sb.toString();
}
/**
*
*
* @param data
* "00AF"
* @return 0x00, 0xAF
*/
private static byte[] StringToBytes(String data) {
String hexString = data.toUpperCase().trim();
if (hexString.length() % 2 != 0) {
return null;
}
byte[] retData = new byte[hexString.length() / 2];
for (int i = 0; i < hexString.length(); i++) {
int int_ch; // 锟斤拷位16锟斤拷锟斤拷锟斤拷转锟斤拷锟斤拷锟<EFBFBD>0锟斤拷锟斤拷锟斤拷
char hex_char1 = hexString.charAt(i); // //锟斤拷位16锟斤拷锟斤拷锟斤拷锟叫的碉拷一位(锟斤拷位*16)
int int_ch1;
if (hex_char1 >= '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;
}
}

View File

@ -0,0 +1,215 @@
package com.sunyard.encrypt;
import java.io.IOException;
import com.sunyard.encrypt.DraftEncrypt;
public class Test {
/**
* @param args
* @throws IOException
*/
private static char[] getSerialNo(String s){
char hex[] =new char[8];
char ch ;
for(int i=0;i<s.length();i++){
ch=s.charAt(i);
if(ch>='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 static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
/*****************************************************************************
DraftEncrypt:编核押函数
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)
参数说明
TransactType处理类型2k编押 2k+1核押
(k = 0,只有一种密钥适用于密押机I型)
k为整数0k9,代表10种密钥类型适用于密押机II型)
YwType 业务种类(0x01,0x02,0x03,0x04,0x05)
(0x01=现金汇票,0x02=可转转帐汇票,
0x03=不可转转帐汇票,0x04=查复书业务,0x05=划款业务)
Date 签票日期(例如"19990101")
SerialNo 汇票号码(8位"12345678"或16位1234567812345678)
Amount 金额 (单位为分,不含小数点,不足15位前补'0')
SendNode 签发网点号(例如"000000123456") 不足12位前补'0'
RecvNode 兑付网点号若无则全填'0'
划款业务时必须为904290099992
OtherInfo 前四个字节为查复书编号其余全填0x00若无则全填0x00
例如12345678压缩成四个字节为0x12,0x34,0x56,0x78
不足8位前补零例如12345压缩成四个字节为0x00,0x01,0x23,0x45
CipherValue密押
编押时出口值为计算出的密押
核押时入口值为需核验的密押
My_IPAdress1: IP地址1
My_IPAdress2: IP地址2
TimeOut 超时时间
编押时通过类的函数接口getCipherValue() 返回一个String的字符串
核押时入口值为需核验的密押
函数返回值
0 表示处理正常编押时密押在CipherValue字段返回核押表示密押核验正确 .
>0密押系统正常但要素或密押中含有非法值或者密押错误通讯错误等 .
错误代码
9001 联机错误
9002 发送错误
9003 接收错误
9004 编押错误
9005 核押错误
9006 核对签名错误
9007 发报行标识错误
9008 收报行标识错误
9009 加密卡处理异常
9010 数据报文错误
9011 网络通信超时
9012 发报行无编押权限
9013 密钥不存在
9014 兑付行号错误,当业务为划款业务时如果兑付行号不为904290099992时返回该错误
9015 密钥过期
9016 金额格式错误
*/
//编押返回值为0说明编押正常且可以通过getCipherValue()获得密押
/* int TransactType =3;
char YwType =(char)0x02;
String Date = "20151020";
String SerialNo = "9040004122999001";
String Amount = "000000000550000";
String SendNode = "213162000019";
String RecvNode = "000000000000";
String OtherInfo = "0x00";
String CipherValue = "0740128292";
String My_IPAdress1 = "192.168.1.10";
String My_IPAdress2 = "172.16.8.113";*/
int TransactType =0;
char YwType =(char)0x2;
String Date = "20151020";
String SerialNo = "12345678";
String Amount = "000000000000100";
String SendNode = "123456123456";
String RecvNode = "904290099992";
String OtherInfo = "123";
String CipherValue = "1160747148";
String My_IPAdress1 = "192.168.1.10";
String My_IPAdress2 = "172.16.8.113";
int TimeOut = 100;
/*if(TransactType%2 == 1)
{
CipherValue = "3979564876";//核押需要输入
}*/
/*if(OtherInfo.length()>=8){
char[] hex1=getSerialNo(OtherInfo);
System.out.println(hex1);
String ssss = "";
for(int i=0;i<4;i++){
ssss=ssss+hex1[i];
}
OtherInfo=ssss;
}*///查复书时压缩字符串
/* for(int i =0 ;i<OtherInfo.length();i++){
int a = OtherInfo.charAt(i);
System.out.println("jjjjj"+a+"ijjjj");
}*/
DraftEncrypt de = new DraftEncrypt();
int ret = de.DraftEncrypt(TransactType,YwType,Date,SerialNo,Amount,
SendNode, RecvNode,OtherInfo,CipherValue,My_IPAdress1,My_IPAdress2,TimeOut);
/*int ret = de.DraftEncrypt(0, (char) 0x04, "20020422", "9934567812345678", "00000000.0000100",
"001420100008", "001420101021", "99999999", "2448307857",//可以随意输入一个字符
"172.16.8.113", "172.16.8.113", 100);*/
if(TransactType%2 == 0)
{
CipherValue = de.getCipherValue();//只有编押时需要调用
}
//核押返回值为0,说明通过其他返回值见说明
/* DraftEncrypt de = new DraftEncrypt();
int ret = de.DraftEncrypt(0, (char) 0x01, "20020422", "10000000", "000000000000100",
"001420100008", "001420101021", "", "096711466",
"192.168.1.212", "192.168.1.212", 100);
*/
switch(ret){
case 0:
if(TransactType%2 == 0)
System.out.println("编押正常,密押是:"+CipherValue);
else
System.out.println("核押正常");
break;
case 9001:
System.out.println("联机错误");
break;
case 9002:
System.out.println("发送错误");
break;
case 9003:
System.out.println("接收错误 ");
break;
case 9004:
System.out.println("加押错误");
break;
case 9005:
System.out.println("核押错误");
break;
case 9006:
System.out.println("核对签名错误");
break;
case 9007:
System.out.println("发报行标识错误");
break;
case 9008:
System.out.println("收报行标识错误");
break;
case 9009:
System.out.println("加密卡处理异常");
break;
case 9010:
System.out.println("数据报文错误");
break;
case 9011:
System.out.println("网络通信超时");
break;
case 9012:
System.out.println("发报行无编押权限");
break;
case 9013:
System.out.println("密钥不存在");
break;
case 9014:
System.out.println("兑付行号错误");
break;
case 9015:
System.out.println("密钥过期");
break;
case 9016:
System.out.println("金额格式错误");
break;
}
}
}