PasswordEncrypted

本文介绍了一种基于金融数据加密机的银行卡PIN加解密方法,包括旧版和新版的加解密流程,涉及与加密机的通信交互、密钥管理和数据格式转换等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*PB3.0系统自动生成demo源码文件*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <string.h>
#include <signal.h>
#include <setjmp.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <dirent.h>
#include <ctype.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>

#include "pbconstval.h"
#include "pberrlog.h"
#include "pbstructdef.h"
#include "atmi.h"   /* TUXEDO  Header File */
#include "stdarg.h"

EXEC SQL INCLUDE "pbdbfunc.h";
    
void hex2str1( char *sSrc,  char *sDest, int nSrcLen );
void str2hex1( char *sSrc, char *sDest, int nSrcLen );
    
/**
    * 解密
    * input:
    * pinblock 16位ASCII(8位16进制数), 0x44 ,0x33 ... (2位变4位 4433)
    * acc19 19位ascii账号
    * output:
    * mingwen 16位明文
    * return: 0-成功;<0-失败
*/  
int Data_decry(char* pinblock,char *acc19,char *mingwen)
{       
    
    EXEC SQL BEGIN DECLARE SECTION;
        char note1[256+1];  
        char pik[32+1]; 
    EXEC SQL END DECLARE SECTION;
    
    int i,len,len1,len2,iret=-1,iret1;
    char ip[15+1];
    char port[6+1];
    char index[4+1];
    char piklen[2+1];
    char acc12[16+1];
    char in[100+1];
    unsigned char hin[100+1];

    char out[50+1];
    unsigned char hout[50+1];

    char *p,*p1;
    char mingwen1[50+1];
    char mingwen2[50+1];
    char mingwen3[50+1];


    memset(ip,0x00,sizeof(ip));
    memset(port,0x00,sizeof(port));
    memset(index,0x00,sizeof(index));
    memset(piklen,0x00,sizeof(piklen));
    memset(pik,0x00,sizeof(pik));

    memset(acc12,0x00,sizeof(acc12));

    memset(in,0x00,sizeof(in));
    memset(hin,0x00,sizeof(hin));
    memset(out,0x00,sizeof(out));
    memset(hout,0x00,sizeof(hout));

    len=strlen(acc19);
    if(len!=19){
        WriteLog(ERR_LVL,"acc19 is not 19 length![%d]",len);
        return iret;
    }

    len=strlen(pinblock);
    if(len!=16){
        WriteLog(ERR_LVL,"pinblock is not 16 length![%d]",len);
        return iret;
    }

    iret1=str12right2left(acc19,acc12,12,1);
    if(iret1!=0){
        WriteLog(ERR_LVL,"acc19 transfor acc12 fail![%d]",iret1);
        return iret;
    }

    EXEC SQL SELECT NOTE1,secretkey into :note1,:pik
    FROM    t_pb_busi_sys_cfg
    WHERE   areano="000000"
    AND     chnlno="001"
    AND     busitype="001";
    if(SQLCODE!=0)
    {
        WriteLog(ERR_LVL,"select note1 from t_pb_busi_sys_cfg err![%s][%ld]!",SQLMSG,SQLCODE);
        return iret;
    }

    trim(note1);
/* note1组成:
    ip:port:加密机索引:pik长度:pik 参考文档:SJL05金融数据加密机程序员手册.doc 解密PIN<0x0422>
    sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen,pik);
*/  
    sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen);
    
    trim(ip);
    trim(port);
    trim(index);
    trim(piklen);
    if(strlen(ip)==0)
    {
        WriteLog(ERR_LVL,"ip err![%s][%d]!",ip,strlen(ip));
        return iret;
    }
    if(strlen(port)==0)
    {
        WriteLog(ERR_LVL,"port err![%s][%d]!",port,strlen(port));
        return iret;
    }
    if(strlen(index)==0)
    {
        WriteLog(ERR_LVL,"index err![%s][%d]!",index,strlen(index));
        return iret;
    }
    if(strlen(piklen)==0)
    {   
        WriteLog(ERR_LVL,"piklen err![%s][%d]!",piklen,strlen(piklen));
        return iret;
    }
    trim(pik);
    if(strlen(pik)==0)
    {   
        WriteLog(ERR_LVL,"pik err![%s][%d]!",pik,strlen(pik));
        return iret;
    }
    
    
    //拼接数据
    sprintf(in,"%s","0422");
    p=strcat(in,index);
    p=strcat(in,pinblock);
    p=strcat(in,acc12);
    p=strcat(in,piklen);
    p=strcat(in,pik);
    
    iret1=str2hex(in,hin,strlen(in));
    if(iret1!=0)
    {
        WriteLog(ERR_LVL,"in transfor hin fail![%s][%d]!",in,iret1);
        return iret;
    }
    iret1=sendrecv((strlen(in)/2+strlen(in)%2),hin,hout,ip,port);
    if(iret1!=0)
    {
        WriteLog(ERR_LVL,"sendrecv fail![%d]",iret1);
        return iret;
    }
    p1=&mingwen1[0];
    iret1=hex2str(hout,&p1,9);
    p1=mingwen1;
    memset(mingwen2,0x00,sizeof(mingwen2));
    memset(mingwen3,0x00,sizeof(mingwen3));

    WriteLog(ERR_LVL,"[%s]!",mingwen1);

    memcpy( mingwen2,mingwen1+2,2);
    memcpy( mingwen3,mingwen1+4,atoi(mingwen2));

    memcpy(mingwen,mingwen3,strlen(mingwen3));

    return 0;
}
/**
    * 加密
    * input:
    * mingwen 6位明文
    * acc19 19位ascii账号
    * output:
    * pinblock 16位ASCII(8位16进制数), 0x44 ,0x33 ... (2位变4位 4433)
    * return: 0-成功;<0-失败
*/
int Data_encry(char* pinblock,char *acc19,char *mingwen){
    EXEC SQL BEGIN DECLARE SECTION;
    char note1[256+1];
    char pik[32+1];
    EXEC SQL END DECLARE SECTION;

    int len,len1,len2,iret=-1,iret1;
    char ip[15+1];
    char port[6+1];
    char index[4+1];
    char piklen[2+1];
    char acc12[16+1];
    char acc[19+1];

    char in[100+1];
    unsigned char hin[100+1];

    char out[50+1];
    unsigned char hout[50+1];

    char *p,*p1;
    char mingwen0[50+1];
    char mingwen1[50+1];
    char mingwen2[50+1];
    char mingwen3[50+1];
    
        
    memset(ip,0x00,sizeof(ip));
    memset(port,0x00,sizeof(port));
    memset(index,0x00,sizeof(index));
    memset(piklen,0x00,sizeof(piklen));
    memset(pik,0x00,sizeof(pik));
    
    memset(acc12,0x00,sizeof(acc12));

    memset(in,0x00,sizeof(in));
    memset(hin,0x00,sizeof(hin));
    memset(out,0x00,sizeof(out));
    memset(hout,0x00,sizeof(hout));

    len=strlen(acc19);
    if(len!=19){
        WriteLog(ERR_LVL,"acc19 is not 19 length![%d]",len);
        return iret;
    }

    len=strlen(mingwen);
    if(len!=6){
        WriteLog(ERR_LVL,"mingwen is not 6 length![%d]",len);
        return iret;
    } 
    
    memset(acc,0x00,sizeof(acc));
    memcpy(acc,acc19,strlen(acc19));
    memset(mingwen0,0x00,sizeof(mingwen0));
    memcpy(mingwen0,mingwen,strlen(mingwen));
    memset(mingwen1,0x00,sizeof(mingwen1));
    
    getPinBlock98(mingwen0,acc,mingwen1);
    WriteLog(ERR_LVL,"getPinBlock98 is [%s]",mingwen1);
    
    EXEC SQL SELECT NOTE1,secretkey into :note1,:pik
    FROM    t_pb_busi_sys_cfg
    WHERE   areano="000000"
    AND     chnlno="001"
    AND     busitype="001";
    if(SQLCODE!=0){
        WriteLog(ERR_LVL,"select note1 from t_pb_busi_sys_cfg err![%s][%ld]!",SQLMSG,SQLCODE);
        return iret;
    }

    trim(note1);
/* note1组成:
    ip:port:加密机索引:pik长度:pik 参考文档:SJL05金融数据加密机程序员手册.doc 解密PIN<0x0422>
    sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen,pik);
*/  
    sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen);
    trim(ip);
    trim(port);
    trim(index);
    trim(piklen);
    if(strlen(ip)==0){
        WriteLog(ERR_LVL,"ip err![%s][%d]!",ip,strlen(ip));
        return iret;
    }
    if(strlen(port)==0){
        WriteLog(ERR_LVL,"port err![%s][%d]!",port,strlen(port));
        return iret;
    }
    if(strlen(index)==0){
        WriteLog(ERR_LVL,"index err![%s][%d]!",index,strlen(index));
        return iret;
    }
    if(strlen(piklen)==0){
        WriteLog(ERR_LVL,"piklen err![%s][%d]!",piklen,strlen(piklen));
        return iret;
    }
    trim(pik);
    if(strlen(pik)==0){
        WriteLog(ERR_LVL,"pik err![%s][%d]!",pik,strlen(pik));
        return iret;
    }


    //拼接数据
    sprintf(in,"%s","0405");
    p=strcat(in,index);
    p=strcat(in,"01");
    p=strcat(in,piklen);
    p=strcat(in,pik);
    p=strcat(in,mingwen1);

    iret1=str2hex(in,hin,strlen(in));
    if(iret1!=0){
        WriteLog(ERR_LVL,"in transfor hin fail![%s][%d]!",in,iret1);
        return iret;
    }

    iret1=sendrecv((strlen(in)/2+strlen(in)%2),hin,hout,ip,port);
    if(iret1!=0){
        WriteLog(ERR_LVL,"sendrecv fail![%d]",iret1);
        return iret;
    }
    memset(mingwen2,0x00,sizeof(mingwen2));
    p1=&mingwen2[0];
    hex2str(hout,&p1,9);
    p1=mingwen2;
    memset(mingwen3,0x00,sizeof(mingwen3));

    WriteLog(ERR_LVL,"[%s]!",mingwen2);
    memcpy( mingwen3,mingwen2+2,strlen(mingwen2)-2);
    
    memcpy(pinblock,mingwen3,strlen(mingwen3));
    
    return 0;
}       
        
/** 
    * 解密
    * input:
    * pinblock 16位ASCII(8位16进制数), 0x44 ,0x33 ... (2位变4位 4433)
    * acc19 19位ascii账号
    * output:
    * mingwen 6位明文
    * return: 0-成功;<0-失败
*/  
int Data_decry_new(char* pinblock,char *acc19,char *mingwen){
        
    EXEC SQL BEGIN DECLARE SECTION;
        char note1[256+1];
        char pik[100+1];
    EXEC SQL END DECLARE SECTION;
        
    int i,len,len1,len2,iret=-1,iret1;
    char ip[15+1];
    char port[6+1];
    char index[4+1];
    char KeyType[3+1];
    char PINFormat[2+1];
    char piklen[2+1];  
    char acc12[16+1]; 
    char zmk[32+1]; 
    char zpk[32+1]; 
    char lzpk[32+1];    
    char scheme[1+1];
    char CheckValue[6+1];   
    
    char in[200+1];
    unsigned char hin[200+1];
    
    char out[100+1];
    unsigned char hout[100+1];
    
    char *p,*p1;
    char mingwen1[50+1];
    char mingwen2[50+1];
    char mingwen3[50+1];
    char slen[10+1];
    char slen1[10+1];
    
    
    memset(slen,0x00,sizeof(slen));
    memset(slen1,0x00,sizeof(slen1));
    memset(CheckValue,0x00,sizeof(CheckValue));
    memset(PINFormat,0x00,sizeof(PINFormat));
    memset(scheme,0x00,sizeof(scheme));
    memset(zmk,0x00,sizeof(zmk));
    memset(zpk,0x00,sizeof(zpk));
    memset(lzpk,0x00,sizeof(lzpk));
    memset(ip,0x00,sizeof(ip));
    memset(port,0x00,sizeof(port));
    memset(index,0x00,sizeof(index));
    memset(piklen,0x00,sizeof(piklen));
    memset(pik,0x00,sizeof(pik));

    memset(acc12,0x00,sizeof(acc12));

    memset(in,0x00,sizeof(in));
    memset(hin,0x00,sizeof(hin));
    memset(out,0x00,sizeof(out));
    memset(hout,0x00,sizeof(hout));

    len=strlen(acc19);
    if(len!=19){
        WriteLog(ERR_LVL,"acc19 is not 19 length![%d]",len);
        return iret;
    }

    len=strlen(pinblock);
    if(len!=16){
        WriteLog(ERR_LVL,"pinblock is not 16 length![%d]",len);
        return iret;
    }

    iret1=str12right2left1(acc19,acc12,12,1);
    if(iret1!=0){
        WriteLog(ERR_LVL,"acc19 transfor acc12 fail![%d]",iret1);
        return iret;
    }

    EXEC SQL SELECT NOTE1,secretkey into :note1,:pik
    FROM    t_pb_busi_sys_cfg
    WHERE   areano="000000"
    AND     chnlno="001"
    AND     busitype="001";
    if(SQLCODE!=0)
    {
        WriteLog(ERR_LVL,"select note1 from t_pb_busi_sys_cfg err![%s][%ld]!",SQLMSG,SQLCODE);
        return iret;
    }

    trim(note1);
/* note1组成:
    ip:port:加密机索引:pik长度:pik 参考文档:SJL05金融数据加密机程序员手册.doc 解密PIN<0x0422>
    sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen,pik);
    sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen );
    ip:port:KeyType:PINFormat:scheme
    参考文档:SJL05金融数据加密机程序员手册.doc 3.1.22   导入密钥(即密钥由ZMK保护转为LMK保护)<A6>
    3.2.3   请求转换PINBlock 从ZPK到LMK<JE>
*/  
    sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]:%[^:]",ip,port,KeyType,PINFormat,scheme );
    
    trim(scheme);
    if(strlen(scheme)==0)
    {
        WriteLog(ERR_LVL,"scheme err![%s][%d]!",scheme,strlen(scheme));
        return iret;
    }
    trim(ip);
    trim(port);
    trim(KeyType);
    trim(PINFormat);
    trim(scheme);
    if(strlen(ip)==0)
    {
        WriteLog(ERR_LVL,"ip err![%s][%d]!",ip,strlen(ip));
        return iret;
    }
    if(strlen(port)==0)
    {   
        WriteLog(ERR_LVL,"port err![%s][%d]!",port,strlen(port));
        return iret;
    }
    if(strlen(KeyType)==0)
    {   
        WriteLog(ERR_LVL,"KeyType err![%s][%d]!",KeyType,strlen(KeyType));
        return iret;
    }
    if(strlen(PINFormat)==0)
    {
        WriteLog(ERR_LVL,"PINFormat err![%s][%d]!",PINFormat,strlen(PINFormat));
        return iret;
    }
    trim(pik);
    if(strlen(pik)==0)
    {
        WriteLog(ERR_LVL,"pik err![%s][%d]!",pik,strlen(pik));
        return iret;
    }
    
    if(strcmp(scheme,"U")==0){
        sscanf(pik,"%[^:]:%[^:]:%[^:]",zmk,zpk,lzpk );
    }else{
        sscanf(pik,"%[^:]:%[^:]:%[^:]:%[^:]",zmk,zpk,lzpk,CheckValue );
        trim(CheckValue);
        if(strlen(CheckValue)==0)
        { 
            WriteLog(ERR_LVL,"CheckValue err![%s][%d]!",CheckValue,strlen(CheckValue));
            return iret;
        }
    }
    trim(zmk);
    if(strlen(zmk)==0)
    {
        WriteLog(ERR_LVL,"zmk err![%s][%d]!",zmk,strlen(zmk));
        return iret;
    }
    trim(lzpk);
    if(strlen(lzpk)==0)
    {
        WriteLog(ERR_LVL,"lzpk err![%s][%d]!",lzpk,strlen(lzpk));
        return iret;
    }
    trim(zpk);
    if(strlen(zpk)==0)
    {
        WriteLog(ERR_LVL,"zpk err![%s][%d]!",zpk,strlen(zpk));
        return iret;
    }

    //拼接数据
