Linux下简单模拟密钥体系加密报文

//key.c

/*************************************************************           FileName : key.c       FileFunc : 金融行业密钥体系          Version  : V0.1           Author   : Sunrier           Date     : 2012-06-23       Descp    : Linux下简单模拟密钥体系加密报文        *************************************************************/ #defineMAX128 /*假设原始报文长度是8字节的整数倍,如果不是,一般进行预处理为8的整数倍*/int main(int argc,char *argv[]){unsigned char aucOrigPacket[MAX];/*原始报文*/unsigned char aucSendPacket[MAX+2+8];/*发送报文(为原始报文经过加密的)*/unsigned char aucMacKey[8];/*MacKey工作密钥,传输密钥或过程密钥,用于交易报文的鉴别,保证数据完整性*/unsigned char aucVerifiCode[8];/*原始报文的验证码*/unsigned char aucPinKey[8];/*PinKey专门来加密卡的用户帐户和密码的(有些只对卡的密码进行加密)*/unsigned char aucMasterKey[8];/*MasterKey一般叫主密钥用来对MacKey和PinKey加密,MasterKey放在硬件里面,一般放在键盘的加密模块里面*/unsigned char aucMacKeyed[8],aucPinKeyed[8];/*用MasterKey加密后的MacKey和PinKey*/unsigned int uiI,uiJ;memset(aucOrigPacket,0,sizeof(aucOrigPacket));/*假设为原始报文报的数据*/for(uiI=0; uiI<MAX; uiI++){aucOrigPacket[uiI] = uiI;}/*使用MAC算法得到验证码,这个验证码为了让接收方确认原始数据报在网络传输过程中没有被更改过*/memset(aucMacKey,0,sizeof(aucMacKey));memcpy(aucMacKey,(unsigned char *)"/x11/x22/x33/x44/x55/x66/x77/x88",8);/*假设为MacKey*/memset(aucVerifiCode,0,sizeof(aucVerifiCode));/*使用MAC算法求原始报文的验证码*/for(uiI=0; uiI<MAX; ){if( uiI/8%2 ){des(&aucOrigPacket[uiI], aucVerifiCode, aucMacKey);}else{for(uiJ=0; uiJ<8; uiJ++){aucVerifiCode[uiJ] ^= aucOrigPacket[uiI+uiJ];}}uiI = uiI+8;}/*打印MAC算法得到的验证码*/for(uiI=0; uiI<8; uiI++){printf(" aucVerifiCode[ %d ] = 0x%02x \n",uiI,aucVerifiCode[uiI]);}/*为了防止原始数据报被截取后复制卡,一般只对原始数据报的重要数据进行加密,主要是卡的用户帐户和密码*//*这里演示只对原始数据报卡的密码进行加密*/memset(aucSendPacket,0,sizeof(aucSendPacket));for(uiI=8; uiI<14; uiI++)/*假设原始数据报文中的第8个数据中是用户卡的密码*/{aucSendPacket[uiI] = aucOrigPacket[uiI];/*获取原始数据报用户卡的6位密码*/}aucSendPacket[14] = 0xFF;/*进行预处理,补够8个字节*/aucSendPacket[15] = 0xFF;/*进行预处理,补够8个字节*/memset(aucPinKey,0,sizeof(aucPinKey));memcpy(aucPinKey,(unsigned char *)"/x66/x66/x66/x66/66/x66/x66/x66",8);/*假设为PinKey*/des(&aucSendPacket[8], &aucSendPacket[8], aucPinKey);/*使用PinKey对原始数据报的卡密码进行加密*//*aucMasterKey为明文,实际中为了防止截取一般存放在硬件里*/memset(aucMasterKey,0,sizeof(aucMasterKey));memcpy(aucMasterKey,(unsigned char *)"/x12/x34/x56/x78/9a/xbc/xde/xf0",8);memset(aucMacKeyed,0,sizeof(aucMacKeyed));memset(aucPinKeyed,0,sizeof(aucPinKeyed));des(aucMacKey, aucMacKeyed, aucMasterKey);/*使用MasterKey对MacKey进行加密*/des(aucPinKey, aucPinKeyed, aucMasterKey);/*使用MasterKey对PinKey进行加密*//*把其余原始数据报不需要加密的复制到发送数据报文中*/for(uiI=0; uiI<8; uiI++){aucSendPacket[uiI] = aucOrigPacket[uiI];}for(uiI=14; uiI<MAX; uiI++){aucSendPacket[uiI+2] = aucOrigPacket[uiI];}memcpy(&aucSendPacket[MAX+2],&aucVerifiCode,8);/*打印发送数据报文*/for(uiI=0; uiI<MAX+10; uiI++){printf(" aucSendPacket[ %d ] = 0x%02x \n",uiI,aucSendPacket[uiI]);}/*打印用MasterKey加密后的MacKey*/for(uiI=0; uiI<8; uiI++){printf(" aucMacKeyed[ %d ] = 0x%02x \n",uiI,aucMacKeyed[uiI]);}/*打印用MasterKey加密后的PinKey*/for(uiI=0; uiI<8; uiI++){printf(" aucPinKeyed[ %d ] = 0x%02x \n",uiI,aucPinKeyed[uiI]);}return 0;}

学做任何事得按部就班,急不得

Linux下简单模拟密钥体系加密报文

相关文章:

你感兴趣的文章:

标签云: