银联通信MAC算法

银联的8583通信报文,使用的mac算法总结。

void DATE_XOR1(U08 *source, U08 *dest,long size)
{
   int i;
   for(i=0; i<size; i++)
	   dest[i] ^= source[i];

   return;
}
/*
*************************************************************************************************
*  异或		   
*************************************************************************************************
*/
void DataXOR( U08 *source, U08 *dest, U32 size, U08 *out )
{
   int i;
   for( i = 0; i < size; i++ )
   { out[i] = dest[i] ^ source[i]; }
}
/*******************************************************
* 名称:获取报文MAC值		    
* 功能:报文MAC算法				 
* 入口:
*      *buf     ,要计算的数据缓冲区;buf_size,计算数据的长度
*      *key     ,密钥(8B)
* 出口:mac_buf,计算出来的MAC值(8B)
********************************************************/
void UP_Get_MAC( U08 *buf, U32 buf_size, U08 *key, U08 *mac_buf )
{														     
	U08 val[8],Abuf[8],str1[8],str2[8];	
	U08 Bbuf[16];						     //中间变量
    U08 block[512],mac[8];	
	U16 x,n;
	U16 i,j=0;
	//准备工作
	memcpy( block, buf, buf_size );                          //将输入数据赋值给临时变量block
	x = buf_size / 8; 								         //计算有多少个完整的块
	n = buf_size % 8;                                        //计算最后一个块有几个字节
	if( n != 0 )											 //y非0,则在其后补上0x00...
	{
		memset( &block[x*8+n], 0x00, 8-n );							
		x += 1;                                              //将补上的这一块加上去 
	}
	//开始运算
	memset( val, 0x00, 8 );
	for( i = 0; i < x; i++ )						         //有多少块循环多少次
	{
		DATE_XOR1(&block[j], val,8);

	    j += 8;												 //用于取下一块的数据
	}

	 sprintf( (char *)Bbuf, "%02X%02X%02X%02X%02X%02X%02X%02X", val[0],val[1],val[2],val[3],val[4],val[5],val[6],val[7]);
	 memcpy( str1, Bbuf, 8 );
	 memcpy( str2, &Bbuf[8], 8 );
	 CurCalc_DES_Encrypt(key,str1,mac);

	 DataXOR( mac, str2, 8, Abuf );	
	 CurCalc_DES_Encrypt(key,Abuf,mac);
	 memcpy(Abuf,mac,8);
	 sprintf( (char *)Bbuf, "%02X%02X%02X%02X%02X%02X%02X%02X", Abuf[0],Abuf[1],Abuf[2],Abuf[3],Abuf[4],Abuf[5],Abuf[6],Abuf[7]);
	 memcpy( mac_buf, Bbuf, 8 );		//前8位密钥结果放入mac_buf	 
}

/*******************************************************
* 名称:获取报文MAC值
* 功能:报文MAC算法
* 入口:
* *buf ,要计算的数据缓冲区;buf_size,计算数据的长度
* *key ,密钥(8B)
* 出口:mac_buf,计算出来的MAC值(8B)
ansi x9.9 MAC算法

********************************************************/
void Ansi99X_Get_MAC( U08 *buf, U32 buf_size, U08 *key, U08 *mac_buf )
{
    U08 val[8],xor[8];
    U08 block[512];
    U16 x,n;
    U16 i,j=0;
    //准备工作
	memcpy( block, buf, buf_size ); //将输入数据赋值给临时变量block
	x = buf_size / 8; //计算有多少个完整的块
	n = buf_size % 8; //计算最后一个块有几个字节
	if( n != 0 )	 //y非0,则在其后补上0x00...
	{
	    memset( &block[x*8+n], 0x00, 8-n );
	    x += 1; //将补上的这一块加上去
	}
	//开始运算
	memset( val, 0x00, 8 );
	for( i = 0; i < x; i++ )	 //有多少块循环多少次
	{
	    DataXOR(val,&block[j], 8,xor);
	    CurCalc_DES_Encrypt(key,xor,val);//DES加密
	    j += 8;	 //用于取下一块的数据
	}
	memcpy(mac_buf,val, 8 );
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特立独行的猫a

您的鼓励是我的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值