//A6
/*
    sprintf(in,"%s","A6");
    p=strcat(in,KeyType);
    p=strcat(in,scheme);
    p=strcat(in,zmk);
    p=strcat(in,scheme);
    p=strcat(in,zpk);
    p=strcat(in,scheme);
    if(strcmp(scheme,"U")==0){
    }else{
        p=strcat(in,";");
        p=strcat(in,CheckValue);
    }
    len=strlen(in);
    sprintf(slen,"%04x",len);

    iret1=str2hex(slen,slen1,strlen(slen));
    if(iret1!=0)
    {
        WriteLog(ERR_LVL,"slen transfor slen1 fail![%s][%d]!",slen,iret1);
        return iret;
    }
    memcpy(hin,slen1,2);
    memcpy(hin+2,in,len);
    iret1=sendrecv1((len+2),hin,hout,ip,port);
    if(iret1!=0)
    {
        WriteLog(ERR_LVL,"A6 sendrecv fail![%d]",iret1);
        return iret;
    }

    memset(slen,0x00,sizeof(slen));
    memset(slen1,0x00,sizeof(slen1));
    memcpy(slen,hout,2);
    p1=&slen1[0];
    iret1=hex2str(slen,&p1,2);
    p1=slen1;
        
    len=hex2int(slen1);
    memset(out,0x00,sizeof(out));
    memcpy(out,hout+2,len);
    if(memcmp(out,"A7",2)!=0){
        WriteLog(ERR_LVL,"A6 导入密钥(即密钥由ZMK保护转为LMK保护)<A6>  fail![%s]",out);
        return iret;
    }
    if(memcmp(out+2,"12",2)==0){
        WriteLog(ERR_LVL,"A6 导入密钥(即密钥由ZMK保护转为LMK保护)<A6>  fail 用户存储区中无密钥 ![%s]",out);
    }
    if(memcmp(out+2,"13",2)==0){
        WriteLog(ERR_LVL,"A6 导入密钥(即密钥由ZMK保护转为LMK保护)<A6>  fail!本地主密钥错[%s]",out);
    }
    if(memcmp(out+2,"15",2)==0){
        WriteLog(ERR_LVL,"A6 导入密钥(即密钥由ZMK保护转为LMK保护)<A6>  fail!输入数据错误[%s]",out);
    }
    if(memcmp(out+2,"21",2)==0){
        WriteLog(ERR_LVL,"A6 导入密钥(即密钥由ZMK保护转为LMK保护)<A6>  fail!无效的用户存储区索引[%s]",out);
    }
    if(memcmp(out+2,"00",2)!=0){
        WriteLog(ERR_LVL,"A6 导入密钥(即密钥由ZMK保护转为LMK保护)<A6>  fail![%s]",out);
        return iret;
    }
*/  
    //拼接数据
//JE
    memset(in,0x00,sizeof(in));
    memset(hin,0x00,sizeof(hin));
    memset(slen,0x00,sizeof(slen));
    memset(slen1,0x00,sizeof(slen1));
    memset(hout,0x00,sizeof(hout));
    sprintf(in,"%s","JE");
    p=strcat(in,scheme);
    p=strcat(in,lzpk);
    p=strcat(in,pinblock);
    p=strcat(in,PINFormat);
    p=strcat(in,acc12);
    
    len=strlen(in); 
    sprintf(slen,"%04x",len);
    
    iret1=str2hex(slen,slen1,strlen(slen));
    if(iret1!=0)
    {   
        WriteLog(ERR_LVL,"slen transfor slen1 fail![%s][%d]!",slen,iret1);
        return iret;
    }
    memcpy(hin,slen1,2);
    memcpy(hin+2,in,len);
    iret1=sendrecv1((len+2),hin,hout,ip,port);
    if(iret1!=0)
    {
        WriteLog(ERR_LVL,"JE sendrecv fail![%d]",iret1);
        return iret;
    }

    memset(slen,0x00,sizeof(slen));
    memset(slen1,0x00,sizeof(slen1));
    memcpy(slen,hout,2);
    p1=&slen1[0];
    iret1=hex2str(slen,&p1,2);
    p1=slen1;

    len=hex2int(slen1);
    WriteLog(ERR_LVL,"slen1 =[%s]",slen1);
    WriteLog(ERR_LVL,"len =[%d]",len);
    memset(out,0x00,sizeof(out));
    memcpy(out,hout+2,len);
    if(memcmp(out,"JF",2)!=0){
        WriteLog(ERR_LVL,"JE 响应码 fail![%s]",hout);
        return iret;
    }
    if(memcmp(out+2,"12",2)==0){
        WriteLog(ERR_LVL,"JE fail!用户存储区中无密钥[%s]",out);
    }
    if(memcmp(out+2,"13",2)==0){
        WriteLog(ERR_LVL,"JE fail!本地主密钥错[%s]",out);
    }
    if(memcmp(out+2,"15",2)==0){
        WriteLog(ERR_LVL,"JE fail!输入数据错误[%s]",out);
    }
    if(memcmp(out+2,"20",2)==0){
        WriteLog(ERR_LVL,"JE fail!PINBlock错误[%s]",out);
    }
    if(memcmp(out+2,"21",2)==0){
        WriteLog(ERR_LVL,"JE fail!无效的用户存储区索引[%s]",out);
    }
    if(memcmp(out+2,"22",2)==0){
        WriteLog(ERR_LVL,"JE fail!错误的主帐号数据[%s]",out);
    }
    if(memcmp(out+2,"23",2)==0){
        WriteLog(ERR_LVL,"JE fail!错误的PINblock格式[%s]",out);
    }
    if(memcmp(out+2,"24",2)==0){
        WriteLog(ERR_LVL,"JE fail!PIN长度错误 [%s]",out);
    }
    if(memcmp(out+2,"00",2)!=0){
        WriteLog(ERR_LVL,"JE  fail![%s]",out);
        return iret;
    }

    memset(mingwen1,0x00,sizeof(mingwen1));
    memcpy(mingwen1,out+4,7);
    //拼接数据
//NG    
    memset(in,0x00,sizeof(in));
    memset(hin,0x00,sizeof(hin));
    memset(slen,0x00,sizeof(slen));
    memset(slen1,0x00,sizeof(slen1));
    memset(hout,0x00,sizeof(hout));
    sprintf(in,"%s","NG");
    p=strcat(in,acc12);
    p=strcat(in,mingwen1);
    
    len=strlen(in);
    sprintf(slen,"%04x",len);
    
    iret1=str2hex(slen,slen1,strlen(slen));
    if(iret1!=0)
    {
        WriteLog(ERR_LVL,"slen transfor slen1 fail![%s][%d]!",slen,iret1);
        return iret;
    }   
    memcpy(hin,slen1,2);
    memcpy(hin+2,in,len);
    iret1=sendrecv1((len+2),hin,hout,ip,port);
    if(iret1!=0)
    {
        WriteLog(ERR_LVL,"NG sendrecv fail![%d]",iret1);
        return iret;
    }
        
    memset(slen,0x00,sizeof(slen));
    memset(slen1,0x00,sizeof(slen1));
    memcpy(slen,hout,2);
    p1=&slen1[0];
    iret1=hex2str(slen,&p1,2);
    p1=slen1;
    
    len=hex2int1(slen1);
    memset(out,0x00,sizeof(out));
    memcpy(out,hout+2,len);
    if(memcmp(out,"NH",2)!=0){
        WriteLog(ERR_LVL,"NG 响应码 fail![%s]",out);
        return iret;
    }
    if(memcmp(out+2,"13",2)==0){
        WriteLog(ERR_LVL,"NG fail!本地主密钥错[%s]",out);
    }
    if(memcmp(out+2,"14",2)==0){
        WriteLog(ERR_LVL,"NG fail!输入的PIN错误[%s]",out);
    }
    if(memcmp(out+2,"15",2)==0){
        WriteLog(ERR_LVL,"NG fail!输入数据错[%s]",out);
    }
    if(memcmp(out+2,"17",2)==0){
        WriteLog(ERR_LVL,"NG fail!未授权处理明文PIN[%s]",out);
    }
    if(memcmp(out+2,"00",2)!=0){
        WriteLog(ERR_LVL,"NG  fail![%s]",out);
        return iret;
    }

    memset(mingwen1,0x00,sizeof(mingwen1));
    memcpy(mingwen1,out+4,7);

    WriteLog(ERR_LVL,"[%s]!",mingwen1);

    len=strlen(mingwen1);
    for(i=0;i<len;i++){
        if(mingwen1[i]=='F'){
            break;
        }
    }
    memcpy(mingwen,mingwen1,i);

    return 0;
}

/**
    * 加密
    * input:
    * mingwen 6位明文
    * acc19 19位ascii账号
    * output:
    * pinblock 16位ASCII(8位16进制数), 0x44 ,0x33 ... (2位变4位 4433)
    * return: 0-成功;<0-失败
*/
int Data_encry_new(char* pinblock,char *acc19,char *mingwen){

    EXEC SQL BEGIN DECLARE SECTION;
        char note1[256+1];
        char pik[100+1];
    EXEC SQL END DECLARE SECTION;

    int i,len,len1,len2,iret=-1,iret1;
    char ip[15+1];
    char port[6+1];
    char index[4+1];
    char KeyType[3+1];
    char PINFormat[2+1];
    char piklen[2+1];
    char acc12[16+1];
    char zmk[32+1];
    char zpk[32+1];
    char lzpk[32+1];
    char scheme[1+1];
    char CheckValue[6+1];
    char in[200+1];
    unsigned char hin[200+1];
    
    char out[100+1];
    unsigned char hout[100+1];
        
    char *p,*p1;
    char mingwen1[50+1];
    char mingwen2[50+1];
    char mingwen3[50+1];
    char slen[10+1];
    char slen1[10+1];

    
    memset(slen,0x00,sizeof(slen));
    memset(slen1,0x00,sizeof(slen1));
    memset(CheckValue,0x00,sizeof(CheckValue));
    memset(PINFormat,0x00,sizeof(PINFormat));
    memset(scheme,0x00,sizeof(scheme));
    memset(zmk,0x00,sizeof(zmk));
    memset(zpk,0x00,sizeof(zpk));
    memset(lzpk,0x00,sizeof(lzpk));
    memset(ip,0x00,sizeof(ip));
    memset(port,0x00,sizeof(port));
    memset(index,0x00,sizeof(index));
    memset(piklen,0x00,sizeof(piklen));
    memset(pik,0x00,sizeof(pik));
    
    memset(acc12,0x00,sizeof(acc12));
    
    memset(in,0x00,sizeof(in));
    memset(hin,0x00,sizeof(hin));
    memset(out,0x00,sizeof(out));
    memset(hout,0x00,sizeof(hout));

    len=strlen(acc19);
    if(len!=19){
        WriteLog(ERR_LVL,"acc19 is not 19 length![%d]",len);
        return iret;
    }
    
    len=strlen(mingwen);
    if(len!=6){
        WriteLog(ERR_LVL,"mingwen is not 6 length![%d]",len);
        return iret;
    }
    
    iret1=str12right2left1(acc19,acc12,12,1);
    if(iret1!=0){
        WriteLog(ERR_LVL,"acc19 transfor acc12 fail![%d]",iret1);
        return iret;
    }
    
    EXEC SQL SELECT NOTE1,secretkey into :note1,:pik
    FROM    t_pb_busi_sys_cfg
    WHERE   areano="000000"
    AND     chnlno="001"
    AND     busitype="001";
    if(SQLCODE!=0)
    {
        WriteLog(ERR_LVL,"select note1 from t_pb_busi_sys_cfg err![%s][%ld]!",SQLMSG,SQLCODE);
        return iret;
    }

    trim(note1);
/* note1组成:
    ip:port:加密机索引:pik长度:pik 参考文档:SJL05金融数据加密机程序员手册.doc 解密PIN<0x0422>
    sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen,pik);
    sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]",ip,port,index,piklen );
    ip:port:KeyType:PINFormat:scheme
    参考文档:SJL05金融数据加密机程序员手册.doc 3.1.22   导入密钥(即密钥由ZMK保护转为LMK保护)<A6>
    3.2.3   请求转换PINBlock 从ZPK到LMK<JE>
*/
    sscanf(note1,"%[^:]:%[^:]:%[^:]:%[^:]:%[^:]",ip,port,KeyType,PINFormat,scheme );

    trim(scheme);
    if(strlen(scheme)==0)
    {
        WriteLog(ERR_LVL,"scheme err![%s][%d]!",scheme,strlen(scheme));
        return iret;
    }
    trim(ip);
    trim(port);
    trim(KeyType);
    trim(PINFormat);
    trim(scheme);
    if(strlen(ip)==0)
    {
        WriteLog(ERR_LVL,"ip err![%s][%d]!",ip,strlen(ip));
        return iret;
    }
    if(strlen(port)==0)
    {
        WriteLog(ERR_LVL,"port err![%s][%d]!",port,strlen(port));
        return iret;
    }
    if(strlen(KeyType)==0)
    {
        WriteLog(ERR_LVL,"KeyType err![%s][%d]!",KeyType,strlen(KeyType));
        return iret;
    }
    if(strlen(PINFormat)==0)
    {
        WriteLog(ERR_LVL,"PINFormat err![%s][%d]!",PINFormat,strlen(PINFormat));
        return iret;
    }
    trim(pik);
    if(strlen(pik)==0)
    {
        WriteLog(ERR_LVL,"pik err![%s][%d]!",pik,strlen(pik));
        return iret;
    }
    
    if(strcmp(scheme,"U")==0){
        sscanf(pik,"%[^:]:%[^:]:%[^:]",zmk,zpk,lzpk );
    }else{
        sscanf(pik,"%[^:]:%[^:]:%[^:]:%[^:]",zmk,zpk,lzpk,CheckValue );
        trim(CheckValue);
        if(strlen(CheckValue)==0)
        { 
            WriteLog(ERR_LVL,"CheckValue err![%s][%d]!",CheckValue,strlen(CheckValue));
            return iret;
        }
    }
    trim(zmk);
    if(strlen(zmk)==0)
    {
        WriteLog(ERR_LVL,"zmk err![%s][%d]!",zmk,strlen(zmk));
        return iret;
    }
    trim(lzpk);
    if(strlen(lzpk)==0)
    {   
        WriteLog(ERR_LVL,"lzpk err![%s][%d]!",lzpk,strlen(lzpk));
        return iret;
    }
    trim(zpk);
    if(strlen(zpk)==0)
    {
        WriteLog(ERR_LVL,"zpk err![%s][%d]!",zpk,strlen(zpk));
        return iret;
    }
        
    //拼接数据 
//BA
    memset(mingwen1,0x00,sizeof(mingwen1));
    memcpy(mingwen1,mingwen,6);
    p=strcat(mingwen1,"F");
    sprintf(in,"%s","BA");
    p=strcat(in,mingwen1);
    p=strcat(in,acc12);
    
    len=strlen(in); 
    sprintf(slen,"%04x",len);
    
    iret1=str2hex(slen,slen1,strlen(slen));
    if(iret1!=0)
    {   
        WriteLog(ERR_LVL,"slen transfor slen1 fail![%s][%d]!",slen,iret1);
        return iret;
    }
    memcpy(hin,slen1,2);
    memcpy(hin+2,in,len);
    iret1=sendrecv1((len+2),hin,hout,ip,port);
    if(iret1!=0)
    {
        WriteLog(ERR_LVL,"BA sendrecv fail![%d]",iret1);
        return iret;
    }

    memset(slen,0x00,sizeof(slen));
    memset(slen1,0x00,sizeof(slen1));
    memcpy(slen,hout,2);
    p1=&slen1[0];
    iret1=hex2str(slen,&p1,2);
    p1=slen1;

    len=hex2int(slen1);
    memset(out,0x00,sizeof(out));
    memcpy(out,hout+2,len);
    if(memcmp(out,"BB",2)!=0){
        WriteLog(ERR_LVL,"BA 响应码 fail![%s]",out);
        return iret;
    }
    if(memcmp(out+2,"13",2)==0){
        WriteLog(ERR_LVL,"BA fail!本地主密钥错[%s]",out);
    }
    if(memcmp(out+2,"15",2)==0){
        WriteLog(ERR_LVL,"BA fail!输入数据错[%s]",out);
    }
    if(memcmp(out+2,"17",2)==0){
        WriteLog(ERR_LVL,"BA fail!未授权处理明文PIN[%s]",out);
    }
    if(memcmp(out+2,"00",2)!=0){
        WriteLog(ERR_LVL,"BA fail![%s]",out);
        return iret;
    }

    memset(mingwen1,0x00,sizeof(mingwen1));
    memcpy(mingwen1,out+4,7);

    //拼接数据
//JG
    memset(in,0x00,sizeof(in));
    memset(hin,0x00,sizeof(hin));
    memset(slen,0x00,sizeof(slen));
    memset(slen1,0x00,sizeof(slen1));
    memset(hout,0x00,sizeof(hout));
    sprintf(in,"%s","JG");
    p=strcat(in,scheme);
    p=strcat(in,lzpk);
    p=strcat(in,PINFormat);
    p=strcat(in,acc12);
    p=strcat(in,mingwen1);

    len=strlen(in);
    sprintf(slen,"%04x",len);
    
    iret1=str2hex(slen,slen1,strlen(slen));
    if(iret1!=0)
    {   
        WriteLog(ERR_LVL,"slen transfor slen1 fail![%s][%d]!",slen,iret1);
        return iret;
    }
    memcpy(hin,slen1,2);
    memcpy(hin+2,in,len);
    iret1=sendrecv1((len+2),hin,hout,ip,port);
    if(iret1!=0)
    {
        WriteLog(ERR_LVL,"JG sendrecv fail![%d]",iret1);
        return iret;
    }
    
    memset(slen,0x00,sizeof(slen));
    memset(slen1,0x00,sizeof(slen1));
    memcpy(slen,hout,2);
    p1=&slen1[0];
    iret1=hex2str(slen,&p1,2);
    p1=slen1;
        
    len=hex2int(slen1);
    WriteLog(ERR_LVL,"slen1 =[%s]",slen1);
    WriteLog(ERR_LVL,"len =[%d]",len);
    memset(out,0x00,sizeof(out));
    memcpy(out,hout+2,len);
    if(memcmp(out,"JH",2)!=0){
        WriteLog(ERR_LVL,"JG 响应码 fail![%s]",hout);
        return iret;
    }   
    if(memcmp(out+2,"13",2)==0){
        WriteLog(ERR_LVL,"JG fail!本地主密钥错[%s]",out);
    }
    if(memcmp(out+2,"14",2)==0){
        WriteLog(ERR_LVL,"JG fail!输入的PIN错误[%s]",out);
    }
    if(memcmp(out+2,"15",2)==0){
        WriteLog(ERR_LVL,"JG fail!输入数据错误[%s]",out);
    }
    if(memcmp(out+2,"21",2)==0){
        WriteLog(ERR_LVL,"JG fail!无效的用户存储区索引[%s]",out);
    }
    if(memcmp(out+2,"23",2)==0){
        WriteLog(ERR_LVL,"JG fail!错误的PINblock格式[%s]",out);
    }
    if(memcmp(out+2,"24",2)==0){
        WriteLog(ERR_LVL,"JG fail!PIN长度错误[%s]",out);
    }
    if(memcmp(out+2,"00",2)!=0){
        WriteLog(ERR_LVL,"JG  fail![%s]",out);
        return iret;
    }

    memset(mingwen1,0x00,sizeof(mingwen1));
    memcpy(mingwen1,out+4,16);

    WriteLog(ERR_LVL,"[%s]!",mingwen1);

    memcpy(pinblock,mingwen1,strlen(mingwen1));

    return 0;
}

/**
 * getPinBlock98
 * 标准ANSI X9.8 Format(带主帐号信息)的PIN BLOCK计算
 * PIN BLOCK 格式等于 PIN  按位异或  主帐号;
 * @in param pPin String
 * @in param pCardno String
 * @out param pPinBlock String
 * @return int
*/
int getPinBlock98(char * pPin, char * pCardno, char * pPinBlock)
{
    unsigned char arrAccno[9];
    unsigned char arrPin[9];
    unsigned char arrRet[9];
    unsigned char sAccno[17];
    unsigned char sPin[17];
    int i;

    memset(arrAccno, 0x00, sizeof(arrAccno));
    memset(arrPin, 0x00, sizeof(arrPin));
    memset(arrRet, 0x00, sizeof(arrRet));

    memset(sAccno, 0x00, sizeof(sAccno));
    str12right2left(pCardno, sAccno,12,1);
    str2hex1(sAccno, arrAccno, 16);

    memset(sPin, 0x00, sizeof(sPin));
    getHPin98(pPin, sPin);
    str2hex1(sPin, arrPin, 16);
    memset(arrRet, 0x00, sizeof(arrRet));

    //PIN BLOCK 格式等于 PIN  按位异或  主帐号;
    for (i = 0; i < 8; i++) {
      arrRet[i] = (unsigned char) (arrPin[i] ^ arrAccno[i]);
    }

    hex2str1(arrRet, pPinBlock, 8);

    return 0;
}
/**     
 * getHPin98
 * 对密码进行转换
 * PIN格式
 * BYTE 1 PIN的长度
 * BYTE 2 – BYTE 3/4/5/6/7   4--12个PIN(每个PIN占4个BIT)
 * BYTE 4/5/6/7/8 – BYTE 8   FILLER “F” (每个“F“占4个BIT)
 * @in param pin String
 * @out param pPinOut String
 * @return int
 */ 
int getHPin98(char * pin, char * pPinOut)
{
    unsigned char arrPin[7];
    unsigned char encode[9];
    unsigned char sEncode[17]; 
 
    memset(arrPin, 0x00, sizeof(arrPin));
    memcpy(arrPin, pin, 6);
 
    memset(encode, 0x00, sizeof(encode));
    encode[0] = 0x06;
    str2hex1(arrPin, (char *) &(encode[1]), 6 );
    encode[4] = 0xFF;
    encode[5] = 0xFF;
    encode[6] = 0xFF;
    encode[7] = 0xFF;
    
    hex2str1(encode, pPinOut, 8);
    
    return 0;
}   
    
void hex2str1( char *sSrc,  char *sDest, int nSrcLen )
{
    int  i;
    char szTmp[3];
    
    for( i = 0; i < nSrcLen; i++ )
    {
        sprintf( szTmp, "%02X", (unsigned char) sSrc[i] );
        memcpy( &sDest[i * 2], szTmp, 2 );
    }
    return ;
}   
    
      
void str2hex1( char *sSrc, char *sDest, int nSrcLen )
{
    int i, nHighBits, nLowBits; 

    for( i = 0; i < nSrcLen; i += 2 )
    {
        nHighBits = sSrc[i];
        nLowBits  = sSrc[i + 1];
        if( nHighBits > 0x39 )
            nHighBits -= 0x37;
        else
            nHighBits -= 0x30;

        if( i == nSrcLen - 1 )
            nLowBits = 0;
        else if( nLowBits > 0x39 )
            nLowBits -= 0x37;
        else
            nLowBits -= 0x30;

        sDest[i / 2] = (nHighBits << 4) | (nLowBits & 0x0f);
    }
    return ;
}

int sendrecv(int len, unsigned char *bufin,unsigned char *bufout,char *ip,char *port)
{
    int client_sockfd;
    int len1,iret=-1;
    struct sockaddr_in remote_addr; //服务器端网络地址结构体

    memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零
    remote_addr.sin_family=AF_INET; //设置为IP通信
    remote_addr.sin_addr.s_addr=inet_addr(ip);//服务器IP地址
    remote_addr.sin_port=htons(atoi(port)); //服务器端口号

    /*创建客户端套接字--IPv4协议,面向连接通信,TCP协议*/
    if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
    {
        WriteLog(ERR_LVL,"socket err");
        return iret;
    }

    /*将套接字绑定到服务器的网络地址上*/
    if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
    {
        WriteLog(ERR_LVL,"connect err");
        perror("connect");
        return iret;
    }
    WriteLog(ERR_LVL,"connected to server");

    len1=send(client_sockfd,bufin,len,0);
    if(len1<0){
        close(client_sockfd);//关闭套接字
        WriteLog(ERR_LVL,"send err %d",len1);
        return iret;

    }
    len1=recv(client_sockfd,bufout,BUFSIZ,0);
    if(len1<0){
        close(client_sockfd);//关闭套接字
        WriteLog(ERR_LVL,"recv err %d",len1);
        return iret;
    }   
    close(client_sockfd);//关闭套接字

    if( bufout[0] == 'E' ){
         WriteLog(ERR_LVL,"unpin err [%x]",bufout[1]);
        return iret;
    }       
        
    return 0;
}
        
int sendrecv1(int len, unsigned char *bufin,unsigned char *bufout,char *ip,char *port)
{   
    int client_sockfd;
    int len1,iret=-1;
    struct sockaddr_in remote_addr; //服务器端网络地址结构体 
 
    memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零
    remote_addr.sin_family=AF_INET; //设置为IP通信
    remote_addr.sin_addr.s_addr=inet_addr(ip);//服务器IP地址
    remote_addr.sin_port=htons(atoi(port)); //服务器端口号
      
    /*创建客户端套接字--IPv4协议,面向连接通信,TCP协议*/
    if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)   
    {  
        WriteLog(ERR_LVL,"socket err");
        return iret;  
    }
    
    /*将套接字绑定到服务器的网络地址上*/
    if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
    {
        WriteLog(ERR_LVL,"connect err");
        perror("connect");  
        return iret;  
    }
    WriteLog(ERR_LVL,"connected to server");
        
    len1=send(client_sockfd,bufin,len,0);
    if(len1<0){
        close(client_sockfd);//关闭套接字  
        WriteLog(ERR_LVL,"send err %d",len1);
        return iret;
        
    }   
    len1=recv(client_sockfd,bufout,BUFSIZ,0);
    if(len1<0){
        close(client_sockfd);//关闭套接字
        WriteLog(ERR_LVL,"recv err %d",len1);
        return iret;
    }
    close(client_sockfd);//关闭套接字
    WriteLog(ERR_LVL,"len1 = %d",len1);

/*
    if( bufout[0] == 'E' ){
         WriteLog(ERR_LVL,"unpin err [%x]",bufout[1]);
        return iret;
    }
*/

    return 0;
}

int hex2int1(char *s){
    int i=0,len,sum=0;
    char s1[1+1];

    len=strlen(s);
    for(i=0;i<len;i++){
        memset(s1,0x00,sizeof(s1));
        memcpy(s1,s+i,1);
        if(s1[0]>='0'&&s1[0]<='9')
        sum+=(atoi(s1)*powerXY(16,len-1-i));
        else if(s1[0]>='a'&&s1[0]<='z')
        sum+=((s1[0]-'a'+10)*powerXY(16,len-1-i));
        else
        sum+=((s1[0]-'A'+10)*powerXY(16,len-1-i));
    }

    return sum;
}
int powerXY(int x,int y){
    if(y==0)return 1;
    else return x*powerXY(x,y-1);
}

int hex2int(char *s){
    int i,t,sum=0;
    for(i=0;i<strlen(s);i++){
        if(s[i]<='9')t=s[i]-'0';
        else if(s[i]>='a'&&s[i]<='f')t=s[i]-'a'+10;
        else t=s[i]-'A'+10;
        sum=sum*16+t;
    }

    return sum;
}

unsigned char ascii_table[16] = {
   '0', '1', '2', '3', '4', '5', '6', '7',
   '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};

void hex2asc(unsigned char dat, unsigned char **new)
   **new = ascii_table[dat >> 4];
   *new += 1;
   **new = ascii_table[dat & 0x0f];
   *new += 1;
}        
        
int asc2hex(unsigned char dat, unsigned char *new)
{
   if ((dat >= '0') && (dat <= '9'))
      *new = dat - '0';
   else if ((dat >= 'A') && (dat <= 'F'))
      *new = dat - 'A' + 10;
   else if ((dat >= 'a') && (dat <= 'f'))
      *new = dat - 'a' + 10;
   else
      return -1;
   return 0;
}   
        
int hex2str(unsigned char *read, unsigned char **write, int len)
{       
   while (len--)
      hex2asc(*read++, write);
        
    return 0;
}       
    
int str2hex(unsigned char *read, unsigned char *write, int len)
{   
   unsigned char dat;

   while (len--) { 
      if (asc2hex(*read++, &dat))
         return -1;
      *write = *write << 4 | dat;
      if (!(len & 1)) {
         ++write;
      }
   }    
   return 0; 
}       
        
int str12right2left(unsigned char *read, unsigned char *write, int len,int begin){

    int len1=strlen(read);
    if(len1!=19)return -1;
    if(len1<begin)return -1;
    if(len1<len)return -1;
    int i=0; 
    while (len>=-3) {
        if((len-1+4)==0||(len-1+4)==1||(len-1+4)==2||(len-1+4)==3){
            write[len-1+4]='0';
        }else{
            write[len-1+4]=read[len1-1-begin-i];
        }

        len--;i++;
    }
    return 0;
}

int str12right2left1(unsigned char *read, unsigned char *write, int len,int begin){

    int len1=strlen(read);
    if(len1!=19)return -1;
    if(len1<begin)return -1;
    if(len1<len)return -1;
    int i=0;
    while (len>0) {
        write[len-1]=read[len1-1-begin-i];
        len--;i++;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值